首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

深入解析 C 語言 fread 函數:二進位檔案讀取的核心工具

     編輯:關於C語言

fread 函數概述

在 C 語言標準庫中,fread 是用於從檔案流讀取二進位資料的核心函數。它能夠高效地將指定數量、指定大小的資料元素從檔案流讀取到記憶體緩衝區中,是處理二進位檔案(如圖片、音訊、自定義結構體資料)不可或缺的工具。

函數原型與參數詳解

size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
  • buffer:接收資料的記憶體位址,空間大小至少需為 size * count 位元組。
  • size:單一資料元素的大小(以位元組為單位)。
  • count:要讀取的元素個數。
  • stream:輸入檔案流指標(由 fopen 回傳)。

回傳值與錯誤處理

函數回傳實際成功讀取的元素個數(而非位元組數)。若回傳值小於 count,表示可能遇到檔案結尾(EOF)或發生讀取錯誤。此時應搭配 feof() 與 ferror() 進一步判斷具體原因:

  • feof(stream) 非零 → 已到達檔案結尾
  • ferror(stream) 非零 → 發生讀取錯誤

經典範例:寫入後讀取驗證

#include <stdio.h>
#include <string.h>

int main(void) {
    FILE *stream;
    char msg[] = "this is a test";
    char buf[20];

    /* 以 w+ 模式開啟:可讀寫,若檔案存在則截斷,否則建立 */
    if ((stream = fopen("DUMMY.FIL", "w+")) == NULL) {
        fprintf(stderr, "Cannot open output file.\n");
        return 1;
    }

    /* 寫入資料:包含結尾的 null 字元 */
    fwrite(msg, 1, strlen(msg) + 1, stream);

    /* 將檔案指標移回開頭 */
    fseek(stream, 0, SEEK_SET);

    /* 讀取資料並顯示 */
    fread(buf, 1, strlen(msg) + 1, stream);
    printf("%s\n", buf);

    fclose(stream);
    return 0;
}

MSDN 風格範例:批次讀寫字元陣列

#include <stdio.h>

void main(void) {
    FILE *stream;
    char list[30];
    int i, numread, numwritten;

    /* 以文字模式開啟寫入 */
    if ((stream = fopen("fread.out", "w+t")) != NULL) {
        for (i = 0; i < 25; i++)
            list[i] = (char)('z' - i);  /* 填入 'z' 到 'a' */

        numwritten = fwrite(list, sizeof(char), 25, stream);
        printf("Wrote %d items\n", numwritten);
        fclose(stream);
    } else {
        printf("Problem opening the file\n");
    }

    /* 以文字模式開啟讀取 */
    if ((stream = fopen("fread.out", "r+t")) != NULL) {
        numread = fread(list, sizeof(char), 25, stream);
        printf("Number of items read = %d\n", numread);
        printf("Contents of buffer = %.25s\n", list);
        fclose(stream);
    } else {
        printf("File could not be opened\n");
    }
}

實務應用提醒

  • 讀取結構體陣列時,務必確認 size 為 sizeof(結構體類型),count 為元素個數。
  • 跨平台處理二進位檔案時,注意位元組序(Endianness)與結構體對齊(Padding)差異。
  • 大量資料讀取建議搭配 setvbuf 調整緩衝區大小以提升效能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved