题目
把 n 个整数写入二进制文件再读回验证
思路
本题把 n 个整数以二进制形式写入文件,再读回并与原数组比较。
写:fwrite(a, sizeof(int), n, fp);关闭后重新打开读入到 b,逐项比较 a[i]==b[i] 验证一致。
解题分析
fwrite 写二进制块,fread 读回比较。注意 sizeof(int) 与平台有关,同一机器读写一致。先写 n 再写数组便于读回长度。
函数简要说明
本题用二进制方式写盘再读回,与文本模式的 "r"/"w" 不同:
fopen(path, "wb"):二进制写;"rb"二进制读。不按行解释字节,适合int等原始内存布局。fwrite(ptr, size, count, fp):把内存中count个、每个size字节的数据写入文件;例如fwrite(&n, sizeof n, 1, fp)写入一个 int。fread(ptr, size, count, fp):从文件读到内存,参数含义与fwrite对称。sizeof:类型/变量字节数;同一编译环境下读写int大小一致。先写长度n再写数组,读回时才知道读几个元素。
完整程序
#include <stdio.h>
int main(void)
{
int n, a[100], b[100];
if (scanf("%d", &n) != 1 || n < 1 || n > 100) {
return 1;
}
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
FILE *fw = fopen("data.bin", "wb");
fwrite(&n, sizeof n, 1, fw);
fwrite(a, sizeof a[0], (size_t)n, fw);
fclose(fw);
FILE *fr = fopen("data.bin", "rb");
int m;
fread(&m, sizeof m, 1, fr);
fread(b, sizeof b[0], (size_t)m, fr);
fclose(fr);
int ok = (m == n);
for (int i = 0; ok && i < n; i++) {
if (a[i] != b[i]) {
ok = 0;
}
}
printf("%s\n", ok ? "ok" : "fail");
return 0;
}