C编译器中没有翻译功能。以下字符串都是等效的:
// (1) these are all equivalent to a string of newline of length 1:
"\n"
"\x0a"
"\012"
// (2) these are all equivalent to a string of carriage return of length 1:
"\r"
"\x0d"
"\015"
// (3) these are all equivalent to a string of CRLF of length 2:
"\r\n"
"\x0d\0x0a"
"\015\012"
当在POSIX系统下输出到终端时,TTY驱动程序会将形式(1)转换为CRLF(在熟模式下)。这可以通过一些TTY ioctl调用来改变。如果我没记错的话,windows也是类似的。但是,我记得windows有一些特定于windows的调用必须要做,因为翻译是在非常低的层次上完成的。
在POSIX系统下写入文件时,不进行任何转换。
然而,在Windows下向文件写入时,由于默认模式为“文本”,操作系统将形式(1)转换为CRLF:
open(file,O_WRONLY);
fopen(file,"w");
为了在Windows下禁止针对情况(1)的翻译,请以“二进制”模式打开文件:
open(file,O_WRONLY | O_BINARY);
fopen(file,"wb");
二进制模式也适用于读取模式。在 POSIX 中,它 [有效地] 是一个无操作并被忽略的选项。在 POSIX 下,不管有没有二进制选项,都是以二进制模式打开文件,因为 POSIX 没有“文本模式”。
因此,为了在 POSIX/Windows 之间实现可移植性,这是抑制转换的模式。