C 在Windows中打印到控制台时是否需要回车?

C 在Windows中打印到控制台时是否需要回车?,c,windows,carriage-return,linefeed,C,Windows,Carriage Return,Linefeed,看起来仅仅放一个换行符就足够了,但我知道它应该是回车+换行符。如果你不放回车,只使用换行符,会发生什么可怕的事情吗 这是在ANSI C中,不会被重定向到文件或其他任何内容。只是一个普通的控制台应用程序。如果您在*nix环境中,\n(Linefeed)可能还可以。如果您在Windows中并且(现在)没有重定向,则换行也可以,但如果某个位置有人重定向,则:-( 如果您使用的是Windows,那么如果输出重定向到文本文件,然后另一个进程尝试使用数据,则可能会出现问题 控制台知道要显示什么,但消费者可能

看起来仅仅放一个换行符就足够了,但我知道它应该是回车+换行符。如果你不放回车,只使用换行符,会发生什么可怕的事情吗


这是在ANSI C中,不会被重定向到文件或其他任何内容。只是一个普通的控制台应用程序。

如果您在*nix环境中,\n(Linefeed)可能还可以。如果您在Windows中并且(现在)没有重定向,则换行也可以,但如果某个位置有人重定向,则:-(

如果您使用的是Windows,那么如果输出重定向到文本文件,然后另一个进程尝试使用数据,则可能会出现问题

控制台知道要显示什么,但消费者可能不高兴

如果您使用的是C#,您可以尝试Environment.NewLine“constant”


如果你真的是香草c,你会被困在\r\n.:-)

这取决于你使用它们的目的。如果不同时放置
\r
\n
,某些程序将无法正确显示换行符

如果您尝试只编写
\n
某些使用文本文件(或输出)的程序可能会将文本显示为单行而不是多行


还有一些文件格式和协议,如果不同时使用
\r
\n

的话,它们将完全无效。我已经很久没有尝试过了,所以我不确定是否记得发生了什么。。。但是换行本身不是沿着一行向下移动而不返回到左列吗

根据编译器的不同,标准输出可能以文本模式打开,在这种情况下,一个换行符将在写出之前被翻译为\r\n


编辑:我刚刚尝试了一个快速测试,在XP中,没有返回的文件会正常显示。我仍然不知道是否有编译器为您插入返回值。

Windows控制台遵循与文件或实际物理终端相同的行尾约定。需要同时看到CR和LF才能正确移动到下一行

也就是说,在ANSIC程序和控制台之间有很多软件基础设施。特别是,任何标准的C库I/O函数都会尝试做正确的事情,前提是您允许这样做。这就是定义
mode
参数的
fopen()
t
b
修饰符的原因

使用
t
(大多数流的默认值,尤其是
stdin
stdout
)时,任何打印的
\n
都会转换为CRLF序列,读取时则相反。要关闭该行为,请使用
b
修改器

顺便说一句,传统上连接到*nix盒的终端,包括XTerm模拟的DEC VT100,也需要CR和LF。但是,在*nix世界中,从换行符到CRLF序列的转换在tty设备驱动程序中处理,因此大多数程序不需要知道它,并且
t
b
修饰符都被忽略。在这些平台上,如果需要在不进行修改的情况下在tty上发送和接收字符,则需要查找stty(1)或它所依赖的系统调用

如果您的ANSI C程序正在避免C库I/O到控制台(可能是因为您需要访问控制台的字符颜色和其他属性),那么您是否需要发送CR将取决于您用于发送字符的Win32 API调用。

在C中,文件(称为“流”)有两种风格-二进制或文本

这种区别的含义取决于实现/平台,但在Windows上(我见过常见的实现),当写入文本流时“\n”会自动转换为“\r\n”,从文本流读取时“\r\n”会自动转换为“\n”


“控制台”实际上是“标准输出”,这是默认情况下作为文本流打开的流。因此,在Windows操作系统上,写“Hello,world!\n”应该足够了,而且可以移植。

事实上,这并不完全正确。C运行时库非常小心地为ANSI C文件I/O进行合理的翻译。这正是发明
t
b
fopen()
的修饰符的原因。标准流是以文本模式打开的,除非您进行一些更改,管道和重定向的工作方式与Windows用户所期望的一样。如果您直接调用Win32 API,情况就不同了,但是您不再执行ANSI C I/O。在DotNet中,您还必须使用
\r\n
中间字符串。Environment.NewLine没有映射到CR LF,这让我感到惊讶。它只是StreamWriter.WriteLine在字符串末尾吐出的东西。