在 C 語言中,鍵盤、螢幕、印表機、磁碟等邏輯裝置均視為「檔案」操作。標準檔案函數(ANSI C)提供緩衝 I/O,以 FILE* 為統一介面,支援順序與隨機讀寫。
| 類別 | 函數 | 說明 |
|---|---|---|
| 開啟/關閉 | fopen/fclose | 建立/釋放串流 |
freopen | 重新導向現有串流 | |
| 順序讀寫 | fgetc/fputc | 字元級 |
fgets/fputs | 字串級 | |
| 格式化 | fscanf/fprintf | 格式化掃描/列印 |
fread/fwrite | 二進制塊讀寫 | |
| 隨機定位 | fseek/rewind/ftell | 移動/歸零/查詢位置指標 |
fgetpos/fsetpos | 大檔案支援 (POSIX) | |
| 狀態查詢 | feof/ferror/clearerr/fileno | EOF/錯誤/清除/取得檔案描述符 |
fprintf/fwrite 先寫入緩衝區,滿或 fclose/fflush 才落盤fread 從磁碟讀入一塊資料到緩衝區,後續 fgetc 從緩衝區取字元\n 刷新stderr 預設,立即輸出fflush 強制刷新
int fflush(FILE *stream);
// 成功返回 0,失敗返回 EOF
// 刷新輸出緩衝區至裝置,丟棄輸入緩衝區內容
關鍵資料寫入後立即 fflush(fp) 可防止程式異常終止導致資料遺失。
| 串流 | 裝置 | 對應函數 |
|---|---|---|
stdin | 鍵盤 | scanf、getchar、fgets |
stdout | 螢幕 | printf、putchar、puts |
stderr | 螢幕 | fprintf(stderr, ...)、perror |
這三個串流在程式啟動時自動開啟,無需 fopen。
fgetc/fputc
// 複製檔案
FILE *src = fopen("src.txt", "r");
FILE *dst = fopen("dst.txt", "w");
int ch;
while ((ch = fgetc(src)) != EOF)
fputc(ch, dst);
fclose(src); fclose(dst);
fgets/fputs
// 逐行讀取
char line[256];
while (fgets(line, sizeof(line), fp) != NULL) {
fputs(line, stdout); // 含換行符
}
注意:fgets 保留 \n,gets (已棄用) 丟棄 \n 且不安全。
#include
#include
int main(int argc, char *argv[]) {
if (argc < 2) {
fprintf(stderr, "Usage: %s [dst]\n", argv[0]);
return 1;
}
FILE *fp1 = fopen(argv[1], "r");
if (!fp1) { perror(argv[1]); return 1; }
FILE *fp2 = (argc >= 3) ? fopen(argv[2], "w") : stdout;
if (!fp2) { perror(argv[2]); fclose(fp1); return 1; }
int ch;
while ((ch = fgetc(fp1)) != EOF)
fputc(ch, fp2);
fclose(fp1);
if (fp2 != stdout) fclose(fp2);
return 0;
}
UNIX 起源,MS-DOS 3.0+ 支援:open/close/read/write/lseek。使用檔案描述符 int fd,無緩衝,系統呼叫層級。標準庫函數內部封裝此層。一般應用請優先使用標準函數,除非需精確控制同步、鎖定、非阻塞等特性。
標準檔案函數以 FILE* 統一抽象裝置差異,緩衝機制提升效能。掌握「開啟模式選擇、緩衝區刷新時機、三大標準串流、順序讀寫三層級 (字元/字串/格式化)、錯誤檢查模式」即可應對絕大多數檔案 I/O 需求。記住:永遠檢查 fopen 返回值、寫入關鍵資料後 fflush、配對 fopen/fclose。