名稱空間
變體
操作

fopen, fopen_s

來自 cppreference.com
< c‎ | io
 
 
檔案輸入/輸出
型別和物件
        
函式
檔案訪問
fopenfopen_s
(C11)
(C95)
非格式化輸入/輸出
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

格式化輸入
 
定義於標頭檔案 <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,

                 const char *restrict mode );
(2) (C11 起)
1) 開啟由 filename 指定的檔案並返回指向與該檔案關聯的檔案流的指標。mode 用於確定檔案訪問模式。
2)(1) 相同,不同之處在於檔案流的指標被寫入 streamptr,並且在執行時檢測到以下錯誤並呼叫當前安裝的約束處理程式函式
  • streamptr 是空指標
  • filename 是空指標
  • mode 是空指標
與所有進行邊界檢查的函式一樣,只有當實現定義了 __STDC_LIB_EXT1__ 並且使用者在包含 <stdio.h> 之前將 __STDC_WANT_LIB_EXT1__ 定義為整數常量 1 時,才能保證 fopen_s 可用。

目錄

[編輯] 引數

filename - 要將檔案流關聯到的檔名
mode - 確定檔案訪問模式的以 null 結尾的字串
streamptr - 指向函式儲存結果的指標(一個輸出引數)

[編輯] 檔案訪問標誌

檔案訪問
模式字串
含義 解釋 檔案
已存在時的操作
檔案
不存在時的操作
"r" 讀取 開啟檔案進行讀取 從頭開始讀取 開啟失敗
"w" 寫入 建立檔案進行寫入 銷燬內容 建立新檔案
"a" 追加 追加到檔案 寫入到末尾 建立新檔案
"r+" 讀取擴充套件 開啟檔案進行讀/寫 從頭開始讀取 錯誤
"w+" 寫入擴充套件 建立檔案進行讀/寫 銷燬內容 建立新檔案
"a+" 追加擴充套件 開啟檔案進行讀/寫 寫入到末尾 建立新檔案
可以可選地指定檔案訪問模式標誌 "b" 以二進位制模式開啟檔案。此標誌在 POSIX 系統上沒有效果,但在 Windows 上它會停用對 '\n''\x1A' 的特殊處理。
在追加檔案訪問模式下,無論檔案位置指示器的當前位置如何,資料都將寫入檔案末尾。
如果模式不是上面列出的字串之一,則行為是未定義的。某些實現定義了額外的受支援模式(例如 Windows)。
在更新模式('+')下,可以執行輸入和輸出,但輸出後不能直接跟隨輸入,除非中間呼叫了 fflushfseekfsetposrewind;輸入後也不能直接跟隨輸出,除非中間呼叫了 fseekfsetposrewind,除非輸入操作遇到了檔案結尾。在更新模式下,即使指定文字模式,實現也允許使用二進位制模式。
檔案訪問模式標誌 "x" 可以選擇附加到 "w""w+" 說明符。此標誌強制函式在檔案存在時失敗,而不是覆蓋它。(C11)
使用 fopen_sfreopen_s 時,任何使用 "w""a" 建立的檔案的檔案訪問許可權會阻止其他使用者訪問它。檔案訪問模式標誌 "u" 可以選擇性地新增到任何以 "w""a" 開頭的說明符前,以啟用預設的 fopen 許可權。(C11)

[編輯] 返回值

1) 成功時,返回指向新檔案流的指標。除非 filename 指的是互動式裝置,否則流是完全緩衝的。出錯時,返回空指標。POSIX 要求在這種情況下設定 errno
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) [編輯]
用不同的名稱開啟一個現有流
(function) [編輯]
C++ 文件 for fopen