函式
<cstdio>

fopen

FILE * fopen ( const char * filename, const char * mode );
開啟檔案
開啟引數 filename 中指定的函式,並將其與一個流關聯,該流可在後續操作中透過返回的 FILE 指標進行標識。

允許對流進行的操作以及如何執行這些操作由 mode 引數定義。

如果返回的流已知不指向互動式裝置,則預設情況下它將是 *fully buffered* (參見 setbuf)。

返回的指標可以透過呼叫 fclosefreopen 來解除與檔案的關聯。所有開啟的檔案在程式正常終止時都會自動關閉。

執行環境同時支援至少 FOPEN_MAX 個開啟的檔案。

引數

filename
包含要開啟的檔名的 C 字串。
其值應遵循執行環境的檔名規範,並可以包含路徑(如果系統支援)。
mode
包含檔案訪問模式的 C 字串。它可以是
"r"讀取:為輸入操作開啟檔案。檔案必須存在。
"w"寫入:建立一個空檔案用於輸出操作。如果同名的檔案已存在,則其內容將被丟棄,檔案將被視為一個新的空檔案。
"a"追加:在檔案末尾開啟檔案進行輸出。輸出操作始終在檔案末尾寫入資料,並擴充套件檔案。定位操作(fseekfsetposrewind)將被忽略。如果檔案不存在,則會建立檔案。
"r+"讀/更新:為更新(輸入和輸出)開啟檔案。檔案必須存在。
"w+"寫/更新:建立一個空檔案併為更新(輸入和輸出)開啟它。如果同名的檔案已存在,則其內容將被丟棄,檔案將被視為一個新的空檔案。
"a+"追加/更新:為更新(輸入和輸出)開啟檔案,所有輸出操作都會在檔案末尾寫入資料。定位操作(fseekfsetposrewind)會影響下一個輸入操作,但輸出操作會將位置移回檔案末尾。如果檔案不存在,則會建立檔案。
使用上述 mode 說明符,檔案將以 *text file* 的方式開啟。為了以 *binary file* 的方式開啟檔案,需要在 mode 字串中包含一個"b"字元。這個附加的"b"字元可以附加在字串的末尾(從而形成以下組合模式:“rb”、“wb”、“ab”、“r+b”、“w+b”、“a+b”),或者插入在混合模式的字母和"+"符號之間(“rb+”、“wb+”、“ab+”)。

新的 C 標準(C2011,不是 C++ 的一部分)添加了一個新的標準子說明符("x"),可以附加到任何"w"說明符(形成"wx", "wbx", "w+x""w+bx"/"wb+x")。該子說明符強制函式在檔案存在時失敗,而不是覆蓋它。

如果序列後跟附加字元,則行為取決於庫實現:某些實現可能會忽略附加字元,以便接受例如附加的"t"(有時用於明確表示 *text file*)。

在某些庫實現中,以更新模式開啟或建立文字檔案可能會將流視為二進位制檔案。

*Text files* 是包含文字行序列的檔案。根據應用程式執行的環境,在 *text mode* 下進行輸入/輸出操作時可能會發生一些特殊的字元轉換,以使其適應系統特定的文字檔案格式。雖然在某些環境中不會發生轉換,並且 *text files* 和 *binary files* 的處理方式相同,但使用適當的模式可以提高可移植性。

對於以更新模式開啟的檔案(包含"+"符號),允許進行輸入和輸出操作,在讀取操作之前(該讀取操作緊跟在寫入操作之後)應重新整理流(fflush)或重新定位流(fseekfsetposrewind)。在寫入操作之前(該寫入操作緊跟在讀取操作之後,並且該讀取操作未到達檔案末尾)應重新定位流(fseekfsetposrewind)。

返回值

如果檔案成功開啟,該函式將返回一個指向 FILE 物件的指標,該指標可用於在後續操作中標識該流。
否則,將返回一個空指標。
在大多數庫實現中,失敗時還會將 errno 變數設定為一個特定於系統的錯誤程式碼。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
/* fopen example */
#include <stdio.h>
int main ()
{
  FILE * pFile;
  pFile = fopen ("myfile.txt","w");
  if (pFile!=NULL)
  {
    fputs ("fopen example",pFile);
    fclose (pFile);
  }
  return 0;
}

另見