以檔案共用開啟資料流。
語法
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 的寬字元版本;filename 的 mode 和 _wfsopen 引數是寬字元字串。 否則,_wfsopen 和 _fsopen 的行為即會相同。
字元字串 mode 會指定對檔案要求的存取類型,如下表所示。
| 詞彙 | 定義 |
|---|---|
“r” |
開啟以讀取。 如果檔案不存在或找不到,呼叫 _fsopen 就會失敗。 |
“w” |
開啟空白檔案以寫入。 如果指定的檔案已存在,其內容將被終結。 |
“a” |
開啟以在檔案結尾寫入 (附加):如果檔案不存在,會先建立檔案。 |
“r+” |
開啟以進行讀取和寫入。 (檔案必須存在)。 |
“w+” |
開啟空白檔案以進行讀取和寫入。 如果指定的檔案已存在,其內容將被終結。 |
“a+” |
開啟以進行讀取和附加;如果檔案不存在,會先建立檔案。 |
w 類型,因為它們可以終結現有的檔案。
當檔案以 「或a取類型開啟時,所有寫入作業都會發生在檔案結尾。 檔案指標可以使用 或 fseek重新定位rewind,但在執行任何寫入作業之前,一律會移回檔案的結尾。因此,無法覆寫現有的數據。 指定 “r+”、“” 不過,在讀取和寫入之間切換時,必須有一個中間 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