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

为什么要使用fopen()模式';b';(stdio.h)什么时候输出可以是非ASCII的?,c,stdio,C,Stdio,对于C标准库stdio.h,我了解到要输出ASCII/文本数据,应该使用模式“w”,要输出二进制数据,应该使用“wb”。但为什么会有区别呢 在这两种情况下,我只是输出一个字节(char)数组,对吗?如果我以ASCII模式输出非ASCII字节,程序仍会输出正确的字节。以ASCII输出时,可能会发生某些转换(例如,输出的字符为新行时,输出neline+回车),具体取决于您的平台。当使用二进制格式时,这种转换将不会发生。一些操作系统(主要称为“windows”)不能保证它们将按照您传入的方式读取和写入

对于C标准库
stdio.h
,我了解到要输出ASCII/文本数据,应该使用模式
“w”
,要输出二进制数据,应该使用
“wb”
。但为什么会有区别呢


在这两种情况下,我只是输出一个字节(char)数组,对吗?如果我以ASCII模式输出非ASCII字节,程序仍会输出正确的字节。

以ASCII输出时,可能会发生某些转换(例如,输出的字符为新行时,输出neline+回车),具体取决于您的平台。当使用二进制格式时,这种转换将不会发生。一些操作系统(主要称为“windows”)不能保证它们将按照您传入的方式读取和写入ascii文件。因此,在windows上,它们实际上映射到\r\n。在读写ascii时,这是精细而透明的。但它会将二进制数据流丢弃。基本上,如果您希望windows按照您传入数据的方式忠实地将数据读写到文件中,只需始终为windows设置“b”标志。

自动换行转换。Barf.除非您的目标是使文件在旧版Windows记事本中正确显示,否则您应该始终使用
“b”
选项。文本模式与二进制模式的不同只会让你的生活一团糟。如果您需要使用CR支持遗留文本文件,只需在解析器中去掉CR;如果您使用的是
scanf
,它将作为跳过空白的一部分为您忽略它。非常好的注释+到处都是。