题目

把 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;
}