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
相关产品推荐
相关产品推荐

