为何用fwrite向文本文件写入结构体数据后内容不可读?
为什么用fwrite将结构体写入文本文件会出现乱码?
这是个非常常见的新手问题——核心是你混淆了二进制写入和文本写入的差异,咱们来详细说清楚:
1. fwrite是二进制写入工具,不是文本写入工具
fwrite(&t, sizeof(t), 1, fptr); 干的事情很简单:把结构体t在内存中占用的所有字节原封不动地拷贝到文件里。它完全不关心这些字节是不是能被文本编辑器正常解析的字符——哪怕是内存里的垃圾值、字符串结束符,都会被一股脑写进去。
而「文本文件」的要求是:内容由可打印的字符(比如字母、数字、标点)组成,fwrite显然不满足这个场景的需求。
2. 你的结构体内存里有大量非文本数据
看你提供的十六进制转储就能找到答案:
- 你输入的
'0'对应ASCII码0x30,后面跟着C字符串必须的结束符0x00(不可见字符) - 但你的
username[32]和password[32]各占32字节,输入单个字符后,剩下的30个字节都是未初始化的栈内存垃圾值(转储里的0xcc,这是很多编译器用来标记未使用栈内存的填充值) fwrite把整个64字节的结构体都写入了文件,所以文件里既有可打印的0,又有不可见的\0,还有一堆0xcc——这些非文本字节被文本编辑器解析时,就变成了你看到的乱码。
3. 文件打开模式的小细节
你用a+模式打开文件,这是「文本追加+读写」模式,但即使你用文本模式打开,fwrite依然会按二进制方式写入数据。如果要专门处理二进制文件,应该用ab+(二进制追加模式)打开,但这不是乱码的核心原因——核心还是你用二进制写入的方式生成文本文件。
两种解决方向
如果你要生成可正常阅读的文本文件
别用fwrite写整个结构体,改用文本写入函数,比如fprintf:
// 示例:将用户名和密码以空格分隔,写入文本文件,每行一条记录 fprintf(fptr, "%s %s\n", t.username, t.password);
如果你要持久化结构体(后续用fread直接读回)
那继续用fwrite,但要注意:
- 用二进制模式打开文件,比如
ab+ - 这个文件是二进制格式,不要用普通文本编辑器打开查看(可以用十六进制编辑器查看内容)
内容的提问来源于stack exchange,提问作者Terrornado
相关产品推荐
相关产品推荐

