为什么fwrite()在Mac OS X上使用C中的"wb"写入二进制文件?

Dav*_*her 6 c fopen binaryfiles text-files

为了学习C并理解二进制文件和文本文件之间的区别,我试图将一个字符串写入文件,因为两种文件类型都是这样的:

char * string = "I am a string!";

FILE * filePtrA = fopen("/output.txt", "wt");
fwrite(string, strlen(string), 1, filePtrA);

FILE * filePtrB = fopen("/output.bin", "wb");
fwrite(string, strlen(string), 1, filePtrB);

fclose(filePtrA);
fclose(filePtrB);
Run Code Online (Sandbox Code Playgroud)

但是两者"wt""wb"正在写为文本文件,其中"wb"应该写为二进制文件.Hex对于这两个文件都是这样的:

49 20 61 6D 20 61 20 73 74 72 69 6E 67 21
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况,如何将内容写为二进制文件?

我已经读过操作系统(Mac OS X 10.6 - GCC 4.2)可能无法区分二进制文件和文本文件,但我仍然难以理解为什么十六进制编辑器不会发现任何差异.

Mag*_*off 6

所有文件都是二进制的

上下文中"文本文件"和"二进制文件"之间的区别在于fopen标准库可能在文本模式下使用过滤器来读取和写入文件.在二进制模式下,你写的东西总是写的.

我所知道的唯一实际例子是在Windows中,在文本模式下打开文件将使其在Windows样式的行结尾(CRLF "\r\n")和C样式/ Unix样式的行结尾(LF,"\n")之间进行转换.例如,当您在文本模式下打开文件以便在Windows中阅读时,行结尾将显示"\n"在您的程序中.如果您以二进制模式打开它,行结尾将显示"\r\n"在您的程序中.


您还可以使用以下方法检查文件cat:

文件名

你应该得到输出: I am a string!

  • OS X之前的Mac OS版本使用`\ r`来表示行结尾,因此文本模式/二进制模式的区别也与此相关. (4认同)