![782170639ed89bdec87e22c7e7cdb2fc.png](https://i-blog.csdnimg.cn/blog_migrate/17075032f7f0bb6dd1028dd3d6eb9a0d.jpeg)
本文使用 Zhihu On VSCode 创作并发布
在笔记Day3最后的代码中,在使用fprintf和fwrite分别对文件进行写入操作时,发现了这样一个问题。
从键盘输入两个学生数据,先用fprintf()写入stu_list.txt文件中,再用fscanf()读出这两个学生的数据显示在屏幕上。然后再用 fwrite()写入 stu_list.dat 中,用 fread()读出这两个学生数据显示在屏幕上。
#include
运行结果如图所示
![f76775f6eaf9500aaec6c5b503cc5ac2.png](https://i-blog.csdnimg.cn/blog_migrate/1f2498712f0110db305b314bded04165.png)
但是当我从硬盘中打开文件时,发现使用 fprintf 写入文件在记事本中的显示是正常的,而使用 fwrite 在文件中数字部分却变成了乱码而且并没有换行
![b0792d84b0ad5cf7cee052a2b7475ee8.png](https://i-blog.csdnimg.cn/blog_migrate/099f7f3a50d4bae6147d2dd05ca2b257.png)
![1dc23190f7a955bb8f6239627bbda5b2.png](https://i-blog.csdnimg.cn/blog_migrate/17695cfacf3bea8edbeb24af0f2971f7.png)
那么,是什么原因造成了这种问题呢?
我在 C Primer Plus 中找到了这样一句话:
ANSI C 提供两种文件打开模式 :二进制和文本。以二进制打开文件时,可以逐字节读取文件;以文本模式打开文件时,会把文件内容从文本的系统表示法映射为 C 表示法。
![ded4591a3f860fe664e974ff4083cf83.png](https://i-blog.csdnimg.cn/blog_migrate/0c6a7ced73e5da98b9f54e0ff617ab1b.png)
众所周知,fprintf 写入文件时使用的是文本模式,fwrite 写入文件时使用的是二进制模式。
所以在存储一个数时(例如10001),fprintf 将其视为 5 个字符并保存在5个字节中(相当于将这个数拆分成 5 个单字符),每个单字符都能在 ASCii 表中找到对应的映射从而正确显示;
而 fwrite 则使用该数的二进制表示(相当于将这个数看成一个整体),并将其存储为一个4字节的整数,而这样的二进制数自然是无法被识别从而显示为乱码的。
而对于一个字符串,两者并没有差别,都是将该字符串储存为一个单字节的二进制码,所以两种函数输出的字符串在文件中都可以正确显示。
同时,二进制文件和文本文件格式对于系统的依赖性不同,在读写流时程序执行的转换支持也不同(二进制流不转换,而文本流需要转换换行符和其他功能字符)。因此在 fwrite 输出的文件中没有显示换行。