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

C語言數據塊文件讀寫:fread 與 fwrite 完整指南

     編輯:C 語言基礎

什麼是數據塊讀寫?

fread 和 fwrite 以「塊」為單位進行文件讀寫,一塊可以是任意字節數據(結構體、數組、基本類型等),不受行、字符串限制,是二進制文件操作的核心函數。

函數原型詳解

size_t fread(void *ptr, size_t size, size_t count, FILE *fp);
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *fp);

理論讀寫字節數 = size * count。返回值為成功讀寫的塊數(非字節數)。

返回值判斷邏輯

參數說明
ptr內存緩衝區指針(數組、結構體、變量地址)
size每個數據塊的字節數(如 sizeof(int)、sizeof(struct Stu))
count要讀寫的塊數
fp文件指針

實戰示例 1:整數數組存取

#include <stdio.h>

#define N 5

int main() {
    int a[N], b[N];
    FILE *fp;
    int i, size = sizeof(int);
    
    if ((fp = fopen("D:\\demo.txt", "rb+")) == NULL) {
        printf("Cannot open file!\n");
        return 1;
    }
    
    printf("請輸入 %d 個整數:\n", N);
    for (i = 0; i < N; i++) scanf("%d", &a[i]);
    
    // 寫入數組
    fwrite(a, size, N, fp);
    
    // 重置指針到文件開頭
    rewind(fp);
    
    // 讀取到數組 b
    fread(b, size, N, fp);
    
    printf("讀取結果:\n");
    for (i = 0; i < N; i++) printf("%d ", b[i]);
    printf("\n");
    
    fclose(fp);
    return 0;
}

運行結果

請輸入 5 個整數:
23 409 500 100 222
讀取結果:
23 409 500 100 222

實戰示例 2:結構體數組存取(學生信息)

#include <stdio.h>

#define N 2

struct Student {
    char name[10];
    int num;
    int age;
    float score;
};

int main() {
    struct Student writeStu[N], readStu[N];
    FILE *fp;
    int i;
    
    if ((fp = fopen("d:\\demo.txt", "wb+")) == NULL) {
        printf("Cannot open file!\n");
        return 1;
    }
    
    printf("請輸入 %d 位學生信息:\n", N);
    for (i = 0; i < N; i++) {
        scanf("%s %d %d %f", writeStu[i].name, &writeStu[i].num,
              &writeStu[i].age, &writeStu[i].score);
    }
    
    fwrite(writeStu, sizeof(struct Student), N, fp);
    rewind(fp);
    fread(readStu, sizeof(struct Student), N, fp);
    
    printf("\n讀取結果:\n");
    for (i = 0; i < N; i++) {
        printf("%s %d %d %.2f\n", readStu[i].name, readStu[i].num,
               readStu[i].age, readStu[i].score);
    }
    
    fclose(fp);
    return 0;
}

關鍵點總結

  • 必須用二進制模式("rb+"、"wb+")打開文件,否則數據可能被轉換損壞
  • 結構體因內存對齊,不同編譯器/平台大小可能不同,跨平台讀寫需注意
  • 寫入後指針在文件末尾,讀取前必須 rewind 或 fseek 回開頭
  • 文件後綴名無關緊要(.txt/.dat/.bin 均可),關鍵在打開模式
  • size_t 為無符號整數類型(stddef.h 定義),用於表示大小/計數

fread/fwrite vs fprintf/fscanf 選擇指南

函數返回值 < count 時檢測函數
fwrite寫入錯誤(磁盤滿、權限等)ferror(fp)
fread讀到 EOF 或發生錯誤feof(fp) / ferror(fp)
場景推薦函數理由
配置文件、日誌、需人工閱讀/編輯fprintf/fscanf文本可讀、跨平台
高性能數據存儲、大量結構體、內部數據fwrite/fread速度快、體積小、無格式轉換
跨語言/跨平台數據交換視協議而定JSON/Protobuf 等更標準
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved