真正换行 (LF) 的转义序列

BIB*_*IBD 5 c

在 C 中,我们有几个常见的转义序列:

\r 对于回车 (CR) - 这相当于做 '\015'

\n通常被描述为 LineFeed,但我知道 '\n' 将按照 CRLF 的要求翻译成字符串(取决于操作系统) - 这相当于执行"\015\012". 特别是如果我是 dong aprintffprintf.

对于不会被翻译的真正换行符是否有转义码,或者'\012'当我不想翻译时我是否被卡住了?

Cra*_*tey 7

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 之间的可移植性,这是用来抑制转换的模式。