在Windows中打印到控制台时需要回车吗?

时间:2009-04-08 02:42:24

标签: c windows carriage-return linefeed

似乎只是放一个换行就足够了,但我知道这应该是回车+换行。如果你没有放回车并只使用换行,会发生什么可怕的事吗?

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

5 个答案:

答案 0 :(得分:2)

Windows控制台遵循为文件假设的相同行结束约定,或者对于实际的物理终端。它需要同时看到CR和LF才能正确移动到下一行。

也就是说,ANSI C程序和该控制台之间有很多软件基础结构。特别是,任何标准的C库I / O函数都会尝试做正确的事情,假设你有机会。这就是定义fopen() t参数的bmode修饰符的原因。

使用t(大多数流的默认值,特别是stdinstdout),然后打印的任何\n都会转换为CRLF序列,反之亦然读取发生。要关闭该行为,请使用b修饰符。

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

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

答案 1 :(得分:1)

如果您在* nix环境中\ n(Linefeed)可能没问题。如果你在Windows中并且没有重定向(现在)换行也没问题,但是如果有人在某个点重定向,那么: - (

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

控制台知道要展示什么,但消费者可能不满意......

如果您正在使用C#,您可以尝试使用Environment.NewLine“常量”。

http://msdn.microsoft.com/en-us/library/system.environment.newline.aspx

如果你真的在香草c中,你就会被困在\ r \ n。 : - )

答案 2 :(得分:0)

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

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

如果不同时使用\r\n,也会有一些文件格式和协议无效。

答案 3 :(得分:0)

我没有尝试过这么长时间以至于我不确定我记得会发生什么......但是,如果没有返回到左列,换行自身不会向下移动吗?

根据您的编译器,标准输出可能会以文本模式打开,在这种情况下,单个换行符将在写出之前转换为\ r \ n。

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

答案 4 :(得分:0)

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

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

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