C/文件輸入輸出

維基教科書,自由的教學讀本
< C
跳至導覽 跳至搜尋

C語言提供了許多用於文件輸入輸出標準庫函數. 這些函數構成了C標準庫頭文件 <stdio.h>.

以現代的標準來看, C語言的 I/O 功能相當的低級; C 將對所有文件比特(可以為輸入流輸出流)的操作進行抽象. 不像其他更早的程序語言, C語言不支持數據文件的隨機存取; 如果想要讀取一個文件中間的記錄, 程序員必須創建一個流, 找到文件的中間部分, 然後讀取流中的比特序列.

文件 I/O 的流模型在Unix操作系統中應用廣泛. 現代的許多主流操作系統都從 Unix 繼承了流的概念, 許多類C語言繼承了C的文件I/O接口或僅在其基礎上做了少許改動(例如, PHP).C++標準庫在其語法中反映了"流"的概念; 查看iostream.

使用fopen打開文件[編輯]

使用 fopen 打開文件將返回一個相應文件或其他設備的輸入/輸出. 如果函數調用失敗, 將返回一個空指針.

The related C library function freopen performs the same operation after first closing any open stream associated with its parameters.

他們的定義如下:

FILE *fopen(const char *path, const char *mode);
FILE *freopen(const char *path, const char *mode, FILE *fp);


fopenfreopen 的模式 mode 參數必須是下面序列中的 字符串:

模式 描述 起始位置
r rb 用於讀取 文件起點
w wb 用於寫入 ( 如果文件不存在則創建文件). 刪除文件內容並重新寫入. 文件起點
a ab 用於增量寫入 (如果文件不存在則創建文件) 文件末尾
r+ rb+ r+b 用於讀寫 文件起點
w+ wb+ w+b 用於讀寫. 刪除文件內容並重新寫入. 文件起點
a+ ab+ a+b 用於讀寫 (如果文件存在則增量寫入) 文件末尾

字母 "b" 代表二進制. 標準 C 提供兩類文件: 文本文件二進制文件 , 雖然操作系統不需要區分這兩種形式.

使用 fclose 關閉流[編輯]

fclose 函數只有一個參數: 指向需要關閉流的 FILE 結構的指針, 即

int fclose(FILE *fp);

函數成功調用則返回, 否則返回EOF.

使用 fgetc 從流中讀入[編輯]

fgetc 函數用於從一個流中讀取字符.

int fgetc(FILE *fp);

如果調用成功, fgetc 返回流中的下一位或下一字符(取決於文件是"二進制文件"或"文本文件"). 如果不成功, fgetc 返回 EOF.

標準 getc 除了作為宏可能會對其參數求值兩次之外與 fgetc 的行為幾乎完全一樣.

標準函數 getchar 不需要任何參數, 等價於 getc(stdin).

函數 fgetc , getc, getchar 都在頭文件 <stdio.h> 中定義.


EOF 陷阱[編輯]

使用 fgetc, getc, 或 getchar 的常見的一個錯誤是, 在不將返回值與 EOF 比較的情況下, 用返回值為 char 型變量賦值. 下面的代碼片段示例了這種錯誤, 並且示例了正確的方法:

錯誤 正確
char c;
while ((c = getchar()) != EOF) {
    putchar(c);
}
int c;
while ((c = getchar()) != EOF) {
    putchar(c);
}

考慮一個 char 型是 8  比特的系統, char 可以表示 256 個不同的值. getchar 可以返回 256  個可能字符串的任何一個, 並且它可能返回 EOF 來代表文件的結束, 這樣有 257 個可能的返回值.

當用 getchar 的返回值給 char 型變量賦值時, 這一變量僅能表示 256 個不同的值, 這將造成信息丟失.

查閱[編輯]

參考文獻[編輯]

外部連結[編輯]