1. 前言
 C語言是學習程式設計基礎時非常重要的語言,且在許多場合中被廣泛使用。其中「檔案建立」是程式處理外部資料時不可或缺的基本技術之一。本文將聚焦於 C 語言的檔案操作,特別是檔案建立,並以易於初學者理解的方式說明。檔案操作的重要性
 在執行程式後需要保存取得的資料,或是利用外部輸入資料時,都需要檔案操作。例如,在以下情境中檔案操作相當有用。- 日誌資料的保存 程式的運作紀錄與錯誤資訊會被記錄,之後可供分析。
 - 設定檔的管理 將使用者可變更的設定儲存於外部檔案,程式啟動時讀取。
 - 類似資料庫的使用 以檔案方式進行小規模資料的保存與管理。
 
 這些應用範例在實際程式開發中常被需求。學習 C 語言的檔案建立,將大幅提升程式的實用性。本文的目的
 本文的目的在於讓首次學習使用 C 語言「建立檔案方法」的讀者,能夠理解基本的檔案操作,並自行撰寫程式碼執行。此外,亦會涉及錯誤處理與應用範例,旨在培養接近實務的技能。目標讀者
 本文的對象讀者如下:- 剛開始學習 C 語言的初學者
 - 想了解檔案操作基礎的人
 - 預計在程式中需要資料保存與讀寫的人
 
  
2. 檔案操作的基本概念
 C語言中要操作檔案,首先需要了解檔案的基本概念。本節將說明「檔案是什麼」「文字檔與二進位檔的差異」「在 C 語言中執行檔案操作所需的準備」等內容。檔案是什麼
 檔案是一種用來記錄資料的容器。執行程式時,用於將資料儲存至外部,或從外部讀取程式所需的資訊。檔案主要分為以下兩類。- 文字檔
 
- 以人類易於閱讀的格式記錄資料的檔案。
 - 例如:
.txt、.csv 等。 - 文字檔可以以行為單位儲存文字、數字、符號等。
 
- 二進位檔
 
- 以電腦易於處理的格式記錄資料的檔案。
 - 例如:
.bin、.dat、影像檔(例如:.jpg、.png)等。 - 二進位檔不僅儲存文字,還可保存數值、影像資料等各種形式的資訊。
 
文字檔與二進位檔的差異
| 特徵 | 文字檔 | 二進位檔 | 
|---|
| 資料格式 | 人類可讀的格式(如 ASCII、UTF-8 等) | 電腦專用的格式 | 
| 用途 | 設定檔、日誌資料等 | 影像、音訊、資料庫等 | 
| 大小 | 通常較大 | 可更緊湊地儲存 | 
| 操作的容易度 | 可用編輯器輕鬆開啟 | 只能以特定程式讀寫 | 
  重點: 初學者在學習 C 語言時,建議先掌握文字檔的操作,之後再進一步學習二進位檔的操作。在 C 語言中進行檔案操作所需的準備
 在 C 語言中,使用標準函式庫來操作檔案。需要以下準備。標準標頭檔 <stdio.h>
 <stdio.h> 是在 C 語言中執行檔案操作所需的標頭檔。此標頭檔包含用於檔案操作的函式。主要函式如下。fopen: 開啟檔案。fclose: 關閉檔案。fprintf: 寫入檔案。fscanf: 從檔案讀取。fread / fwrite: 操作二進位資料。
檔案指標
 在 C 語言中,執行檔案操作時會使用稱為「檔案指標」的特殊變數。檔案指標以 FILE 型別定義。FILE *fp;
使用此檔案指標可開啟檔案,或讀寫資料。檔案模式
 操作檔案時必須指定模式。模式決定檔案的使用方式(唯讀、唯寫等)。以下整理主要模式。| 模式 | 用途 | 
|---|
"r" | 唯讀(檔案必須已存在) | 
"w" | 唯寫(覆寫已存在的資料) | 
"a" | 追加寫入(保留已存在資料並在其後寫入) | 
"r+" | 讀寫(讀取與寫入) | 
"w+" | 讀寫(覆寫已存在資料) | 
"a+" | 讀取與追加寫入 | 
總結
 本節說明了檔案的基本概念與類型,以及在 C 語言中操作檔案所需的準備。3. 檔案的開啟與關閉
 C 語言中操作檔案的第一步是「開啟檔案」。正確開啟檔案後,就能進行資料的讀寫與編輯。另外,使用過的檔案必須一定要關閉。本節將以具體範例說明檔案的開啟與關閉方法。開啟檔案:fopen 函式
 在 C 語言中,使用 fopen 函式來開啟檔案。此函式的寫法如下。FILE *fopen(const char *filename, const char *mode);
參數說明
filename:以字串指定檔名。例如:"example.txt"mode:指定檔案的使用模式。例如:"r"(唯讀)、"w"(唯寫)等。
返回值
- 若成功開啟檔案,會回傳 
FILE 型別的指標。 - 若無法開啟檔案,會回傳 
NULL。此時需要進行錯誤處理。 
基本使用範例:開啟檔案
 以下範例示範以唯讀模式開啟 example.txt 檔案的程式。#include <stdio.h>
int main() {
    FILE *file;
    // 開啟檔案
    file = fopen("example.txt", "r");
    // 檢查檔案是否成功開啟
    if (file == NULL) {
        printf("無法開啟檔案。\n");
        return 1;
    }
    printf("檔案已成功開啟。\n");
    // 關閉檔案
    fclose(file);
    return 0;
}
重點:- 若檔案未能正確開啟,會顯示錯誤訊息並結束程式。
 - 檔案操作結束後,務必使用 
fclose 函式關閉檔案。 
檔案模式的種類
 依據開啟檔案時的模式,操作內容會有所不同。以下整理常用的模式列表。| 模式 | 用途 | 
|---|
"r" | 唯讀(檔案必須已存在) | 
"w" | 唯寫(若檔案已存在,內容會被刪除) | 
"a" | 追加寫入(若檔案已存在,資料會被加在檔案末端) | 
"r+" | 讀寫(保留既有檔案內容) | 
"w+" | 讀寫(刪除既有檔案內容) | 
"a+" | 讀寫與追加(在檔案末端新增資料的同時,也能讀取內容) | 
關閉檔案:fclose 函式
 檔案開啟後,使用完畢必須呼叫 fclose 函式關閉檔案。若忽略此步驟,可能會產生以下問題。- 記憶體洩漏(檔案指標未被釋放)
 - 資料寫入未完成
 - 系統資源浪費
 
基本語法
int fclose(FILE *stream);
返回值
- 若檔案正常關閉,會回傳 
0。 - 若發生錯誤,會回傳 
EOF。 
範例:關閉檔案
 以下示範關閉檔案的程式。#include <stdio.h>
int main() {
    FILE *file;
    // 開啟檔案
    file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("無法開啟檔案。\n");
        return 1;
    }
    // 檔案操作(省略)
    // 關閉檔案
    if (fclose(file) == 0) {
        printf("檔案已成功關閉。\n");
    } else {
        printf("關閉檔案時發生錯誤。\n");
    }
    return 0;
}
重點:- 透過檢查 
fclose 函式的返回值,可判斷檔案是否正常關閉。 
錯誤檢查的重要性
 在開啟或關閉檔案時,可能會發生錯誤。若在以下情況加入錯誤處理,可提升程式的可靠性。主要錯誤原因
- 指定的檔案不存在(
"r" 模式) - 沒有寫入權限
 - 檔名錯誤
 
錯誤處理範例
if (file == NULL) {
    perror("檔案開啟錯誤");
    return 1;
}
perror 函式可將錯誤原因顯示於標準輸出。總結
fopen 函式用於開啟檔案,fclose 函式用於關閉檔案。- 正確指定檔案模式,並依操作需求選擇適當模式。
 - 加入錯誤處理,可提升檔案操作的安全性與可靠性。
 
  
4. 寫入檔案
 在 C 語言中進行檔案操作時,寫入資料的方法非常重要。本節將說明如何使用 fprintf、fputs、fputc 等函式將資料寫入檔案。此外,透過具體的範例程式碼學習實際的使用方式。檔案寫入的基本
 要將資料寫入檔案,需要遵循以下步驟。- 開啟檔案(使用 
fopen 函式) 若要寫入,模式需指定為 "w"(寫入專用)或 "a"(追加專用)。 - 使用寫入函式將資料保存至檔案。
 - 寫入完成後,使用 
fclose 函式關閉檔案。 
寫入函式的種類
 在 C 語言中,根據用途使用以下寫入函式。1. fprintf 函式
 fprintf 函式用於將格式化的資料寫入檔案。 語法int fprintf(FILE *stream, const char *format, ...);
