2

似乎只放一个换行就足够了,但我知道它应该是回车+换行。如果您不输入回车而只使用换行符,会发生什么可怕的事情吗?

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

4

5 回答 5

2

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

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

使用t(大多数流的默认设置,尤其是stdinand stdout),任何\n打印的都将转换为 CRLF 序列,而读取则相反。要关闭该行为,请使用b修饰符。

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

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

于 2009-04-08T06:17:21.390 回答
1

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

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

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

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

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

如果你真的在 vanilla c 中,你会被 \r\n 困住。:-)

于 2009-04-08T02:49:05.573 回答
0

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

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

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

于 2009-04-08T02:50:30.170 回答
0

我已经很久没有尝试过了,以至于我不确定我是否记得发生了什么......但是换行符本身不会在不返回左列的情况下向下移动一行吗?

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

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

于 2009-04-08T03:16:55.850 回答
0

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

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

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

于 2009-04-08T06:23:48.240 回答