鱼C论坛

 找回密码
 立即注册
查看: 2446|回复: 3

[已解决]二进制文件

[复制链接]
发表于 2022-11-23 15:50:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
12.49是编写程序实现文件的复制。即将源文件复制到目的文件,两个文件名均由命令行给出,源文件名在前
12.51 设文件student.dat中存放着一年级学生的基本信息。
不是二进制文件才用rb或者wb的吗,为什么这两个用的是wb或者rb
最佳答案
2022-11-23 16:42:51
本帖最后由 jackz007 于 2022-11-23 17:33 编辑

      fopen() 的 "r"、"rb" 、"w"、"wb" 选项的区别在于,"r" 和 "w" 选项适合读写文本文件,文本文件以行为单位进行信息组织,其内容都是肉眼可辨的各种字符,可使用 fscanf()、fgets() 等函数从文件中读取文本内容,用 fprintf()、fputs() 等函数向文件中(按行)写入文本内容;而 "rb" 和 "wb" 选项适合二进制文件,可以使用 fgetc()、fread() 等函数从文件中读取字节数据,可以使用 fputc()、fwrite() 等函数向文件中写入字节数据,此外,还可以通过 ftell()、fseek() 等函数判定文件读写指针的位置,并可以随时移动文件的读写指针的位置。操作更加灵活。所以,用 "r"、"rb" 选项只能适用于文本文件,只能按前后顺序读取文件的内容,无法自由读写文件的指定部分,而使用 "rb" 和 "wb" 打开的文件则可以自由灵活地读写文件的任何部分,总之,两种选项各有规则,各有所长。
      任何一个文件都可以用 "rb" 和 "wb" 选项打开,这种访问方式不受限制,更加自由,这也是文件复制程序一定要采用 "rb" 和 "wb" 的主要原因,同时,"r"、"w" 选项不适合用于二进制文件的读写,这也是程序采用 "rb" 和 "wb" 选项的重要原因 ;此外,含有结构体数据的文件也适合用 "rb"、"wb" 选项,这是因为,文件中保存的应该直接是结构体数据的内存映像,也就是说,这些结构体数据并不是以文本的形式存在于文件中,所以,必须要使用 "rb"、"wb" 选项。
QQ图片20221123154654.png
QQ图片20221123154709.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-23 16:14:36 From FishC Mobile | 显示全部楼层
本帖最后由 竹逸 于 2022-11-23 16:26 编辑

二进制或文本只是输入输出的方式不一样而已,实际上数据都是以0101这种二进制存储的,我们之所以能看到文本形式,是系统内部把二进制信息以ascii码形式输出到屏幕上
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-23 16:42:51 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-11-23 17:33 编辑

      fopen() 的 "r"、"rb" 、"w"、"wb" 选项的区别在于,"r" 和 "w" 选项适合读写文本文件,文本文件以行为单位进行信息组织,其内容都是肉眼可辨的各种字符,可使用 fscanf()、fgets() 等函数从文件中读取文本内容,用 fprintf()、fputs() 等函数向文件中(按行)写入文本内容;而 "rb" 和 "wb" 选项适合二进制文件,可以使用 fgetc()、fread() 等函数从文件中读取字节数据,可以使用 fputc()、fwrite() 等函数向文件中写入字节数据,此外,还可以通过 ftell()、fseek() 等函数判定文件读写指针的位置,并可以随时移动文件的读写指针的位置。操作更加灵活。所以,用 "r"、"rb" 选项只能适用于文本文件,只能按前后顺序读取文件的内容,无法自由读写文件的指定部分,而使用 "rb" 和 "wb" 打开的文件则可以自由灵活地读写文件的任何部分,总之,两种选项各有规则,各有所长。
      任何一个文件都可以用 "rb" 和 "wb" 选项打开,这种访问方式不受限制,更加自由,这也是文件复制程序一定要采用 "rb" 和 "wb" 的主要原因,同时,"r"、"w" 选项不适合用于二进制文件的读写,这也是程序采用 "rb" 和 "wb" 选项的重要原因 ;此外,含有结构体数据的文件也适合用 "rb"、"wb" 选项,这是因为,文件中保存的应该直接是结构体数据的内存映像,也就是说,这些结构体数据并不是以文本的形式存在于文件中,所以,必须要使用 "rb"、"wb" 选项。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-23 17:02:55 | 显示全部楼层
这两个概念,想必你是从 C 语言的教材中讲到 fopen 函数的 "b" 标签时提到的概念吧。

可以说,这是个历史遗留问题。之所以 C 语言要区分“文本文件
”和“二进制文件”这两个概念,是因为每个操作系统存储换行符的方式不一样。类 UNIX 系统(包括 Linux、BSD、现代 macOS 等)用 LF "\n" 表示换行,DOS 和 Windows 系统使用 CRLF "\r\n" 表示换行,Classic Mac OS 使用 CR "\r" 表示换行。这个要是错了,在一些程序中,可能会解析成错误的结果。
但是我们在编写 C 语言程序的时候,通常只用 "\n" 表示换行。如果在非类 UNIX 系统上直接这么储存,比如在 DOS 或 Windows 系统,可能就不会正确地显示换行。
而我们的 ANSI/ISO C 语言名义上可是源码级跨平台的呀,所以为了读写文本文件时在不同平台上正确地处理换行符,读写非文本文件(如压缩文件、多媒体文件等)时能够获取相同的字节流,于是就有了 fopen 的 "b" 标签。在类 UNIX 系统上,由于源码和系统处理上都用 "\n" 表示换行,所以忽略该标签,而在 Windows 下,自动将所有 "\n" 转化为 "\r\n" 储存,这样就能做到不同平台行为一致了。

以上内容来自知乎
https://www.zhihu.com/question/19971994
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-26 10:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表