c fscanf 按行读取文件_C课设学习笔记Day4-关于fwrite写入文件的乱码问题

782170639ed89bdec87e22c7e7cdb2fc.png
本文使用 Zhihu On VSCode 创作并发布

在笔记Day3最后的代码中,在使用fprintf和fwrite分别对文件进行写入操作时,发现了这样一个问题。

从键盘输入两个学生数据,先用fprintf()写入stu_list.txt文件中,再用fscanf()读出这两个学生的数据显示在屏幕上。然后再用 fwrite()写入 stu_list.dat 中,用 fread()读出这两个学生数据显示在屏幕上。
#include

运行结果如图所示

f76775f6eaf9500aaec6c5b503cc5ac2.png
两种方式在程序中输出都是正常的

但是当我从硬盘中打开文件时,发现使用 fprintf 写入文件在记事本中的显示是正常的,而使用 fwrite 在文件中数字部分却变成了乱码而且并没有换行

b0792d84b0ad5cf7cee052a2b7475ee8.png
fprintf

1dc23190f7a955bb8f6239627bbda5b2.png
fwrite

那么,是什么原因造成了这种问题呢?

我在 C Primer Plus 中找到了这样一句话:

ANSI C 提供两种文件打开模式 :二进制和文本。以二进制打开文件时,可以逐字节读取文件;以文本模式打开文件时,会把文件内容从文本的系统表示法映射为 C 表示法。

ded4591a3f860fe664e974ff4083cf83.png
来自C Primer Plus的插图

众所周知,fprintf 写入文件时使用的是文本模式,fwrite 写入文件时使用的是二进制模式。

所以在存储一个数时(例如10001),fprintf 将其视为 5 个字符并保存在5个字节中(相当于将这个数拆分成 5 个单字符),每个单字符都能在 ASCii 表中找到对应的映射从而正确显示;
fwrite 则使用该数的二进制表示(相当于将这个数看成一个整体),并将其存储为一个4字节的整数,而这样的二进制数自然是无法被识别从而显示为乱码的。

而对于一个字符串,两者并没有差别,都是将该字符串储存为一个单字节的二进制码,所以两种函数输出的字符串在文件中都可以正确显示。

同时,二进制文件和文本文件格式对于系统的依赖性不同,在读写流时程序执行的转换支持也不同(二进制流不转换,而文本流需要转换换行符和其他功能字符)。因此在 fwrite 输出的文件中没有显示换行。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值