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);
fopen
和 freopen
的模式 mode
參數必須是下面序列中的 字符串:
模式 | 描述 | 起始位置 | ||
---|---|---|---|---|
r | rb | 用於讀取 | 文件起點 | |
w | wb | 用於寫入 ( 如果文件不存在則創建文件). 刪除文件內容並重新寫入. | 文件起點 | |
a | ab | 用於增量寫入 (如果文件不存在則創建文件) | 文件末尾 | |
r+ | rb+ | r+b | 用於讀寫 | 文件起點 |
w+ | wb+ | w+b | 用於讀寫. 刪除文件內容並重新寫入. | 文件起點 |
a+ | ab+ | a+b | 用於讀寫 (如果文件存在則增量寫入) | 文件末尾 |
使用 fclose 關閉流
編輯fclose
函數只有一個參數: 指向需要關閉流的 FILE
結構的指針, 即
int fclose(FILE *fp);
使用 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 個不同的值, 這將造成信息丟失.
查閱
編輯參考文獻
編輯外部連結
編輯- Question 12.1 in the C FAQ: using
char
to holdgetc
's return value - Source code