Share via


_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 指標值表示錯誤。 如果 filenamemode 為 或 空 NULL 字串,這些函式會叫用不正確參數處理常式,如參數驗證 中所述 。 如果允許繼續執行,這些函式會傳回 NULL,並將 errno 設為 EINVAL

如需這些錯誤碼和其他錯誤碼的詳細資訊,請參閱 errno_doserrno_sys_errlist_sys_nerr

備註

_fsopen 函式會開啟 filename 指定的檔案做為資料流,並準備此檔案,以供共用讀取或寫入使用 (如同此模式和 shflag 引數所指定)。 _wfsopen_fsopen 的寬字元版本;_wfsopenfilenamemode 引數是寬字元字串。 否則,_wfsopen_fsopen 的行為即會相同。

字元字串 mode 會指定對檔案要求的存取類型,如下表所示。

詞彙 定義
"r" 開啟以讀取。 如果檔案不存在或找不到,呼叫 _fsopen 就會失敗。
"w" 開啟空白檔案以寫入。 如果指定的檔案已存在,其內容將被終結。
"a" 開啟以在檔案結尾寫入 (附加):如果檔案不存在,會先建立檔案。
"r+" 開啟以進行讀取和寫入。 (檔案必須存在)。
"w+" 開啟空白檔案以進行讀取和寫入。 如果指定的檔案已存在,其內容將被終結。
"a+" 開啟以進行讀取和附加;如果檔案不存在,會先建立檔案。

小心使用 「 w 」 和 w+ 類型,因為它們可以終結現有的檔案。

當檔案以 「」 或 aa+ 存取類型開啟時,所有寫入作業都會發生在檔案結尾。 檔案指標可以使用 或 rewind 重新置放 fseek ,但在執行任何寫入作業之前,一律會移回檔案的結尾。因此,無法覆寫現有的資料。 指定 「 r+ 」、「」 w+a+ 存取類型時,允許讀取和寫入 (據說檔案為開啟以進行更新)。 不過,在讀取和寫入之間切換時,必須有一個中間 fsetpos 的 、 fseekrewind 作業。 如有需要,可以針對 fsetposfseek 作業指定目前位置。 除了上面的值之外,可以將下列字元包含在 mode,指定新行和檔案管理的轉譯模式。

詞彙 定義
t 以文字 (已轉譯) 模式開啟檔案 在此模式中,歸位字元換行字元 (CR-LF) 組合會轉譯成輸入的單行摘要(LF),而 LF 字元則會轉譯為輸出上的 CR-LF 組合。 此外,Ctrl+Z 會在輸入中解譯成檔案結尾字元。 在為了讀取或讀取/寫入而開啟的檔案中,_fsopen 會盡可能檢查檔案結尾是否有 Ctrl+Z,並加以移除。 因為使用 fseekftell 在以 CTRL+Z 結尾的檔案內移動,可能會造成 fseek 接近檔案結尾的行為不正確而遭到移除。
b 在二進位 (未轉譯) 模式中開啟檔案;會隱藏上述轉譯。
D 指定關閉最後一個檔案指標時刪除的暫存檔。
R 指定針對但不限於磁碟的隨機存取進行快取最佳化。
S 指定針對但不限於磁碟的循序存取進行快取最佳化。
T 指定除非記憶體壓力需要它,否則不會寫入磁片的檔案。

如果 tb 未在 中 mode 指定 ,則轉譯模式是由預設模式變數 _fmode 所定義。 如果引數前置 tb ,則函式失敗並傳回 NULL。 如需文字和二進位模式的討論,請參閱 文字和二進位模式檔案 I/O

關於 TD

  • T 只要記憶體壓力不需要,就可避免將檔案寫入磁片。 如需詳細資訊,請參閱 FILE_ATTRIBUTE_TEMPORARY 檔案屬性常數 以及此部落格文章 它只是暫時性的
  • D 指定寫入磁片的一般檔案。 差異在於關閉時會自動刪除。 您可以結合 TD 以取得這兩個語意。

_fsopen_wfsopen 是 的 fopen Microsoft 特定變體。 它們不屬於 ANSI 標準。 如需更可攜式且安全的函式,如果您不需要檔案共用,請考慮 _wfopen_sfopen_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