为什么输出可以是非ASCII字符时,要使用fopen()模式'b' (stdio.h)?

4

使用C标准库的stdio.h,我了解到输出ASCII/text数据应该使用模式"w",而输出二进制数据则应该使用"wb"。但是为什么会有这样的区别呢?

无论哪种情况,我只是输出一个字节(char)数组,对吧?如果我在ASCII模式下输出非ASCII字节,程序依然会正确输出该字节。


8
自动换行转换。烦人。 - Carl Norum
1
http://wiki.answers.com/Q/What_is_the_difference_between_binary_file_and_text_file_in_c_language - m0skit0
2
除非你的目标是使文件在古老版本的 Windows 记事本中显示正确,否则你应该始终使用 "b" 选项。文本模式与二进制模式不同只会让你的生活变得更加糟糕。如果您需要支持带 CR 的旧文本文件,在解析器中只需剥离 CR 即可;如果您正在使用 scanf,它将作为空格跳过而忽略它。 - R.. GitHub STOP HELPING ICE
很棒的评论。给所有人点赞。 - JellicleCat
2个回答

8

一些操作系统,主要是名为“windows”的系统,不能保证它们会完全按照你传入的方式读写ASCII文件。因此,在Windows上,它们实际上将\r\n映射到\n。当读写ASCII时,这很好并且是透明的。但是,如果是二进制数据流,则会破坏它。基本上,如果您希望它忠实地按照您传入的方式读写数据到文件中,则始终为Windows提供“b”标志。


0

在输出 ASCII 时,可能会发生某些转换(例如,在输出字符为新行时输出 neline+carriage-return)-- 这取决于您的平台。使用二进制格式时,这些转换不会发生。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接