在C中,我们有几个常见的转义序列:
\r用于载运返回(CR) -这相当于执行'\015'
\n通常被描述为LineFeed,但我知道'\n‘将按需要被翻译成CRLF (依赖于操作系统)--这相当于执行"\015\012"。特别是如果我在做printf或者fprintf。
是否有一个真正的行提要字符的转义代码不会被翻译,或者当我不希望它被翻译时,我是否被困在使用'\012'?
发布于 2016-08-31 17:29:33
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驱动程序将以熟模式将case (1)转换为CRLF。这可以通过一些TTY ioctl调用来更改。IIRC,类似于windows(?)但是,同样,IIRC,windows有一些特定的调用必须完成,因为转换是在一个非常低的层。
在POSIX系统下写入文件时,不进行任何翻译。
但是,当在Windows下写入文件时,case (1)将由OS转换为CRLF,以正常方式打开,因为默认模式是"text“模式
open(file,O_WRONLY);
fopen(file,"w");若要在windows for case (1)下禁止转换,请以“二进制”模式打开文件:
open(file,O_WRONLY | O_BINARY);
fopen(file,"wb");二进制模式也适用于读取模式下的打开。而且,对于POSIX来说,它实际上是一种不操作,并且被忽略了.带/不带二进制选项,在POSIX下,以二进制模式打开,因为POSIX没有文件的“文本模式”。
因此,对于POSIX/windows之间的可移植性,这是用来抑制翻译的模式。
发布于 2016-08-31 17:19:17
@Barmar是对的:\n和\012是完全相同的。在Windows机器上,普通LF和CRLF之间的区别在于您如何打开正在写入的任何设备。例如,如果在cygwin下对终端执行printf,则可以将stty更改为raw模式。否则,它将取决于您正在使用的C库的具体情况。
使用msvcrt为Win32编辑,使用fopen(..., "b"),“禁止包含回车和行提要字符的翻译”(来自MSDN )。相反,在文本模式下,"linefeed字符被转换为输出上的回车--linefeed组合“(相同的源)。
因此,要回答最初的问题,在输出、每个平台和每个输出例程上,都不会有一个总是\012的转义序列。
发布于 2016-08-31 17:52:59
历史:
旧的主机计算机有终端连接,通常连接速度较慢。终端是打字机。在用户输入一行后,他们按回车(就像在旧打字机上)。这是主机处理线路的信号。一旦大型机接收并处理了这条线路,它就会发送一个行提要。打字机的纸张现在上升到一行,通知用户系统已准备好接收另一条线路。
Unix是基于分时的,它复制了这个行为。
(但我仍然不确定LF是存储在Unix下,还是CR下--从上面看,它应该是CR,系统添加了LF。)
窗口,不分时,只需将CR和LF放入文件。
https://stackoverflow.com/questions/39255198
复制相似问题