本文深入探討 C 語言文件輸入輸出(I/O)機制,參考經典教材《C Primer Plus》(第 5 版與第 6 版)編寫。內容涵蓋文件基本概念、文本與二進制模式、標準流重定向、核心庫函數用法,以及實戰代碼示例。部分內容涉及 MS-DOS 環境操作,讀者可按需閱讀。
文件本質上是磁盤或固態硬盤上一段已命名的存儲區域,所有內容均以二進制形式保存。根據數據組織方式,文件分為兩大類:
| 文件格式 | 定義 | 保存內容 | 典型示例 |
|---|---|---|---|
| 文本文件 | 以二進制編碼字符(如 ASCII、Unicode)表示文本的文件 | 文本內容 | .txt、.c、.h |
| 二進制文件 | 二進制值直接代表機器指令或數值數據的文件 | 二進制內容 | 圖片、可執行文件、.dat |
C 語言提供兩種訪問文件的途徑:文本模式與二進制模式。
\n、早期 MS-DOS/Windows 使用 \r\n、舊版 Mac OS 使用 \r。以文本模式打開時,C 運行庫會在讀寫時自動轉換(如將 \r\n 轉為 \n),屏蔽平台差異。文件結尾由宏 EOF(End of File)標識,值通常為 -1。
C 程序啟動時自動打開三個標準流:
| 流名稱 | 默認設備 | C 語言標識符 |
|---|---|---|
| 標準輸入 | 鍵盤 | stdin |
| 標準輸出 | 顯示器 | stdout |
| 標準錯誤輸出 | 顯示器 | stderr |
可通過重定向改變這些流的默認設備關聯。
重定向運算符 <(輸入)、>(輸出)可將文件與標準流關聯。例如:
insort.exe < defin.txt > defout.txt
上述命令將 defin.txt 內容作為程序輸入,將程序輸出寫入 defout.txt。但需注意:
stdin 不再關聯鍵盤,若程序末尾有 getch() 等待按鍵,在純 DOS 環境下會導致程序掛起。

相比重定向,在代碼中直接操作文件更靈活、安全。核心流程:
FILE *fp = fopen("file1.txt", "r"); // 以只讀文本模式打開
if (fp == NULL) exit(EXIT_FAILURE); // 檢查打開是否成功
// ... 文件操作 ...
if (fclose(fp) != 0) exit(EXIT_FAILURE); // 關閉並檢查狀態

C11 新增 x 模式(獨佔創建),此處不展開。同動態內存分配一樣,務必檢查返回值,並在操作結束後及時關閉文件;異常情況(如硬盤故障)下關閉失敗亦需處理。
類比 getchar()/putchar(),但需指定文件指針:
int ch = getc(fp); // 從 fp 讀取一字符,返回 int 以容納 EOF putc(ch, fpout); // 將字符 ch 寫入 fpout 指向的文件
注意:返回值為 int 而非 char,為了正確判斷 EOF;getc/putc 可能是宏實現,參數不能有副作用(如 getc(fp++) 非法)。

在 printf/scanf 基礎上增加文件指針參數:
fprintf(fp, "Hello World"); // 寫入文件 fscanf(fp, "%s", str); // 從文件讀取

fgets(str, SIZE, fp); // 讀取 SIZE-1 字符或遇到 \n 結束,保留 \n fputs(str, fp); // 寫入字符串,不自動添加 \n
前提:必須以二進制模式打開文件,否則位置計算無意義。
ftell(fp):返回長整型,表示當前位置距文件開頭的字節數。fseek(fp, offset, origin):移動文件位置指針。
offset:偏移量(長整型),負值向文件開頭偏移。origin:起點模式 —— SEEK_SET(文件開頭)、SEEK_CUR(當前位置)、SEEK_END(文件結尾)。

以相同位格式存儲數值,保持最大精度(如 double 類型)。
// 寫入 double 值 1.0/3.0
FILE *fp = fopen("pro.dat", "wb");
double num = 1.0 / 3.0;
fwrite(&num, sizeof(double), 1, fp);
fclose(fp);
// 讀取並驗證精度
fp = fopen("pro.dat", "rb");
double get;
fread(&get, sizeof(double), 1, fp);
fclose(fp);
printf("get * 3.0 = %lf", get * 3.0); // 輸出接近 1.0

本文系統梳理了:
fopen()/fclose() 及模式選擇getc/putc、fprintf/fscanf、fgets/fputsfseek/ftellfread/fwrite附錄:其他標準 I/O 函數速查

建議配合《C Primer Plus》第 5 或 6 版深入學習。文中難免疏漏,歡迎指正交流。