FILE 結構與檔案指標
FILE *fp; // 檔案指標
fp = fopen("data.txt", "r"); // 開啟,模式:r/w/a/r+/w+/a+/rb/wb...
if (!fp) { perror("open"); exit(1); }
核心操作函數族
| 類別 | 函數 | 說明 |
| 字元 | fgetc/fputc | 單字元讀寫 |
fgets/fputs | 行讀寫(含 \n) |
| 格式化 | fscanf/fprintf | 類 scanf/printf |
fread/fwrite | 二進位區塊讀寫 |
| 定位 | fseek/rewind/ftell | 隨機存取 |
| 狀態 | feof/ferror | 檢測結束/錯誤 |
範例 1:檔案複製(字元級)
int main(int argc, char *argv[]) {
if (argc != 3) return 1;
FILE *fr = fopen(argv[1], "r"), *fw = fopen(argv[2], "w");
int ch;
while ((ch = fgetc(fr)) != EOF) fputc(ch, fw);
fclose(fr); fclose(fw);
return 0;
}
範例 2:合併兩個已排序整數檔(二進位)
int main(int argc, char *argv[]) {
if (argc != 4) return 1;
FILE *f1 = fopen(argv[1], "rb"), *f2 = fopen(argv[2], "rb"), *f3 = fopen(argv[3], "wb");
int x, y;
fread(&x, sizeof(int), 1, f1);
fread(&y, sizeof(int), 1, f2);
while (!feof(f1) && !feof(f2)) {
if (x < y) { fwrite(&x, sizeof(int), 1, f3); fread(&x, sizeof(int), 1, f1); }
else { fwrite(&y, sizeof(int), 1, f3); fread(&y, sizeof(int), 1, f2); }
}
while (!feof(f1)) { fwrite(&x, sizeof(int), 1, f3); fread(&x, sizeof(int), 1, f1); }
while (!feof(f2)) { fwrite(&y, sizeof(int), 1, f3); fread(&y, sizeof(int), 1, f2); }
fclose(f1); fclose(f2); fclose(f3);
return 0;
}
關鍵提醒
- 二進位模式
rb/wb 避免換行符轉換;
fread/fwrite 回傳實際讀寫**項目數**,而非位元組數;
- 檔案結束判斷:讀取函數回傳 0 或
feof(fp) 為真;
- 隨機存取:
fseek(fp, offset, SEEK_SET/CUR/END)。