首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >真LineFeed (LF)的转义序列

真LineFeed (LF)的转义序列
EN

Stack Overflow用户
提问于 2016-08-31 17:00:38
回答 3查看 5.1K关注 0票数 5

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

\r用于载运返回(CR) -这相当于执行'\015'

\n通常被描述为LineFeed,但我知道'\n‘将按需要被翻译成CRLF (依赖于操作系统)--这相当于执行"\015\012"。特别是如果我在做printf或者fprintf

是否有一个真正的行提要字符的转义代码不会被翻译,或者当我不希望它被翻译时,我是否被困在使用'\012'

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-31 17:29:33

C编译器中没有翻译。字符串和这些都是等价的。

代码语言:javascript
复制
// (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“模式

代码语言:javascript
复制
open(file,O_WRONLY);
fopen(file,"w");

若要在windows for case (1)下禁止转换,请以“二进制”模式打开文件:

代码语言:javascript
复制
open(file,O_WRONLY | O_BINARY);
fopen(file,"wb");

二进制模式也适用于读取模式下的打开。而且,对于POSIX来说,它实际上是一种不操作,并且被忽略了.带/不带二进制选项,在POSIX下,以二进制模式打开,因为POSIX没有文件的“文本模式”。

因此,对于POSIX/windows之间的可移植性,这是用来抑制翻译的模式。

票数 5
EN

Stack Overflow用户

发布于 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的转义序列。

票数 4
EN

Stack Overflow用户

发布于 2016-08-31 17:52:59

历史:

旧的主机计算机有终端连接,通常连接速度较慢。终端是打字机。在用户输入一行后,他们按回车(就像在旧打字机上)。这是主机处理线路的信号。一旦大型机接收并处理了这条线路,它就会发送一个行提要。打字机的纸张现在上升到一行,通知用户系统已准备好接收另一条线路。

Unix是基于分时的,它复制了这个行为。

(但我仍然不确定LF是存储在Unix下,还是CR下--从上面看,它应该是CR,系统添加了LF。)

窗口,不分时,只需将CR和LF放入文件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39255198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档