在 C 語言程式設計中,文件輸入輸出(I/O)佔據了極大的比重。無論是讀取配置文件、寫入日誌,還是處理大數據集,文件操作無處不在。C 語言提供了豐富的 I/O 函數庫,主要分為兩大體系:ANSI C 標準定義的緩衝文件系統(標準流 I/O)與非 ANSI 標準的非緩衝文件系統(低級 I/O)。我們熟悉的 scanf()、printf() 等控制台函數,實際上只是標準流 I/O 的特例——它們使用預定義的標準設備流指針(stdin、stdout、stderr 等)作為參數。
程式啟動時,C 運行環境自動打開五個標準設備文件,並分配固定的流指針與文件描述符:
| 設備 | 標準流指針 | 文件描述符 |
|---|---|---|
| 鍵盤(標準輸入) | stdin | 0 |
| 顯示器(標準輸出) | stdout | 1 |
| 顯示器(標準錯誤) | stderr | 2 |
| 串行口(標準輔助) | stdaux | 3 |
| 打印機(標準列印) | stdprn | 4 |
這意味著,無論在標準或非標準系統中,只要將文件結構指針替換為上述值,同一組 I/O 函數即可操作控制台設備,體現了「一切皆文件」的設計哲學。
C 語言引入「流」抽象,將數據輸入輸出視為數據的流入流出,屏蔽了物理設備差異。流分為兩類:
\r\n,即 0x0D 0xA)轉換為單一 \n。\n 轉換為平台特定的換行序列。'2','0','0','1')。0x07D1)。直接對磁盤進行字符/字節級讀寫會頻繁觸發機械操作,極大降低效率並損壞壽命。C 語言引入緩衝區(默認 512 字節):
這就是「標準 I/O」或「流式 I/O」的由來。相對應的「非標準/低級 I/O」無緩衝,直接由作業系統管理,適用於需精確控制的場景。
FILE 是標準 I/O 的核心控制結構(Turbo C 定義示例):
typedef struct {
short level;
unsigned flags; // 10 位標誌位
char fd;
unsigned char hold;
short bsize;
unsigned char *buffer;
unsigned char *curp;
unsigned istemp;
short token;
} FILE;
關鍵標誌位(flags)解讀:
| 位 | 符號 | 含義 |
|---|---|---|
| 0 | _F_READ | 讀模式 |
| 1 | _F_WRIT | 寫模式 |
| 2 | _F_BUF | fclose 時釋放緩衝區 |
| 3 | _F_LBUF | 行緩衝 |
| 4 | _F_ERR | 錯誤標誌 |
| 5 | _F_EOF | 文件結束標誌 |
| 6 | _F_BIN | 二進制模式 |
| 7 | _F_IN | 正在輸入 |
| 8 | _F_OUT | 正在輸出 |
| 9 | _F_TERM | 終端設備 |
FILE 結構的地址,內含文件指針、緩衝區指針、模式標誌等元信息。FILE 內部字段,而應通過標準庫函數操作。掌握文件操作需理解:流的雙重形態(文本/二進制)、緩衝機制的性能意義、標準流與設備映射、FILE 結構的封裝角色。這為高效、可移植的文件處理奠定基礎。