C语言用fwrite写入结构体到TXT文件出现乱码是什么原因?
问题根因
你遇到的乱码问题本质是写入文件的内容是二进制数据而非纯文本数据,用文本编辑器打开二进制文件本身就会出现乱码,具体原因如下:
- 你使用
fwrite直接将内存中Person结构体的原始二进制数据写入文件。结构体中的int、double类型都是以二进制编码(int是补码、double是IEEE754标准)存储在内存中,并非人类可读的字符串形式,写入文件后文本编辑器无法将这些二进制值识别为合法的可显示字符,就会出现?、乱码符号,同时触发编码不匹配的警告。 - 你能在乱码中看到零星的
xpto,是因为结构体中的name字段本身就是ASCII字符串存储,这部分刚好能被文本编辑器正常识别。
解决方案
根据你的使用场景可以选择两种处理方式:
场景1:需要生成可直接用文本编辑器打开的可读文件
不要使用fwrite写入,改用fprintf格式化输出字符串到文件,修改循环内的写入代码即可:
// 替换原来的fwrite(&p, sizeof(Person), 1, fp); fprintf(fp, "%s %d %.2lf\n", p.name, p.age, p.height);
写入完成后再打开文件就是正常的可读内容。
场景2:需要存储结构体数据后续读回程序使用
这种场景下你生成的本身就是二进制文件,不需要用文本编辑器打开,存储时建议把文件后缀改为.dat等二进制文件后缀避免误打开。后续读取数据使用fread即可,示例代码如下:
#include <stdio.h> #include <stdlib.h> typedef struct { int age; double height; char name[64]; } Person; int main() { FILE *fp = fopen("你的二进制文件名", "rb"); if (fp == NULL) { perror("打开文件失败"); return EXIT_FAILURE; } Person tmp; // 循环读取所有结构体数据 while (fread(&tmp, sizeof(Person), 1, fp) == 1) { printf("%s %d %.2lf\n", tmp.name, tmp.age, tmp.height); } fclose(fp); return 0; }
内容的提问来源于stack exchange,提问作者Marcel de Araújo Santos Souza
相关产品推荐
相关产品推荐

