fopen, fopen_s
來自 cppreference.com
定義於標頭檔案 <stdio.h> |
||
(1) | ||
FILE *fopen( const char *filename, const char *mode ); |
(直到 C99) | |
FILE *fopen( const char *restrict filename, const char *restrict mode ); |
(C99 起) | |
errno_t fopen_s( FILE *restrict *restrict streamptr, const char *restrict filename, |
(2) | (C11 起) |
1) 開啟由
filename
指定的檔案並返回指向與該檔案關聯的檔案流的指標。mode
用於確定檔案訪問模式。2) 與 (1) 相同,不同之處在於檔案流的指標被寫入
streamptr
,並且在執行時檢測到以下錯誤並呼叫當前安裝的約束處理程式函式-
streamptr
是空指標 -
filename
是空指標 -
mode
是空指標
-
fopen_s
可用。目錄 |
[編輯] 引數
filename | - | 要將檔案流關聯到的檔名 |
mode | - | 確定檔案訪問模式的以 null 結尾的字串 |
streamptr | - | 指向函式儲存結果的指標(一個輸出引數) |
[編輯] 檔案訪問標誌
檔案訪問 模式字串 |
含義 | 解釋 | 檔案 已存在時的操作 |
檔案 不存在時的操作 |
---|---|---|---|---|
"r" | 讀取 | 開啟檔案進行讀取 | 從頭開始讀取 | 開啟失敗 |
"w" | 寫入 | 建立檔案進行寫入 | 銷燬內容 | 建立新檔案 |
"a" | 追加 | 追加到檔案 | 寫入到末尾 | 建立新檔案 |
"r+" | 讀取擴充套件 | 開啟檔案進行讀/寫 | 從頭開始讀取 | 錯誤 |
"w+" | 寫入擴充套件 | 建立檔案進行讀/寫 | 銷燬內容 | 建立新檔案 |
"a+" | 追加擴充套件 | 開啟檔案進行讀/寫 | 寫入到末尾 | 建立新檔案 |
可以可選地指定檔案訪問模式標誌 "b" 以二進位制模式開啟檔案。此標誌在 POSIX 系統上沒有效果,但在 Windows 上它會停用對 '\n' 和 '\x1A' 的特殊處理。 在追加檔案訪問模式下,無論檔案位置指示器的當前位置如何,資料都將寫入檔案末尾。 | ||||
如果模式不是上面列出的字串之一,則行為是未定義的。某些實現定義了額外的受支援模式(例如 Windows)。 | ||||
在更新模式('+')下,可以執行輸入和輸出,但輸出後不能直接跟隨輸入,除非中間呼叫了 fflush、fseek、fsetpos 或 rewind;輸入後也不能直接跟隨輸出,除非中間呼叫了 fseek、fsetpos 或 rewind,除非輸入操作遇到了檔案結尾。在更新模式下,即使指定文字模式,實現也允許使用二進位制模式。 | ||||
檔案訪問模式標誌 "x" 可以選擇附加到 "w" 或 "w+" 說明符。此標誌強制函式在檔案存在時失敗,而不是覆蓋它。(C11) | ||||
使用 fopen_s 或 freopen_s 時,任何使用 "w" 或 "a" 建立的檔案的檔案訪問許可權會阻止其他使用者訪問它。檔案訪問模式標誌 "u" 可以選擇性地新增到任何以 "w" 或 "a" 開頭的說明符前,以啟用預設的 fopen 許可權。(C11) |
[編輯] 返回值
2) 成功時,返回零,並將指向新檔案流的指標寫入 *streamptr。出錯時,返回非零錯誤程式碼,並將空指標寫入 *streamptr(除非
streamptr
本身是空指標)。[編輯] 注意
filename
的格式是實現定義的,不一定指的是檔案(例如,它可能是控制檯或透過檔案系統 API 可訪問的其他裝置)。在支援它們的平臺上,filename
可以包含絕對或相對檔案系統路徑。
[編輯] 示例
執行此程式碼
#include <stdio.h> #include <stdlib.h> int main(void) { const char* fname = "/tmp/unique_name.txt"; // or tmpnam(NULL); int is_ok = EXIT_FAILURE; FILE* fp = fopen(fname, "w+"); if (!fp) { perror("File opening failed"); return is_ok; } fputs("Hello, world!\n", fp); rewind(fp); int c; // note: int, not char, required to handle EOF while ((c = fgetc(fp)) != EOF) // standard C I/O file reading loop putchar(c); if (ferror(fp)) puts("I/O error when reading"); else if (feof(fp)) { puts("End of file is reached successfully"); is_ok = EXIT_SUCCESS; } fclose(fp); remove(fname); return is_ok; }
可能的輸出
Hello, world! End of file is reached successfully
[編輯] 參考
- C17 標準 (ISO/IEC 9899:2018)
- 7.21.5.3 fopen 函式 (p: 223-224)
- K.3.5.2.1 fopen_s 函式 (p: 428-429)
- C11 標準 (ISO/IEC 9899:2011)
- 7.21.5.3 fopen 函式 (p: 305-306)
- K.3.5.2.1 fopen_s 函式 (p: 588-590)
- C99 標準 (ISO/IEC 9899:1999)
- 7.19.5.3 fopen 函式 (p: 271-272)
- C89/C90 標準 (ISO/IEC 9899:1990)
- 4.9.5.3 fopen 函式
[編輯] 另請參閱
關閉檔案 (function) | |
將輸出流與實際檔案同步 (function) | |
(C11) |
用不同的名稱開啟一個現有流 (function) |
C++ 文件 for fopen
|