fopen_s

errno_t fopen_s( FILE** pFile, const char *filename, const char *mode ); errno_t _wfopen_s( FILE** pFile, const wchar_t *filename, const wchar_t *mode );

函式原型

fopen_s,_wfopen_s

打開一個檔案,這些版本比fopen,_wfopen在安全性上都有增強。

使用方法:

---------------------------------------------------

errno_t fopen_s( FILE** pFile, const char *filename, const char *mode );

errno_t _wfopen_s( FILE** pFile, const wchar_t *filename, const wchar_t *mode );

---------------------------------------------------

函式參數

pFile

檔案指針將接收到打開的檔案指針指向的指針。

infilename

檔案名稱。

inmode

允許的訪問類型。

---------------------------------------------------

返回值:

如果成功返回0。

失敗:

返回的常量Constant系統錯誤訊息System error message“值”Value
EPERM不允許執行該操作1
ENOENT沒有此檔案或目錄2
ESRCH沒有此進程3
EINTR函式中斷4
EIOI/O 錯誤5
ENXIO沒有此設備或地址6
E2BIG參數列表太長7
ENOEXEC執行格式錯誤8
EBADF檔案編號錯誤9
ECHILD沒有生成的進程10
EAGAIN沒有更多進程、沒有足夠記憶體或達到最大嵌套級別11
ENOMEM沒有足夠記憶體12
EACCES許可權被拒絕13
EFAULT地址錯誤14
EBUSY設備或資源忙碌16
EEXIST檔案已存在17
EXDEV跨設備連結18
ENODEV沒有此設備19
ENOTDIR不是目錄20
EISDIR是目錄21
EINVAL參數無效22
ENFILE系統中打開的檔案太多23
EMFILE打開的檔案太多24
ENOTTY不適當的 I/O 控制操作25
EFBIG檔案太大27
ENOSPC設備上沒有剩餘空間28
ESPIPE搜尋無效29
EROFS唯讀檔案系統30
EMLINK連結太多31
EPIPE管道損壞32
EDOM數學參數33
ERANGE結果太大34
EDEADLK會發生資源死鎖36
EDEADLOCK與 EDEADLK 相同,以便與早期的 Microsoft C 版本兼容36
ENAMETOOLONG檔案名稱太長38
ENOLCK無可用鎖39
ENOSYS函式不受支持40
ENOTEMPTY目錄不為空41
EILSEQ非法位元組序列42
STRUNCATE字元串被截斷80

錯誤條件

pFile filename mode 返回值 pFile 的內容
NULL 任何 任何 EINVAL 沒有改變
任何 NULL 任何 EINVAL 沒有改變
任何 任何 NULL EINVAL 沒有改變

EINVAL:無效的參數。

函式備註

通過打開的檔案fopen_s和_wfopen_s不是可共享。如果您需要先設定為可共享一個檔案,則使用_fsopen、_wfsopen與適當的共享模式常量 — — 例如,_SH_DENYNO為讀/寫的共享。

fopen_s函式打開的檔案指定的filename._wfopen_s是寬字元版本的fopen_s; 參數與_wfopen_s是寬字元字元串。_wfopen_s和fopen_s的行為相同 ; 否則。

fopen_s可以接受的有效執行 ; 在檔案系統上的路徑 UNC 路徑和涉及到映射的網路驅動器的路徑所接受的fopen_s,只要正在執行代碼的系統有權訪問該共享,或在執行時映射的網路驅動器。當構造路徑fopen_s、 不要臆測可用性驅動器、 路徑或網路共享的執行環境中。您可以使用正斜槓 (/) 或反斜槓 (\),作為路徑中的目錄分隔設定。

這些函式將驗證它們的參數。如果pFile,filename,或mode為 null 的指針,這些函式生成無效參數異常,如中所述參數驗證.

檢查返回值,是否函式成功執行該檔案的任何進一步操作之前,請參閱。如果發生錯誤,則返回的錯誤代碼和全局變數errno設定。有關詳細信息,請參閱errno、_doserrno、_sys_errlist 和 _sys_nerr.

支持檔案

fopen_s支持 Unicode 的檔案流。若要打開新的或現有的 Unicode 檔案,請傳遞ccs標誌,它指定所需的編碼為fopen_s::

fopen_s(&fp, "newfile.txt", "rw,ccs=encoding");

允許的值encoding的UNICODE,UTF-8,和UTF-16LE.如果存在未指定值的encoding, fopen_s使用 ANSI 編碼。

如果該檔案已經存在,並且已打開以進行讀取或追加,位元組順序標記 (BOM),如果存在於檔案中,將確定的編碼。物料清單編碼優先通過編碼由ccs標誌。ccs沒有物料清單時存在,或如果該檔案是新檔案只使用編碼。

訪問方式

"r"

打開以進行讀取。如果該檔案不存在,或無法找到,fopen_s調用失敗。

"w"

打開一個空檔案以進行寫入。如果該檔案存在,其內容將被銷毀。

"a"

