在 C 語言中,文件操作極具彈性:既可逐字符讀寫,也可按字符串或任意字節塊處理。本文深入講解以字符形式讀寫文件的核心函數 fgetc() 與 fputc(),並通過完整示例演示如何安全、高效地處理文本文件。
fgetc 是 file get char 的縮寫,用於從指定文件流讀取單個字符。其原型為:
int fgetc(FILE *fp);
fp 為文件指針。讀取成功時返回該字符(以 int 型態返回),讀到文件末尾或發生錯誤時返回 EOF(通常為 -1,但標準僅保證為負值)。返回類型用 int 而非 char,正是為了容納 EOF 這個負數標記。
提示:
EOF並不絕對等於 -1,具體值取決於編譯器實現,請始終使用符號常量而非硬編碼數值。
每個打開的文件流內部都維護一個位置指針,指向下一次讀寫的字節偏移量。文件剛打開時指向首字節;每次呼叫 fgetc() 後,指針自動後移一字節。此指針由系統自動管理,對程式設計師透明,不等同於 C 語言中的指標變數。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
FILE *fp;
int ch; // 必須用 int 接收返回值,以便判斷 EOF
if ((fp = fopen("D:\\demo.txt", "rt")) == NULL) {
printf("Cannot open file, press any key to exit!");
getchar();
exit(EXIT_FAILURE);
}
while ((ch = fgetc(fp)) != EOF) {
putchar(ch);
}
putchar('\n');
fclose(fp);
return 0;
}
執行前請在 D 盤建立 demo.txt 並寫入任意文字,程式將逐字讀取並輸出到螢幕。
EOF 既可能表示正常讀完,也可能表示讀取出錯。為區分兩者,可使用 feof() 與 ferror():
feof(fp):若位置指針已到文件末尾,返回非零值。ferror(fp):若文件操作發生錯誤,返回非零值。雖然純讀取場景下 while ((ch = fgetc(fp)) != EOF) 通常足夠,但在嚴謹專案中建議額外檢查:
if (ferror(fp)) {
puts("讀取出錯");
} else {
puts("讀取成功");
}
fputc 全稱 file put char,向文件流寫入單字符。原型:
int fputc(int ch, FILE *fp);
成功返回寫入的字符,失敗返回 EOF。示例:
fputc('a', fp); // 直接寫字面量
char c = 'b';
fputc(c, fp); // 或寫變數
"w" 或 "w+" 打開既有文件會清空原內容;若需保留並追加,請用 "a" 或 "a+"。文件不存在時均會自動建立。#include <stdio.h>
#include <stdlib.h>
int main(void) {
FILE *fp;
int ch;
if ((fp = fopen("D:\\demo.txt", "wt+")) == NULL) {
printf("Cannot open file, press any key to exit!\n");
getchar();
exit(EXIT_FAILURE);
}
printf("Input a string:\n");
while ((ch = getchar()) != '\n') {
fputc(ch, fp);
}
fclose(fp);
return 0;
}
程式讀取鍵盤輸入直到換行鍵,將每字符寫入文件。打開 demo.txt 即可看到剛輸入的內容。
fgetc/fputc 是字符級文件 I/O 的基石,適合處理文本文件、逐字符解析等場景。int 變數接收返回值,正確判斷 EOF。feof/ferror 提升程式健壯性。w/a 等模式。