You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

fread读取值后fwrite写入值不一致问题求助

问题分析与解决方案

首先,你的核心问题是在调用free(input_array);之后,仍然尝试访问input_array的成员——这时候内存已经被操作系统回收,指针变成了野指针,你写入的是随机垃圾数据,这就是cheese值不一致的根本原因。

除此之外,你的代码里还有几个语法和逻辑错误,我逐一给你梳理:

1. 结构体定义语法错误

结构体定义的末尾缺少分号,正确写法如下:

struct Data {
    char phone;
    long long int cheese;
    double chicken;
}; // 必须补充分号

2. fread调用的语法错误

第三个fread的参数里括号位置写错了,把sizeof的参数和函数参数混在了一起,正确写法是:

fread(&input_array->chicken, sizeof(input_array->chicken), 1, data_input);

3. 函数名拼写错误

你写的flcose(data_input);是拼写错误,正确的函数名是fclose。

4. 变量名拼写错误

写入文件时你把input_array写成了intput_array,这会导致编译错误,要修正为正确的变量名。

5. 核心逻辑错误:释放内存后访问野指针

你在读取完数据后立刻释放了input_array的内存,之后再用这个指针去写文件,此时指针指向的内存已经不属于你的程序,读取到的是随机值,自然写入的内容和原数据不一致。正确的顺序应该是写完文件后再释放内存。

修正后的完整代码

#include<stdio.h>
#include<stdlib.h>

struct Data {
    char phone;
    long long int cheese;
    double chicken;
};

int main(){
    FILE *data_input;
    FILE *output_file;
    int array_size=10;
    data_input=fopen("input.bin","rb");
    output_file=fopen("output.bin","wb");
    
    struct Data *input_array;
    input_array=malloc(sizeof(struct Data)*array_size);
    
    // 修正后的成员读取
    fread(&input_array->phone, sizeof(input_array->phone), 1, data_input);
    fread(&input_array->cheese, sizeof(input_array->cheese), 1, data_input);
    fread(&input_array->chicken, sizeof(input_array->chicken), 1, data_input);
    
    printf("%i, %llx, %f \n", input_array->phone, input_array->cheese, input_array->chicken);
    
    // 修正变量名拼写,先写入文件
    fwrite(&input_array->phone, sizeof(input_array->phone), 1, output_file);
    fwrite(&input_array->cheese, sizeof(input_array->cheese), 1, output_file);
    fwrite(&input_array->chicken, sizeof(input_array->chicken), 1, output_file);
    
    // 关闭文件、释放内存的正确顺序
    fclose(data_input);
    fclose(output_file);
    free(input_array);
    
    return 0;
}

另外,其实你可以直接一次性读写整个结构体,不用分开操作每个成员,代码会更简洁且不易出错:

// 替换三个fread为:
fread(input_array, sizeof(struct Data), 1, data_input);

// 替换三个fwrite为:
fwrite(input_array, sizeof(struct Data), 1, output_file);

内容的提问来源于stack exchange,提问作者Jack Nagle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 13:57:44