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