C語言 fopen 函式教學:開啟、讀寫檔案與安全實例全解析

C語言 fopen 的使用方法與實作範例

1. 什麼是 fopen

fopen 是 C 語言中用來進行檔案操作的標準函式。當需要讀取或寫入檔案時,會使用這個函式,作為程式與檔案之間的橋樑。打開檔案時需先使用 fopen,之後才能進行讀寫等操作。

1.1 fopen 的語法與參數

fopen 的基本語法如下:

FILE *fopen(const char *filename, const char *mode);
  • filename:指定要開啟的檔案名稱(或路徑)。
  • mode:指定打開檔案的模式。

1.2 fopen 的模式

根據需求,打開檔案時可以選擇不同的模式:

  • "r":以讀取模式開啟檔案(檔案不存在時會失敗)。
  • "w":以寫入模式開啟檔案(檔案若存在內容會被清空,否則新建檔案)。
  • "a":以附加模式開啟檔案(檔案不存在時會新建檔案)。
  • "rb""wb""ab":以二進位模式進行讀取、寫入、附加。

另外還有 r+w+a+ 等可同時讀寫的模式。每個模式有其特定用途,請根據檔案操作需求選擇合適的模式。

2. fopen 的基本用法

2.1 開啟檔案

以下範例說明如何使用 fopen 開啟檔案:

#include <stdio.h>

int main(void) {
    FILE *fp;

    // 以讀取模式開啟 test.txt
    fp = fopen("test.txt", "r");

    if (fp == NULL) {
        printf("無法開啟檔案。\n");
        return -1;
    }

    // 開啟成功後的處理
    fclose(fp);

    return 0;
}

2.2 錯誤處理

fopen 開啟檔案失敗時會回傳 NULL。例如檔案不存在或權限不足等,都可能導致開啟失敗,因此一定要進行錯誤檢查。

if (fp == NULL) {
    perror("檔案開啟錯誤");
    return -1;
}

2.3 關閉檔案

開啟檔案後,務必要使用 fclose 關閉檔案。若忘記關閉,可能導致記憶體洩漏或檔案資源不足等問題。

fclose(fp);
侍エンジニア塾

3. 檔案的讀取與寫入

3.1 讀取檔案

開啟檔案後,可以利用不同方式讀取內容。以下示範使用 fgets 逐行讀取:

#include <stdio.h>

int main(void) {
    FILE *fp;
    char buffer[256];

    // 以讀取模式開啟 test.txt
    fp = fopen("test.txt", "r");

    if (fp == NULL) {
        printf("無法開啟檔案。\n");
        return -1;
    }

    // 逐行讀取
    while (fgets(buffer, sizeof(buffer), fp) != NULL) {
        printf("%s", buffer);
    }

    fclose(fp);
    return 0;
}

3.2 寫入檔案

要寫入檔案時,先用 fopen 開啟檔案,然後使用 fprintffputs 寫入資料:

#include <stdio.h>

int main(void) {
    FILE *fp;

    // 以寫入模式新建 test.txt
    fp = fopen("test.txt", "w");

    if (fp == NULL) {
        printf("無法開啟檔案。\n");
        return -1;
    }

    // 寫入字串
    fprintf(fp, "Hello, World!\n");

    fclose(fp);
    return 0;
}

3.3 檔案追加內容

要在現有檔案末尾追加資料,請使用 fopen"a"(追加)模式:

fp = fopen("test.txt", "a");

這種模式會保留原有內容並將新資料加在檔案末尾。

4. fopen 的進階應用

4.1 二進位檔案操作

若要操作二進位檔案,請使用 "rb""wb" 模式。以下為將結構寫入檔案的範例:

#include <stdio.h>

typedef struct {
    int id;
    char name[50];
} Record;

int main(void) {
    FILE *fp;
    Record record = {1, "Sample"};

    // 以寫入二進位模式建立 data.bin
    fp = fopen("data.bin", "wb");

    if (fp == NULL) {
        printf("無法開啟檔案。\n");
        return -1;
    }

    // 寫入結構體
    fwrite(&record, sizeof(Record), 1, fp);

    fclose(fp);
    return 0;
}

4.2 使用 fopen_s 進行更安全的檔案操作

fopen_s 是出於安全考量而設計的 fopen 安全版本。開啟檔案失敗時會回傳錯誤碼,更方便進行錯誤處理。

errno_t err;
err = fopen_s(&fp, "test.txt", "r");

if (err != 0) {
    printf("無法開啟檔案。\n");
    return err;
}

使用 fopen_s 可提升程式碼安全性。

5. 常見問題與最佳實踐

5.1 錯誤檢查

操作檔案時務必進行錯誤檢查。不論是 fopen 回傳值,或 fgets 結果,都應確認並適當處理錯誤。

5.2 記憶體管理

操作檔案時,請記得用 fclose 關閉檔案。否則可能導致系統資源耗盡或資料不一致等問題。

5.3 安全性考量

使用 fopen 時,請檢查檔案路徑與存取權限等安全問題。如有需要,也可使用 fopen_s,進一步提升檔案操作的安全性。

6. 結語

fopen 是 C 語言檔案操作的基礎函式。正確使用並搭配錯誤檢查與安全性措施,可讓檔案操作更加安全且有效率。