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在字符串末尾吐出的东西。