如何将文件内容读取到结构体并实现指定格式转换输出?
问题2:用fread读取二进制文件到结构体是否可行?
答案是:只有当二进制文件的存储格式和你的结构体在内存中的布局完全匹配时,才可以直接用fread读取。
简单来说,如果这个二进制文件是之前用fwrite直接写入struct person类型数据(比如结构体数组)生成的,那完全没问题;但如果这个二进制文件只是把NAME#SURNAME AGE这类文本按字节存起来的,那绝对不能直接用fread读结构体,必须按文本方式读取后拆分(就像问题1那样处理)。
假设文件是正确的结构体二进制存储,具体操作如下:
- 以二进制模式打开输入输出文件:
FILE *input_fp = fopen("persons.bin", "rb"); FILE *output_fp = fopen("filtered.txt", "w"); if (!input_fp || !output_fp) { perror("File open failed"); return 1; } - 循环读取每个结构体,筛选年龄大于15的内容输出:
struct person p; // 每次读取一个person结构体的大小 while (fread(&p, sizeof(struct person), 1, input_fp) == 1) { if (p.age > 15) { // 按NAME AGE SURNAME格式写入输出文件 fprintf(output_fp, "%s %d %s\n", p.name, p.age, p.surname); } } - 最后记得关闭文件:
fclose(input_fp); fclose(output_fp);
这里有几个需要注意的坑:
- 内存对齐:不同编译器可能会给结构体成员之间加填充字节(比如
char name[10]后面补2个字节对齐到int的地址),如果原文件是用不同编译器或对齐规则生成的,直接fread会导致数据错位。可以用#pragma pack(push, 1)和#pragma pack(pop)强制按1字节对齐,读写都用同样规则。 - 字符串结束符:结构体里的
name和surname是固定长度数组的话,写入时一定要确保加了\0,否则读取后打印会出乱码。 - 二进制模式:打开文件必须用
rb(读二进制),不然Windows系统会自动转换换行符,破坏二进制数据。
内容的提问来源于stack exchange,提问作者Dongilica
相关产品推荐
相关产品推荐

