h-b-z-d-j-s-m 发表于 2022-11-23 15:50:34

二进制文件

12.49是编写程序实现文件的复制。即将源文件复制到目的文件,两个文件名均由命令行给出,源文件名在前
12.51 设文件student.dat中存放着一年级学生的基本信息。
不是二进制文件才用rb或者wb的吗,为什么这两个用的是wb或者rb

竹逸 发表于 2022-11-23 16:14:36

本帖最后由 竹逸 于 2022-11-23 16:26 编辑

二进制或文本只是输入输出的方式不一样而已,实际上数据都是以0101这种二进制存储的,我们之所以能看到文本形式,是系统内部把二进制信息以ascii码形式输出到屏幕上

jackz007 发表于 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" 选项。

人造人 发表于 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
页: [1]
查看完整版本: 二进制文件