在 C 標準庫(stdio.h)視角下,所有文件均為流式文件。其本質特徵:
\n)、回車符(\r)或固定長度分隔記錄。換行符只是普通字節(0x0A),無特殊語義。FILE* 內部位置指示器)決定,可隨機定位(fseek)、順序讀寫,開始/結束完全由程序邏輯控制。| 維度 | 流式文件 | 記錄式文件 |
|---|---|---|
| 數據模型 | 連續字節流 | 邏輯記錄集合(固定/可變長度) |
| 記錄邊界 | 無(程序自行解析) | 顯式(長度前綴、分隔符、固定槽位) |
| 訪問方式 | 順序/隨機字節定位 | 按記錄號讀寫(ISAM、VSAM 等) |
| 典型場景 | 文本、二進制數據、日志、配置 | 數據庫表、主機系統數據集、結構化業務數據 |
| C 語言支持 | 標準庫原生(fread/fwrite/fgets) | 需自行實現或使用第三方庫(如 SQLite、ISAM) |
FILE* + 位置指針 = 萬能介面,支撐文本/二進制、順序/隨機所有需求。setvbuf 靈活調優。// 讀取文本行:程序負責識別 '\n' 作為邏輯行結束
char line[256];
while (fgets(line, sizeof(line), fp)) {
// 處理 line,末尾含 '\n'(若緩衝區足夠)
}
// 寫入結構體數組:程序負責序列化佈局
struct Student { int id; char name[20]; float score; } stu[100];
fwrite(stu, sizeof(struct Student), 100, fp); // 純字節流寫入
// 隨機訪問第 50 個學生
fseek(fp, 49 * sizeof(struct Student), SEEK_SET);
fread(&s, sizeof(struct Student), 1, fp);
C 語言文件 = 流式文件。不存在「記錄」概念,換行符無特權。所有結構化讀寫(行、結構體、對象)均由應用層邏輯構建在字節流之上。理解這一點,是掌握 fread/fwrite、fseek/ftell、文本/二進制模式差異、跨平台文件處理的基石。