函式原型
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 |
EIO | I/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 |