全面梳理 C 語言檔案操作核心概念,從資料檔分類到完整操作流程,附圖解與常見陷阱。
| 類型 | 儲存形式 | 特點 | 適用場景 |
|---|---|---|---|
| 文字檔 | ASCII/UTF-8 字元 | 可讀、可編輯、跨平台 | 設定檔、日誌、資料交換 |
| 二進位檔 | 記憶體映像 (位元級) | 緊湊、快速、結構化 | 資料庫、多媒體、高效能儲存 |
判別技巧:用記事本開啟,亂碼 = 二進位檔;可讀 = 文字檔。
FILE *fp; // 檔案指標變數,指向檔案控制結構體 // 內部包含:檔案描述符、緩衝區指標、位置指標、錯誤旗標、模式旗標...
FILE 為不透明型別,僅透過標準庫函數操作,不可直接存取成員。
fp = fopen("path", "mode")fgetc/fputc, fgets/fputs, fscanf/fprintf, fread/fwritefclose(fp) (釋放緩衝區、更新元資料、釋放檔案鎖)鐵律:每次 fopen 必配對 fclose,否則資源洩漏、資料遺失。
| 模式 | 讀 | 寫 | 建立 | 截斷 | 定位 | 二進位 |
|---|---|---|---|---|---|---|
| r | ✓ | 開頭 | ||||
| w | ✓ | ✓ | ✓ | 開頭 | ||
| a | ✓ | ✓ | 結尾 | |||
| r+ | ✓ | ✓ | 開頭 | |||
| w+ | ✓ | ✓ | ✓ | ✓ | 開頭 | |
| a+ | ✓ | ✓ | ✓ | 結尾 | ||
| rb/wb/ab... | 同上 | 同上 | 同上 | 同上 | 同上 | ✓ |
| 層級 | 函數 | 單位 | 適用 |
|---|---|---|---|
| 字元 | fgetc/fputc, getc/putc | 1 byte | 簡單文字處理 |
| 行/字串 | fgets/fputs | 字串 | 逐行文字處理 |
| 格式化 | fscanf/fprintf | 依格式 | 結構化文字 |
| 區塊/二進位 | fread/fwrite | 位元組 | 結構體、陣列、高效能 |
| 隨機存取 | fseek/ftell/rewind | 位元組偏移 | 資料庫、索引檔 |
const char *str = "Hello";
for (int i = 0; str[i]; i++) {
fputc(str[i], fp);
}
int ch;
while ((ch = fgetc(fp)) != EOF) {
putchar(ch);
}
// 注意:ch 必須是 int,不可用 char
#include <stdio.h>
#include <string.h>
typedef struct {
int id;
char name[32];
float score;
} Student;
void writeStudents(const char *path, Student *arr, int n) {
FILE *fp = fopen(path, "wb");
if (!fp) return;
fwrite(arr, sizeof(Student), n, fp);
fclose(fp);
}
void readStudents(const char *path) {
FILE *fp = fopen(path, "rb");
if (!fp) return;
Student s;
while (fread(&s, sizeof(Student), 1, fp) == 1) {
printf("ID:%d Name:%s Score:%.1f\n", s.id, s.name, s.score);
}
fclose(fp);
}
\r\n ↔ \n 轉換只在文字模式發生fflush(fp) 強制寫入磁碟,關鍵日誌必須呼叫ferror(fp) 檢測讀寫錯誤,feof(fp) 檢測檔案結尾fseeko/ftello (off_t) 或 _fseeki64 處理 >2GB 檔案tmpfile() 自動建立/刪除,安全無殘留