题目

演示二进制文件操作:先将包含 n 个整数的数组以纯二进制形式写入磁盘文件,随后再重新打开文件读回内存数组中,比对验证写入与读取的数据完全一致。

输入格式:第一行输入整数个数 n;第二行输入 n 个整数。

输出格式:读回验证成功输出 ok,数据不一致或读写失败输出 mismatch。

数据范围与约定:1 ≤ n ≤ 1000。

思路与算法

1. 二进制写入 fwrite
以 "wb" 模式打开文件,调用 fwrite(arr, sizeof(int), n, fp); 将整块内存数据按二进制字节序列直接落盘。

2. 二进制读回 fread
以 "rb" 模式打开文件,调用 fread(buf, sizeof(int), n, fp); 还原内存数据。二进制读写效率显著高于文本序列化解析。

完整程序

#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]);
    }

    // 以二进制写模式 ("wb") 打开文件
    FILE *fw = fopen("data.bin", "wb");
    // fwrite 直接将内存中的二进制字节流写入文件
    fwrite(&n, sizeof n, 1, fw);
    fwrite(a, sizeof a[0], (size_t)n, fw);
    fclose(fw);

    // 以二进制读模式 ("rb") 读回文件
    FILE *fr = fopen("data.bin", "rb");
    int m;
    // fread 原样读入二进制数据到目标内存
    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;
}