stream:寫入目標的檔案指標。format:格式指定字串(例如 %d、%s 等)。- 返回值:回傳成功寫入的字元數。
 
 範例:寫入格式化資料#include <stdio.h>
int main() {
    FILE *file = fopen("output.txt", "w");
    if (file == NULL) {
        printf("檔案無法開啟。
");
        return 1;
    }
    fprintf(file, "姓名: %sn年齡: %dn", "山田太郎", 25);
    fclose(file);
    printf("資料已成功寫入。
");
    return 0;
}
2. fputs 函式
 fputs 函式用於將字串直接寫入檔案。 語法int fputs(const char *str, FILE *stream);
str:要寫入的字串。stream:寫入目標的檔案指標。- 返回值:成功時返回非 0,失敗時返回 EOF。
 
 範例:寫入字串#include <stdio.h>
int main() {
    FILE *file = fopen("output.txt", "w");
    if (file == NULL) {
        printf("檔案無法開啟。
");
        return 1;
    }
    fputs("你好,世界!n", file);
    fclose(file);
    printf("字串已成功寫入。
");
    return 0;
}
3. fputc 函式
 fputc 函式用於逐字元寫入檔案。 語法int fputc(int char, FILE *stream);
char:要寫入的字元(以 ASCII 值指定)。stream:寫入目標的檔案指標。- 返回值:成功時返回寫入的字元,失敗時返回 EOF。
 
 範例:逐字元寫入#include <stdio.h>
int main() {
    FILE *file = fopen("output.txt", "w");
    if (file == NULL) {
        printf("檔案無法開啟。
");
        return 1;
    }
    fputc('H', file);
    fputc('e', file);
    fputc('l', file);
    fputc('l', file);
    fputc('o', file);
    fclose(file);
    printf("字元已成功寫入。
");
    return 0;
}
檔案模式與寫入
 依據檔案模式,資料寫入的行為會不同。"w" 模式
- 若檔案不存在,會新建檔案。
 - 若檔案已存在,會覆寫現有資料。
 
"a" 模式
- 若檔案不存在,會新建檔案。
 - 若檔案已存在,會保留現有資料,並在末尾追加新資料。
 
注意事項:寫入錯誤的處理
 在檔案寫入時,可能會發生錯誤。例如,磁碟空間不足或缺乏寫入權限都可能是原因。加入錯誤處理可對這些問題加以因應。 錯誤處理範例if (fprintf(file, "測試資料n") < 0) {
    printf("寫入過程中發生錯誤。
");
}
實作範例:簡易日誌檔案建立程式
 以下為將日誌資料保存至檔案的程式範例。#include <stdio.h>
#include <time.h>
int main() {
    FILE *file = fopen("log.txt", "a");
    if (file == NULL) {
        printf("日誌檔案無法開啟。
");
        return 1;
    }
    time_t now = time(NULL);
    fprintf(file, "日誌記錄: %s", ctime(&now));
    fclose(file);
    printf("日誌已成功記錄。
");
    return 0;
}
總結
- 檔案寫入可使用 
fprintf、fputs、fputc 等函式。 - 適當指定檔案模式(
"w" 或 "a"),以實現符合需求的行為。 - 加入錯誤處理,可提升檔案操作的安全性。
 
  
5. 從檔案讀取
 C 語言在進行檔案操作時,從檔案讀取資料也是基本技能之一。本節將說明使用 fscanf、fgets、fgetc 等函式的資料讀取方法。另外,透過具體範例學習實際從檔案取得資料的方法。檔案讀取的基本
 為了從檔案讀取資料,需要執行以下步驟。- 開啟檔案(使用 
fopen 函式) 讀取時,模式指定為 "r"(唯讀)。 - 使用讀取函式取得資料。
 - 讀取結束後,使用 
fclose 函式關閉檔案。 
讀取函式的種類
 在 C 語言中依需求使用以下函式讀取資料。1. fscanf 函式
 fscanf 函式用於從檔案讀取格式化資料。 語法int fscanf(FILE *stream, const char *format, ...);
stream:要讀取的檔案指標。format:讀取格式(例如 %d、%s)。- 返回值:回傳成功讀取的項目數。失敗時回傳 
EOF。 
 範例:讀取格式化資料#include <stdio.h>
int main() {
    FILE *file = fopen("data.txt", "r");
    if (file == NULL) {
        printf("無法開啟檔案。\n");
        return 1;
    }
    char name[50];
    int age;
    fscanf(file, "%s %d", name, &age);
    printf("姓名: %s, 年齡 %dn", name, age);
    fclose(file);
    return 0;
}
2. fgets 函式
 fgets 函式適合逐行從檔案讀取資料。 語法char *fgets(char *str, int n, FILE *stream);
str:存放讀取資料的陣列。n:最大讀取字元數(不超過 str 的大小)。stream:要讀取的檔案指標。- 返回值成功時回傳 
str,失敗或 EOF 時回傳 NULL。 
 範例:逐行讀取資料#include <stdio.h>
int main() {
    FILE *file = fopen("data.txt", "r");
    if (file == NULL) {
        printf("無法開啟檔案。\n");
        return 1;
    }
    char line[100];
    while (fgets(line, sizeof(line), file) != NULL) {
        printf("%s", line);
    }
    fclose(file);
    return 0;
}
3. fgetc 函式
 fgetc 函式用於逐字元從檔案讀取資料。 語法int fgetc(FILE *stream);
stream:要讀取的檔案指標。- 返回值:回傳讀取的字元(ASCII 值)。失敗或 EOF 時回傳 <>EOF。
 
 範例:逐字元讀取資料#include <stdio.h>
int main() {
    FILE *file = fopen("data.txt", "r");
    if (file == NULL) {
        printf("無法開啟檔案。\n");
        return 1;
    }
    int c;
    while ((c = fgetc(file)) != EOF) {
        putchar(c);
    }
    fclose(file);
    return 0;
}
EOF(End Of File)的處理
 EOF 是表示檔案結尾的特殊值。當讀取函式回傳 EOF 時,表示已到達檔案結尾。 確認 EOF 的範例int c;
while ((c = fgetc(file)) != EOF) {
    putchar(c);
}
注意事項:EOF 通常定義為 -1,但在程式中建議直接與 EOF 比較。
實作範例:讀取設定檔
 以下為從設定檔(例如 config.txt)讀取設定資料的程式範例。 config.txt 的內容username admin
password 12345
程式範例#include <stdio.h>
int main() {
    FILE *file = fopen("config.txt", "r");
    if (file == NULL) {
        printf("無法開啟設定檔。\n");
        return 1;
    }
    char key[50], value[50];
    while (fscanf(file, "%s %s", key, value) != EOF) {
        printf("%s: %sn", key, value);
    }
    fclose(file);
    return 0;
}
執行結果username: admin
password: 12345
總結
- 從檔案讀取資料時,依需求使用 
fscanf、fgets、fgetc 等函式。 - 讀取檔案時,確認 
EOF 以正確處理資料是很重要的。 - 在實務上,可應用於讀取設定檔或日誌檔等。
 
  
6. 二進位檔案的操作
 C語言中,也可以以二進位形式處理檔案。二進位檔案與文字檔不同,對人類而言較難閱讀,但資料大小較小,且可高速讀寫。本節將介紹操作二進位檔案的基礎知識與具體使用範例。什麼是二進位檔案?
 二進位檔案是以原始格式儲存資料的檔案。以下是二進位檔案的特點。- 高效的資料儲存 在二進位格式中,資料會直接保存,因此比文字格式更有效率地儲存資料。
 - 高度的通用性 用於影像檔、音訊檔、壓縮檔等各種格式。
 - 對人類不可讀的格式 若直接用文字編輯器開啟已保存的資料,通常會看到亂碼。
 
操作二進位檔案的主要函式
 在 C 語言中,使用 fread 函式與 fwrite 函式來讀寫二進位資料。1. fread 函式
 fread 函式在從檔案讀取二進位資料時使用。語法size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
ptr:存放讀取資料的指標。size:單一資料的大小(以位元組為單位)。count:要讀取的資料數量。stream:要讀取的檔案指標。
2. fwrite 函式
 fwrite 函式在將二進位資料寫入檔案時使用。語法size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
ptr:指向要寫入資料的指標。size:單一資料的大小(以位元組為單位)。count:要寫入的資料數量。stream:寫入目標的檔案指標。
以二進位模式開啟檔案
 操作二進位檔案時,需在 fopen 函式的模式中加入 "b"。"rb":二進位唯讀。"wb":二進位唯寫。"ab":二進位追加寫入。
範例:以二進位格式儲存數值資料
寫入資料的程式
 以下為將整數資料以二進位格式儲存至檔案的程式。#include <stdio.h>
int main() {
    FILE *file = fopen("data.bin", "wb");
    if (file == NULL) {
        printf("無法開啟檔案。\n");
        return 1;
    }
    int numbers[] = {1, 2, 3, 4, 5};
    size_t size = sizeof(numbers) / sizeof(numbers[0]);
    fwrite(numbers, sizeof(int), size, file);
    fclose(file);
    printf("資料已以二進位格式儲存。\n");
    return 0;
}
讀取資料的程式
 以下為讀取上述儲存的二進位資料的程式。#include <stdio.h>
int main() {
    FILE *file = fopen("data.bin", "rb");
    if (file == NULL) {
        printf("無法開啟檔案。\n");
        return 1;
    }
    int numbers[5];
    fread(numbers, sizeof(int), 5, file);
    printf("讀取的資料: ");
    for (int i = 0; i < 5; i++) {
        printf("%d ", numbers[i]);
    }
    fclose(file);
    return 0;
}
執行結果讀取的資料: 1 2 3 4 5
二進位檔案操作的注意事項
- 資料大小的一致性 使用 
fread 或 fwrite 時,指定正確的大小非常重要。若指定錯誤的大小,會導致資料讀寫失敗。 - 錯誤檢查 若在檔案操作過程中發生錯誤,可使用 
ferror 函式檢查錯誤狀態。 - 資料的可移植性 以二進位格式保存的檔案在不同平台間可能不相容。特別需要注意位元組序(大端序與小端序)的差異。
 
實作範例:結構體資料的儲存與讀取
儲存結構體的程式
 以下為以二進位格式儲存結構體資料的範例。#include <stdio.h>
typedef struct {
    char name[50];
    int age;
    float salary;
} Employee;
int main() {
    FILE *file = fopen("employee.bin", "wb");
    if (file == NULL) {
        printf("無法開啟檔案。\n");
        return 1;
    }
    Employee emp = {"山田太郎", 30, 450000.0};
    fwrite(&emp, sizeof(Employee), 1, file);
    fclose(file);
    printf("已儲存員工資料。\n");
    return 0;
}
讀取結構體的程式
 以下為讀取已儲存的結構體資料的程式。#include <stdio.h>
typedef struct {
    char name[50];
    int age;
    float salary;
} Employee;
int main() {
    FILE *file = fopen("employee.bin", "rb");
    if (file == NULL) {
        printf("無法開啟檔案。\n");
        return 1;
    }
    Employee emp;
    fread(&emp, sizeof(Employee), 1, file);
    printf("姓名: %sn年齡: %dn薪資: %.2fn", emp.name, emp.age, emp.salary);
    fclose(file);
    return 0;
}
執行結果姓名: 山田太郎
年齡: 30
薪資: 450000.00
總結
- 二進位檔案能有效率地儲存資料,並使用 
fread 與 fwrite 進行操作。 - 在檔案模式中指定code>”b” 以二進位模式開啟檔案。
 - 注意資料大小與錯誤檢查,確保正確的檔案操作。
 
  
7. 錯誤處理
 檔案操作時,錯誤是無法避免的。C 語言中,當錯誤發生時適當處理,可提升程式的可靠性與穩定性。本節將說明檔案操作中常見的錯誤,以及偵測與解決的方法。檔案操作中常見的主要錯誤
 以下列出在 C 語言中執行檔案操作時可能發生的一般錯誤。- 無法開啟檔案
 
- 原因:檔案不存在、路徑錯誤,或是權限不足。
 - 解決方法:檢查 
fopen 的返回值以處理錯誤。 
- 寫入或讀取錯誤
 
- 原因:磁碟空間不足,或檔案被設為唯讀。
 - 解決方法:在寫入或讀取操作後檢查錯誤。
 
- 檔案已達結尾(EOF)
 
- 原因:已讀取至檔案末端。
 - 解決方法:正確處理 EOF。
 
- 檔案指標的錯誤使用
 
- 原因:檔案指標無效或已被關閉。
 - 解決方法:確認指標是否為 NULL。
 
錯誤偵測的基本方法
1. 確認 fopen 函式的返回值
 fopen 函式在成功開啟檔案時會返回檔案指標,若發生錯誤則返回 NULL。 範例:無法開啟檔案時的處理FILE *file = fopen("nonexistent.txt", "r");
if (file == NULL) {
    perror("檔案開啟錯誤");
    return 1;
}
要點:2. 確認寫入與讀取錯誤
 使用 fwrite 或 fread 後,確認資料是否正確處理。 範例:fwrite 後的錯誤確認size_t written = fwrite(data, sizeof(int), 5, file);
if (written < 5) {
    printf("資料寫入錯誤發生。\n");
}
範例:fread 後的錯誤確認size_t read = fread(data, sizeof(int), 5, file);
if (read < 5) {
    if (feof(file)) {
        printf("已到達檔案結尾。\n");
    } else if (ferror(file)) {
        printf("讀取時發生錯誤。\n");
    }
}
3. 使用 feof 函式與 ferror 函式
feof 函式 確認檔案是否已達結尾。 返回值:若已達結尾則返回非零值。ferror 函式 確認檔案操作過程中是否發生錯誤。 返回值:若發生錯誤則返回非零值。
 範例:在檔案讀取過程中確認 EOF 與錯誤int c;
while ((c = fgetc(file)) != EOF) {
    putchar(c);
}
if (feof(file)) {
    printf("已到達檔案結尾。\n");
} else if (ferror(file)) {
    printf("檔案讀取時發生錯誤。\n");
}
錯誤處理的最佳實踐
- 盡早進行錯誤處理 在開啟檔案階段偵測錯誤,避免影響後續程式執行。
 - 顯示詳細的錯誤訊息 讓使用者或開發者更容易定位問題,清楚傳達錯誤內容。
 - 確保資源正確釋放 即使發生錯誤,也要適當關閉已開啟的檔案。
 
 範例:檔案操作中的資源釋放FILE *file = fopen("example.txt", "r");
if (file == NULL) {
    perror("檔案開啟錯誤");
    return 1;
}
// 檔案操作(省略)
if (fclose(file) != 0) {
    printf("檔案關閉錯誤發生。\n");
}
實作範例:安全的檔案讀取程式
 以下為在檔案讀取過程中安全處理錯誤的程式範例。#include 
int main() {
    FILE *file = fopen("data.txt", "r");
    if (file == NULL) {
        perror("檔案開啟錯誤");
        return 1;
    }
    char buffer[100];
    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        printf("%s", buffer);
    }
    if (feof(file)) {
        printf("\n正常讀取檔案。\n");
    } else if (ferror(file)) {
        printf("\n讀取時發生錯誤。\n");
    }
    fclose(file);
    return 0;
}
總結
- 在檔案操作過程中的錯誤,可透過檢查 
fopen、fwrite、fread 等函式的返回值來偵測。 - 使用 
feof 與 ferror 來詳細確認檔案狀態。 - 適當實作錯誤處理,可提升程式的可靠性與穩定性。
 

  
8. 應用
 C語言的檔案操作了解後,挑戰進階的操作吧。本節將介紹多檔案同時操作、暫存檔的使用、檔案重新命名與刪除等進階技巧。透過學習這些,您將能夠製作更實務的程式。多檔案同時操作
 C語言中,可以同時開啟多個檔案並操作。藉此可以將日誌檔與錯誤檔分別記錄,實現更複雜的操作。範例:同時操作日誌檔與錯誤檔
#include <stdio.h>
int main() {
    FILE *logFile = fopen("log.txt", "w");
    FILE *errorFile = fopen("error.txt", "w");
    if (logFile == NULL || errorFile == NULL) {
        printf("無法開啟檔案。\n");
        return 1;
    }
    fprintf(logFile, "日誌: 程式正常執行。\n");
    fprintf(errorFile, "錯誤: 偵測到未預期的輸入。\n");
    fclose(logFile);
    fclose(errorFile);
    printf("已記錄日誌與錯誤。\n");
    return 0;
}
重點:- 利用多個
FILE指標,將不同目的的資料分別儲存於不同檔案。 - 確保所有開啟的檔案都能正確關閉。
 
暫存檔的使用
 暫存檔用於程式執行期間暫時保存資料。程式結束時會自動刪除,從安全性與資源管理的角度來說相當便利。使用 tmpfile 函式建立暫存檔
 tmpfile函式可輕鬆建立暫存檔。 範例:暫存檔的使用#include <stdio.h>
int main() {
    FILE *tempFile = tmpfile();
    if (tempFile == NULL) {
        printf("無法建立暫存檔。\n");
        return 1;
    }
    fprintf(tempFile, "此資料暫時保存。\n");
    // 讀取暫存檔內容
    rewind(tempFile);
    char buffer[100];
    fgets(buffer, sizeof(buffer), tempFile);
    printf("暫存檔內容: %s", buffer);
    // 暫存檔會自動刪除
    fclose(tempFile);
    return 0;
}
重點:- 若要重新利用暫存檔內容,請使用
rewind函式將檔案指標移回開頭。 - 檔案會在程式結束時自動刪除,無需手動刪除。
 
檔案的重新命名與刪除
 在 C 語言中,可以對既有檔案進行重新命名(改名)或刪除。rename 函式:檔名變更
 語法int rename(const char *oldname, const char *newname);
oldname:變更前的檔名。newname:變更後的檔名。- 返回值:成功時返回 0,失敗時返回非零值。
 
 範例:檔名變更#include <stdio.h>
int main() {
    if (rename("oldfile.txt", "newfile.txt") == 0) {
        printf("已變更檔名。\n");
    } else {
        printf("檔名變更失敗。\n");
    }
    return 0;
}
remove 函式:檔案刪除
 語法int remove(const char *filename);
filename:要刪除的檔名。- 返回值:成功時返回 0,失敗時返回非零值。
 
 範例:檔案刪除#include <stdio.h>
int main() {
    if (remove("unnecessary.txt") == 0) {
        printf("已刪除檔案。\n");
    } else {
        printf("檔案刪除失敗。\n");
    }
    return 0;
}
重點:- 建議在變更或刪除檔名之前,先確認檔案是否存在。
 - 若刪除或重新命名失敗,請檢查錯誤原因。
 
實作範例:檔案管理工具
 以下是結合重新命名與刪除的簡易檔案管理程式範例。#include <stdio.h>
int main() {
    // 變更檔名
    if (rename("tempfile.txt", "finalfile.txt") == 0) {
        printf("已將檔名變更為 'finalfile.txt'。\n");
    } else {
        printf("檔名變更失敗。\n");
    }
    // 刪除檔案
    if (remove("finalfile.txt") == 0) {
        printf("已刪除檔案 'finalfile.txt'。\n");
    } else {
        printf("檔案刪除失敗。\n");
    }
    return 0;
}
總結
- 同時操作多個檔案,可構建更複雜的程式。
 - 使用暫存檔可提升安全性與效率。
 - 使用 
rename 與 remove,即可輕鬆管理檔案。 
  
9. FAQ(常見問題)
 在此,我們將以問答形式說明關於 C 語言檔案操作,讀者常有的疑問點。從基本疑問到進階內容,提供您加深理解的參考。Q1: fopen函式無法開啟檔案的原因是什麼?
 A1: 可能的原因如下:- 檔案不存在(在 
"r" 模式下)。 - 檔案路徑錯誤。
 - 沒有讀取或寫入的權限。
 - 磁碟空間不足。
 
 解決方法:- 請確認檔案名稱與路徑。
 - 若檔案不存在,請使用 
"w" 模式或 "a" 模式新建。 - 檢查檔案權限,並賦予適當的權限。
 
Q2: "w" 模式與 "a" 模式的差異是什麼?
 A2:"w" 模式(僅寫入)- 若檔案已存在,其內容將全部被刪除。
 - 若檔案不存在,將會新建。
 "a" 模式(僅追加)- 若檔案已存在,保留原有內容,新的資料會被追加至尾端。
 - 若檔案不存在,將會新建。
 
Q3: 文字檔與二進位檔的差異是什麼?
 A3:| 特徵 | 文字檔 | 二進位檔 | 
|---|
| 資料格式 | 人類可讀的格式(如 ASCII、UTF-8 等) | 電腦專用的格式 | 
| 用途 | 設定檔、日誌資料等 | 影像、音訊、資料庫等 | 
| 大小 | 通常較大 | 可更緊湊儲存 | 
| 操作的便利性 | 可用編輯器輕鬆開啟 | 只能透過特定程式讀寫 | 
  重點: 初學者建議先從文字檔操作開始。Q4: 若在檔案操作過程中發生錯誤,該如何處理?
 A4: 發生錯誤時,請確認以下項目:- 檔案指標的確認: 開檔時確認 
fopen 是否未返回 NULL。 - 錯誤訊息的顯示: 使用 
perror 函式顯示詳細錯誤資訊。 - 活用 
ferror 與 feof: 在讀寫過程中若發生錯誤,使用這些函式檢查狀態。 
Q5: 若不關閉檔案會發生什麼情況?
 A5:- 資料可能無法正確保存。
 - 已開啟的檔案若未關閉,會導致記憶體洩漏或資源不足。
 - 特別是程式同時開啟多個檔案時,未關閉的檔案增多會增加系統負荷。
 
 解決方法:Q6: 在讀寫二進位檔時需注意哪些事項?
 A6:- 資料大小: 使用 
fread 或 fwrite 時,正確設定資料大小。 - 位元組順序的差異: 在不同平台間使用二進位檔時,請注意位元組順序(大端序與小端序)的差異。
 - 資料完整性: 正確開關檔案,避免資料遺失。
 
Q7: EOF(檔案結尾)是什麼?
 A7: EOF(End Of File)是表示已到達檔案結尾的特殊值。可使用以下函式檢查 EOF: 檢查 EOF 的範例:int c;
while ((c = fgetc(file)) != EOF) {
    putchar(c);
}
注意: EOF 通常定義為 -1,但在程式中建議使用 EOF 進行比較。Q8: 如何有效學習 C 語言的檔案操作?
 A8:- 紮實學習基礎: 掌握 
fopen、fclose、fprintf、fscanf 等基本函式的使用方法。 - 實作專案: 透過保存日誌檔或建立簡易資料庫等小型專案,深化理解。
 
總結
- 在 FAQ 章節中,我們全面說明了關於 C 語言檔案操作的常見問題。
 - 請學習從基本操作到錯誤處理的實用知識。
 - 若有不明之處,請先參考文件或參考手冊。
 
  
10. 總結
 在本文中,我們系統性地解說了 C 語言的檔案操作,從基礎到應用。檔案操作是程式與外部資料交互不可或缺的技術,且可廣泛應用於各種用途。本節將回顧全文要點,並介紹面向下一步的建議。重點回顧
1. 基本概念
- 檔案分為文字格式與二進位格式,各自用途不同。
 - 在 C 語言進行檔案操作時,使用 
<stdio.h> 標頭檔。 
2. 檔案操作的基本
- 使用 
fopen 函式開啟檔案,選擇適當的模式(例如:"r", "w")。 - 開啟檔案後,必須使用 
fclose 函式關閉。 
3. 寫入與讀取
- 寫入時,使用 
fprintf 或 fputs 等將資料保存。 - 讀取時,使用 
fscanf 或 fgets 從檔案取得資料。 
4. 二進位檔案操作
- 在二進位檔案中,使用 
fread 與 fwrite 高效地讀寫資料。 - 透過保存與讀取結構體,可處理複雜的資料結構。
 
5. 錯誤處理
- 考慮檔案操作中可能發生錯誤,加入使用 
ferror 或 feof 的錯誤處理。 
6. 應用操作
- 熟練同時操作多個檔案、使用暫存檔、檔案重新命名與刪除等應用技巧,即可構建更實務的程式。
 
對下一步的建議
 掌握 C 語言檔案操作的基礎後,挑戰以下步驟吧。- CSV 與 JSON 檔案的操作
 
- 根據檔案格式建立對應的解析器,實作資料的讀寫。
 - 例:將學生成績資料保存為 CSV 檔案,讀取後進行分析。
 
- 加強錯誤處理
 
- 建立記錄檔案操作錯誤的日誌系統,提高程式的可靠性。
 
- 多執行緒環境下的檔案操作
 
- 利用檔案操作的專案開發
 
- 開發實務程式,深化檔案操作技能。
 - 例:簡易資料庫、設定管理工具、日誌收集程式等。
 
最後
 C 語言的檔案操作是提升程式實用性的重要技能。雖然起初可能感到困難,但只要掌握基礎並不斷實踐,就能確實深化理解。希望透過本文,您能對檔案操作充滿信心,並建立挑戰更複雜專案的基礎。