_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。
如需有關這些錯誤碼和其他錯誤碼的詳細資訊,請參閱 _doserrno、errno、_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+" 存取型別一起開啟檔案時,所有寫入作業都會在檔案結尾進行。 使用 fseek 或 rewind可以重新調整檔案指標位置,但是在執行任何寫入作業之前,永遠會移回至檔案結尾。 因此,無法覆寫現有資料。 指定 "r+"、"w+" 或 "a+" 存取類型時,同時允許讀取和寫入 (表示檔案是要開啟以供更新之用)。 然而,當您在讀取和寫入之間切換時,必定會有干擾的 fsetpos、 fseek或 rewind 作業。 如果需要,目前位置可以為 fsetpos 或 fseek 作業指定。 除了上述值之外,下列其中一個字元可能包含在 mode,以為了 新行和檔案管理指定平移模式。
詞彙 |
定義 |
---|---|
t |
以文字模式 (已轉譯) 開啟檔案。 在這個模式下,傳回-line feed (CR-LF) 組合的歸位字元會在輸入時轉換成單行換行字元,而 LF 字元會在輸出時轉換成 CR-LF 組合。 此外, CTRL+Z 將解譯成輸入的檔案結尾字元。 如果可能的話,在檔案開啟為讀取/寫入時,_fsopen會檢查檔案結尾是否有 CTRL+Z,並加以移除。 之所以這樣做,是因為使用 fseek 和 ftell 以 CTRL+Z 結束的檔案內移動可能會讓 fseek 在檔案結尾附近產生不正確的行為。 |
b |
以二進位 (未轉譯的) 模式開啟檔案;上述轉譯會隱藏。 |
S |
指定針對但不限於磁碟的循序存取進行快取最佳化。 |
R |
指定針對但不限於磁碟的隨機存取進行快取最佳化。 |
T |
指定檔案做為暫存檔。 可能的話,不將其清除至磁碟。 |
D |
指定檔案做為暫存檔。 當最後一個檔案指標關閉時,將其刪除。 |
如果 mode 未指定為 t 或 b,則平移模式會被預設模式變數**_fmode**所定義。 如果引數前置 t 或 b,則函式失敗並傳回 NULL。 如需文字和二進位模式的討論,請參閱 文字和二進位模式檔案 I/O。
參數 shflag 是一個常值表達式,由以下其中一個定義於 Share.h 的表示常值組成。
詞彙 |
定義 |
---|---|
_SH_COMPAT |
將 16 位元應用程式設為相容性模式。 |
_SH_DENYNO |
允許讀取和寫入權限。 |
_SH_DENYRD |
拒絕檔案的讀取權限, |
_SH_DENYRW |
拒絕讀取和寫入檔案的存取權限, |
_SH_DENYWR |
拒絕寫入檔案的存取權限, |
一般文字常式對應
Tchar.h 常式 |
未定義 _UNICODE and _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" );
}