打開以進行寫入 (追加) 而不將新數據寫入檔案之前刪除的 EOF 標記檔案的末尾。如果它不存在,則創建該檔案。

"r+"

將打開並讀取和寫入。 (該檔案必須存在。

"w+"

打開一個空的檔案進行讀寫。如果該檔案存在,其內容將被銷毀。

"a+"

將打開並讀取檔案和追加。追加操作包括刪除 EOF 標記的新數據寫入到檔案並在編寫完成後還原 EOF 標記之前。如果它不存在,則創建該檔案。

通過打開檔案時"a"或"a+"訪問類型,所有寫操作出現在檔案的結尾。可通過使用定位檔案指針fseek或rewind,但其始終移回至該檔案的末尾之前任何寫入,因此無法覆蓋現有數據執行操作。

"a"模式下不會追加到該檔案之前刪除 EOF 標記。追加發生後,MS-DOS TYPE 命令僅顯示最原始的 EOF 標記的數據和追加到檔案中沒有任何數據。"a+"模式不會追加到該檔案之前刪除的 EOF 標記。後追加,MS-DOS TYPE 命令在檔案中顯示所有數據。"a+"模式所需的追加到流檔案,將終止通過使用 CTRL + Z EOF 標記。

當"r+","w+",或"a+"指定訪問類型,允許讀取和寫入。 (就說是打開"更新"檔案)。 但是,當從閱讀切換到書寫,輸入的操作必須會遇到 EOF 標記。如果沒有任何 EOF,則必須使用中間檔案定位函式調用。檔案定位函式是fsetpos,fseek,和rewind.從讀數到寫切換時,您必須使用中間調用fflush或檔案定位函式。

除了上面的值中,下列字元可以包含在mode指定換行字元的轉換模式:

t

以文本形式打開 (翻譯) 模式。在此模式中,CTRL + Z 被解釋為對輸入檔案結尾字元中。要讀取/寫入與打開的檔案中"a+",fopen_s檢查 CTRL + Z 結尾的檔案並移除它,如果可能的話。這是因為使用fseek和ftell在結尾為 CTRL + Z,可能會導致檔案移動fseek檔案末尾附近的不當行為。

此外,在文本模式下,回車 – 換行組合被翻譯成在輸入時,一個換行符) 和換行符轉換為回車 – 換行組合輸出上。當 Unicode 流 i/o 函式操作文本模式 (默認值),源或目標流被認為是多位元組字元的序列。因此,Unicode 流輸入函式將多位元組字元轉換為寬字元 (如果通過調用mbtowc函式)。出於同樣的原因,Unicode 流輸出函式將寬字元轉換為多位元組字元 (如果通過調用wctomb函式)。

b

打開二進制 (未翻譯) 模式 ; 翻譯涉及回車和換行字元不會顯示。

如果t或b中沒有給出mode,默認轉換模式定義全局變數_fmode。如果t或b將作為參數,函式將失敗並返回前綴NULL.

有關使用文本和二進制模式中 Unicode 和多位元組流 i/o 的詳細信息,請參閱文本和二進制模式檔案 I/O和Unicode 文本和二進制模式中的流 I/O。

c

啟用提交標記關聯的filename,以便檔案緩衝區的內容將直接寫入磁碟,如果任一fflush或_flushall調用。

n

重置該提交標記關聯的filename為"無約束" 這是默認設定。它還重寫全局提交標誌,如果連結您的程式使用 COMMODE.OBJ。全球提交標誌默認設定是"無約束" 除非您顯式連結您的程式使用 COMMODE。OBJ (請參閱連結選項)。

N

指定的檔案不由子進程繼承。

S

指定的快取最佳化的但不是限於,順序訪問磁碟。

R

指定的快取最佳化的但不是限於,隨機訪問磁碟。

T

指定臨時檔案。如有可能,它未被刷新到磁碟。

D

指定臨時檔案。最後的檔案指針被關閉時,它將被刪除。

ccs=ENCODING

指定編碼的字元集可用於此檔案 (utf-8、 UTF-16LE 和 UNICODE)。離開這未指定是否希望 ANSI 編碼。

有效的字元mode中使用的字元串fopen_s和_fdopen對應於oflag參數中使用_ 打開和_sopen,如下。

a _O_WRONLY | _O_APPEND(通常_O_WRONLY | _O_CREAT |_O_APPEND)
a+ _O_RDWR | _O_APPEND(通常_O_RDWR | _O_APPEND | _O_CREAT)
r _O_RDONLY
r+ _O_RDWR
w _O_WRONLY(通常_O_WRONLY |_O_CREAT | _O_TRUNC)
w+ _O_RDWR(通常_O_RDWR | _O_CREAT | _O_TRUNC)
b _O_BINARY
t _O_TEXT
c
n
S _O_SEQUENTIAL
R _O_RANDOM
T _O_SHORTLIVED
D _O_TEMPORARY
ccs=UNICODE _O_WTEXT
ccs=UTF-8 _O_UTF8
ccs=UTF-16LE _O_UTF16

主要示例

相關詞條

相關搜尋

熱門詞條

聯絡我們