文件是有序相關數據集合,擁有文件名,駐留於外部介質(磁盤、SSD 等),使用時調入內存。C 語言統一將輸入輸出視為字符流處理,屏蔽設備差異。
| 維度 | 分類 | 說明 |
|---|---|---|
| 用戶視角 | 普通文件 | 磁盤上有序數據:源碼、目標文件、可執行文件、數據文件 |
| 設備文件 | 外部設備抽象為文件:顯示器(標準輸出)、鍵盤(標準輸入)、打印機 | |
| 編碼方式 | 文本文件 (ASCII) | 字符對應 ASCII 碼,每字符 1 字節。可讀,如源碼。5678 佔 4 字節 |
| 二進制文件 | 按內存位模式存儲。5678 (int) 佔 2/4 字節。不可直接讀,但讀寫快(無轉換開銷) |
stdin (標準輸入) :默認鍵盤,scanf/getchar 讀取。stdout (標準輸出) :默認顯示器,printf/putchar 寫入。stderr (標準錯誤) :默認顯示器,錯誤信息輸出,可單獨重定向。這三個流由系統自動打開,程序啟動即可直接使用。
FILE *C 語言用 FILE* 指向文件結構體(內含文件名、狀態、當前位置、緩衝區等),由庫函數管理,程序員無需關心內部細節。
FILE *fp; // 聲明文件指針
習慣稱 fp 為「指向文件的指針」,實則指向文件控制結構體。
fopen
FILE *fopen(const char *filename, const char *mode);
NULL。mode 決定訪問方式與文件類型。| 模式 | 含義 | 文件類型 | 操作 | 文件不存在 |
|---|---|---|---|---|
"rt" | 只讀文本 | 文本 | 讀 | 報錯 |
"wt" | 只寫文本 | 文本 | 寫 | 創建/截斷 |
"at" | 追加文本 | 文本 | 尾部寫 | 創建 |
"rb" | 只讀二進制 | 二進制 | 讀 | 報錯 |
"wb" | 只寫二進制 | 二進制 | 寫 | 創建/截斷 |
"ab" | 追加二進制 | 二進制 | 尾部寫 | 創建 |
"rt+" | 讀寫文本 | 文本 | 讀/寫 | 報錯 |
"wt+" | 讀寫文本 | 文本 | 讀/寫 | 創建/截斷 |
"at+" | 讀寫追加文本 | 文本 | 讀/尾部寫 | 創建 |
"rb+" | 讀寫二進制 | 二進制 | 讀/寫 | 報錯 |
"wb+" | 讀寫二進制 | 二進制 | 讀/寫 | 創建/截斷 |
"ab+" | 讀寫追加二進制 | 二進制 | 讀/尾部寫 | 創建 |
r = read(讀)w = write(寫,截斷/創建)a = append(追加,必須存在否則創建)t = text(文本,可省略)b = binary(二進制)+ = 讀寫雙向\r\n <-> \n),有 CPU 開銷;二進制模式原樣讀寫,無轉換,跨平台數據交換必用二進制。
FILE *fp = fopen("data.bin", "rb");
if (!fp) {
perror("fopen data.bin");
return EXIT_FAILURE;
}
// 使用 fp ...
fclose(fp);
fclose
int fclose(FILE *fp);
FILE* 是操作句柄。w 會清空文件,a 保留並追加,r 要求存在。fopen 返回值,用 perror 診斷。