C語言 fread() 函式完整教學:二進位檔案高效讀取方法與實例

1. fread() 的概述

fread() 是 C 語言中用來從資料流讀取二進位資料到程式中的函式。這個函式通常用於高效地將檔案內容讀入緩衝區,特別適合大量資料的讀取或處理影像、音訊等二進位檔案。

1.1. fread() 的基本用法

fread() 的基本語法如下:

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
  • ptr:用來存放讀取資料的緩衝區指標
  • size:每個元素的大小(以位元組為單位)
  • nmemb:要讀取的元素個數
  • stream:欲讀取的資料流指標

2. fread() 的運作方式與回傳值

2.1. fread() 的運作方式

fread() 會從指定的資料流讀取指定數量的位元組,並存入由 ptr 指定的緩衝區。該函式會嘗試讀取 nmemb 個元素,總大小為 size * nmemb 位元組。

2.2. fread() 的回傳值

fread() 會回傳實際讀取到的元素數量。一般來說,這個值應等於 nmemb,但如果遇到 EOF(檔案結尾)或發生錯誤,則回傳值會小於 nmemb

3. fread() 的使用範例

3.1. 簡單的程式碼範例

以下程式碼展示如何使用 fread() 從二進位檔案讀取資料的基本範例。

#include <stdio.h>

int main() {
    FILE *file;
    char buffer[10];

    file = fopen("example.bin", "rb");
    if (file == NULL) {
        printf("無法開啟檔案。\n");
        return 1;
    }

    size_t bytesRead = fread(buffer, sizeof(char), 10, file);
    printf("已讀取 %zu 位元組。\n", bytesRead);

    fclose(file);
    return 0;
}

在這個例子中,會開啟名為 “example.bin” 的二進位檔案,並讀取 10 個位元組。若 fread() 執行成功,則會顯示實際讀取到的位元組數。

4. fread() 的注意事項與技巧

4.1. 緩衝區大小的注意

使用 fread() 時,請確保緩衝區的大小足夠。如果指定的大小不正確,可能會發生緩衝區溢位,導致程式出現異常行為。

4.2. EOF 與錯誤檢查

fread() 遇到 EOF 或發生錯誤時,回傳值會小於 nmemb。因此,為了判斷是否已完成讀取或發生錯誤,務必檢查回傳值。

5. 與其他函式的比較

5.1. fread() 與 fgets() 的差異

fread() 適用於二進位資料的讀取,而 fgets() 則主要用於讀取文字資料。fgets() 會讀取到換行字元為止,因此適合處理文字檔。

5.2. fread() 與 fscanf() 的差異

fscanf() 用於依據指定格式讀取資料,而 fread() 則是直接讀取二進位資料,不依賴特定格式。

6. fread() 的進階用法

6.1. 結構體的讀取

fread() 也能用來直接讀取結構體等複雜資料型態的二進位內容。例如,可以將結構體寫入檔案後再重新讀回,如下所示:

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

Record record;
fread(&record, sizeof(Record), 1, file);

6.2. 效能上的考量

fread() 能夠高效讀取大量資料,比起 fgetc() 這類一次讀取一個位元組的函式更快。處理大型檔案時,建議採用 fread() 這種區塊讀取方式來提升效能。

7. 結論

fread() 是 C 語言中讀取二進位資料的重要函式。正確使用可以高效又安全地將檔案內容導入程式。熟練運用此函式,能讓你在二進位檔案操作上更進一步。

侍エンジニア塾