_fsopen
, _wfsopen
以檔案共用開啟資料流。
語法
FILE *_fsopen(
const char *filename,
const char *mode,
int shflag
);
FILE *_wfsopen(
const wchar_t *filename,
const wchar_t *mode,
int shflag
);
參數
filename
要開啟的檔案之名稱。
mode
允許的存取類型。
shflag
允許的共用類型。
傳回值
這些函式中每一個都會傳回資料流的指標。 null 指標值表示錯誤。 如果 filename
或 mode
為或 空NULL
字串,這些函式會叫用無效的參數處理程式,如參數驗證中所述。 如果允許繼續執行,這些函式會傳回 NULL
,並將 errno
設為 EINVAL
。
如需這些錯誤碼和其他錯誤碼的詳細資訊,請參閱errno
、 _doserrno
_sys_errlist
和 _sys_nerr
。
備註
_fsopen
函式會開啟 filename
指定的檔案做為資料流,並準備此檔案,以供共用讀取或寫入使用 (如同此模式和 shflag
引數所指定)。 _wfsopen
是 _fsopen
的寬字元版本;_wfsopen
的 filename
和 mode
引數是寬字元字串。 否則,_wfsopen
和 _fsopen
的行為即會相同。
字元字串 mode
會指定對檔案要求的存取類型,如下表所示。
詞彙 | 定義 |
---|---|
“r ” |
開啟以讀取。 如果檔案不存在或找不到,呼叫 _fsopen 就會失敗。 |
“w ” |
開啟空白檔案以寫入。 如果指定的檔案已存在,其內容將被終結。 |
“a ” |
開啟以在檔案結尾寫入 (附加):如果檔案不存在,會先建立檔案。 |
“r+ ” |
開啟以進行讀取和寫入。 (檔案必須存在)。 |
“w+ ” |
開啟空白檔案以進行讀取和寫入。 如果指定的檔案已存在,其內容將被終結。 |
“a+ ” |
開啟以進行讀取和附加;如果檔案不存在,會先建立檔案。 |
小心使用 “w
” 和 “w+
” 類型,因為它們可以終結現有的檔案。
當檔案以 「或」a
a+
存取類型開啟時,所有寫入作業都會發生在檔案結尾。 檔案指標可以使用 或 rewind
重新定位fseek
,但在執行任何寫入作業之前,一律會移回檔案的結尾。因此,無法覆寫現有的數據。 指定 “r+
”、“”w+
或 “a+
” 存取類型時,允許讀取和寫入 (據說檔案為開啟以進行更新)。 不過,在讀取和寫入之間切換時,必須有一個中間 fsetpos
的、 fseek
或 rewind
作業。 如有需要,可以針對 fsetpos
或 fseek
作業指定目前位置。 除了上面的值之外,可以將下列字元包含在 mode
,指定新行和檔案管理的轉譯模式。
詞彙 | 定義 |
---|---|
t |
以文字 (已轉譯) 模式開啟檔案 在此模式中,歸位字元換行字元 (CR-LF) 組合會轉譯成輸入的單行摘要(LF),而 LF 字元則會轉譯為輸出上的 CR-LF 組合。 此外,Ctrl+Z 會在輸入中解譯成檔案結尾字元。 在為了讀取或讀取/寫入而開啟的檔案中,_fsopen 會盡可能檢查檔案結尾是否有 Ctrl+Z,並加以移除。 因為使用 fseek 和 ftell 在以 CTRL+Z 結尾的檔案內移動,可能會造成 fseek 接近檔案結尾的行為不正確而遭到移除。 |
b |
在二進位 (未轉譯) 模式中開啟檔案;會隱藏上述轉譯。 |
D |
指定關閉最後一個檔案指標時刪除的暫存盤。 |
R |
指定針對但不限於磁碟的隨機存取進行快取最佳化。 |
S |
指定針對但不限於磁碟的循序存取進行快取最佳化。 |
T |
指定除非記憶體壓力需要它,否則不會寫入磁碟的檔案。 |
如果 t
或 b
未在 中 mode
指定 ,則轉譯模式是由預設模式變數 _fmode
所定義。 如果引數前置 t
或 b
,則函式失敗並傳回 NULL
。 如需文字和二進位模式的討論,請參閱 文字和二進位模式檔案 I/O。
關於 T
與 D
:
T
只要記憶體壓力不需要,就可避免將檔案寫入磁碟。 如需詳細資訊,請參閱FILE_ATTRIBUTE_TEMPORARY
檔案屬性常數,以及此部落格文章它只是暫時性的。D
指定寫入磁碟的一般檔案。 差異在於關閉時會自動刪除。 您可以結合TD
以取得這兩個語意。
_fsopen
和 _wfsopen
是的Microsoft特定變體 fopen
。 它們不屬於 ANSI 標準。 如需更可攜式且安全的函式,如果您不需要檔案共用,請考慮 _wfopen_s
或 fopen_s
。
自變數 shflag
是包含下列其中一個指令清單常數的常數表達式,定義於 中 Share.h
。
詞彙 | 定義 |
---|---|
_SH_DENYNO |
允許讀取及寫入權限。 |
_SH_DENYRD |
拒絕對該檔案的讀取存取。 |
_SH_DENYRW |
拒絕對該檔案的讀取和寫入存取。 |
_SH_DENYWR |
拒絕對該檔案的寫入存取。 |
根據預設,此函式的全域狀態會限定於應用程式。 若要變更此行為,請參閱 CRT 中的全域狀態。
一般文字常式對應
Tchar.h 常式 |
_UNICODE 和 _MBCS 未定義 |
_MBCS 已定義 |
_UNICODE 已定義 |
---|---|---|---|
_tfsopen |
_fsopen |
_fsopen |
_wfsopen |
需求
函式 | 必要的標頭 | 選擇性標頭 |
---|---|---|
_fsopen |
<stdio.h> |
<share.h> 針對 shflag 參數的資訊清單常數。 |
_wfsopen |
<stdio.h> 或 <wchar.h> |
<share.h> 針對 shflag 參數的資訊清單常數。 |
範例
// crt_fsopen.c
#include <stdio.h>
#include <stdlib.h>
#include <share.h>
int main( void )
{
FILE *stream;
// Open output file for writing. Using _fsopen allows us to
// ensure that no one else writes to the file while we are
// writing to it.
//
if( (stream = _fsopen( "outfile", "wt", _SH_DENYWR )) != NULL )
{
fprintf( stream, "No one else in the network can write "
"to this file until we are done.\n" );
fclose( stream );
}
// Now others can write to the file while we read it.
system( "type outfile" );
}
No one else in the network can write to this file until we are done.
另請參閱
資料流 I/O
fclose
, _fcloseall
_fdopen
, _wfdopen
ferror
_fileno
fopen
, _wfopen
freopen
, _wfreopen
_open
, _wopen
_setmode
_sopen
, _wsopen