檔案操作是 C 語言系統程式設計的核心技能。本文系統整理 FILE* 指標、開檔模式、字元/字串/區塊讀寫、隨機存取、緩衝區控制等關鍵知識,並附上可直接編譯執行的完整範例程式碼。
FILE* 與 fopen()FILE *fp = fopen("路徑/檔名", "開檔模式");
FILE 為 stdio.h 定義的結構,內含檔名、狀態、讀寫位置等資訊fp 指向該結構,透過它操作實體檔案NULL,務必檢查| 模式 | 說明 | 檔案須存在 | 建立新檔 | 可讀 | 可寫 | 定位 |
|---|---|---|---|---|---|---|
r | 文字檔讀取 | 是 | 否 | ✓ | ✗ | 開頭 |
w | 文字檔寫入 | 否 | 是(截斷) | ✗ | ✓ | 開頭 |
a | 文字檔附加 | 否 | 是 | ✗ | ✓ | 末尾 |
rb | 二進位檔讀取 | 是 | 否 | ✓ | ✗ | 開頭 |
wb | 二進位檔寫入 | 否 | 是(截斷) | ✗ | ✓ | 開頭 |
ab | 二進位檔附加 | 否 | 是 | ✗ | ✓ | 末尾 |
r+ | 文字檔讀/寫 | 是 | 否 | ✓ | ✓ | 開頭 |
w+ | 文字檔建立讀/寫 | 否 | 是(截斷) | ✓ | ✓ | 開頭 |
a+ | 文字檔開啟讀/寫 | 否 | 是 | ✓ | ✓ | 末尾 |
rb+ | 二進位檔讀/寫 | 是 | 否 | ✓ | ✓ | 開頭 |
wb+ | 二進位檔建立讀/寫 | 否 | 是(截斷) | ✓ | ✓ | 開頭 |
ab+ | 二進位檔開啟讀/寫 | 否 | 是 | ✓ | ✓ | 末尾 |
| 函式 | 原型 | 說明 | 失敗回傳 |
|---|---|---|---|
fgetc | int fgetc(FILE *fp) | 讀取單一字元 | EOF |
fputc | int fputc(int ch, FILE *fp) | 寫入單一字元 | EOF |
fgets | char *fgets(char *buf, int size, FILE *fp) | 讀取一行(含換行、以 \0 結尾) | NULL |
fputs | int fputs(const char *buf, FILE *fp) | 寫入字串(不自動加換行) | EOF |
rewind、fseek、ftellvoid rewind(FILE *fp); // 定位至檔案開頭 int fseek(FILE *fp, long offset, int whence); // 移動讀寫位置 long ftell(FILE *fp); // 取得目前位置(位元組偏移)
whence 取值SEEK_SET:檔案開頭 + offsetSEEK_CUR:目前位置 + offsetSEEK_END:檔案結尾 + offsetfseek 成功回傳 0,失敗 -1。
#include <stdio.h>
int main() {
FILE *fp;
char filename[80];
long length;
printf("Input the file name: ");
gets(filename); // 教學用,實務請用 fgets
fp = fopen(filename, "rb");
if (fp == NULL) {
printf("file not found!\n");
} else {
fseek(fp, 0, SEEK_END);
length = ftell(fp);
printf("the file length %ld bytes\n", length);
fclose(fp);
}
return 0;
}
fread、fwritesize_t fread(void *buffer, size_t size, size_t count, FILE *fp); size_t fwrite(const void *buffer, size_t size, size_t count, FILE *fp);
buffer:資料緩衝區位址size:單一資料項大小(位元組)count:資料項數量#include <stdio.h>
int main() {
FILE *pFile;
float buffer[] = { 2.0, 3.0, 8.0 };
pFile = fopen("myfile.bin", "wb");
fwrite(buffer, 1, sizeof(buffer), pFile); // 寫入整個陣列位元組
fclose(pFile);
float read[3];
pFile = fopen("myfile.bin", "rb");
fread(read, 1, sizeof(read), pFile);
printf("%f\t%f\t%f\n", read[0], read[1], read[2]);
fclose(pFile);
return 0;
}
fflushint fflush(FILE *fp);
fp == NULL:刷新所有開啟檔案EOF(錯誤碼存於 errno)fopen 回傳值,失敗時處理錯誤b)跨平台相容性佳,避免換行符轉換差異fgets 保留換行符,處理時需自行移除fread/fwrite 配合 sizeof 計算位元組數,避免硬編碼fclose 釋放資源,確保緩衝區寫入gets(已移除標準),改用 fgets掌握上述 API 與模式,即能應對絕大多數 C 語言檔案處理需求。建議實際撰寫小程式驗證各模式行為,深入體會緩衝機制與隨機存取的威力。