在 C 中,我们有几个常见的转义序列:
\r 对于回车 (CR) - 这相当于做 '\015'
\n通常被描述为 LineFeed,但我知道 '\n' 将按照 CRLF 的要求翻译成字符串(取决于操作系统) - 这相当于执行"\015\012". 特别是如果我是 dong aprintf或fprintf.
对于不会被翻译的真正换行符是否有转义码,或者'\012'当我不想翻译时我是否被卡住了?
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"
Run Code Online (Sandbox Code Playgroud)
当输出到 POSIX 系统下的终端时,TTY 驱动程序会将 case (1) 以 Cooked 模式转换为 CRLF。这可以通过一些 TTY 调用来更改ioctl。IIRC,与 Windows 类似(?)。但是,[再次]IIRC,Windows 有一些必须完成的特定于 Windows 的调用,因为转换是在非常低的层完成的。
在 POSIX 系统下写入文件时,不会进行任何转换。
但是,在 Windows 下写入文件时,情况 (1) 会被操作系统转换为 CRLF 以便正常打开 [因为默认为“文本”模式]:
open(file,O_WRONLY);
fopen(file,"w");
Run Code Online (Sandbox Code Playgroud)
要在 Windows 下抑制情况 (1) 的翻译,请以“二进制”模式打开文件:
open(file,O_WRONLY | O_BINARY);
fopen(file,"wb");
Run Code Online (Sandbox Code Playgroud)
二进制模式也适用于以读取模式打开。而且,对于 POSIX,它[实际上]是一个无操作并且被忽略。有/没有二进制选项,在 POSIX 下,是以二进制模式打开,因为 POSIX 没有文件的“文本模式”。
因此,为了 POSIX/Windows 之间的可移植性,这是用来抑制转换的模式。