似乎只放一个换行就足够了,但我知道它应该是回车+换行。如果您不输入回车而只使用换行符,会发生什么可怕的事情吗?
这是在 ANSI C 中,不会被重定向到文件或其他任何东西。只是一个普通的控制台应用程序。
似乎只放一个换行就足够了,但我知道它应该是回车+换行。如果您不输入回车而只使用换行符,会发生什么可怕的事情吗?
这是在 ANSI C 中,不会被重定向到文件或其他任何东西。只是一个普通的控制台应用程序。
Windows 控制台遵循为文件假定的相同行结束约定,或者就实际的物理终端而言。它需要同时查看 CR 和 LF 才能正确移动到下一行。
也就是说,在 ANSI C 程序和那个控制台之间有很多软件基础设施。特别是,任何标准 C 库 I/O 函数都会尝试做正确的事情,假设您允许它有机会。这就是定义参数的fopen()
'st
和b
修饰符的原因。mode
使用t
(大多数流的默认设置,尤其是stdin
and 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 调用发送字符。
如果您在 *nix 环境中,\n(换行)可能没问题。如果您在 Windows 中并且没有(现在)重定向换行符也可以,但是如果有人在某个时候重定向,:-(
但是,如果您使用的是 Windows,则如果将输出重定向到文本文件然后另一个进程尝试使用数据,则可能会出现问题。
控制台知道要显示什么,但消费者可能不高兴......
如果您使用的是 C#,您可以尝试 Environment.NewLine“常量”。
http://msdn.microsoft.com/en-us/library/system.environment.newline.aspx
如果你真的在 vanilla c 中,你会被 \r\n 困住。:-)
这取决于您使用它们的目的。如果您不同时放置\r
和 ,某些程序将无法正确显示换行符\n
。
如果您尝试仅编写\n
一些使用您的文本文件(或输出)的程序,则可能会将您的文本显示为单行而不是多行。
还有一些文件格式和协议如果不同时使用\r
和\n
.
我已经很久没有尝试过了,以至于我不确定我是否记得发生了什么......但是换行符本身不会在不返回左列的情况下向下移动一行吗?
根据您的编译器,标准输出可能会以文本模式打开,在这种情况下,单个换行符将在被写出之前转换为 \r\n。
编辑:我刚刚尝试了快速测试,在 XP 中正常显示没有返回的文件。我仍然不知道是否有任何编译器为您插入返回值。
在 C 中,文件(称为“流”)有两种形式——二进制或文本。
这种区别的含义取决于实现/平台,但在 Windows(我见过的常见实现)上,当写入文本流时,'\n' 会自动转换为“\r\n”,并且在从文本中读取时流 "\r\n" 会自动转换为 '\n'。
“控制台”实际上是“标准输出”,是默认打开为文本流的流。因此,在 Windows 上的实践中,编写 "Hello, world!\n" 应该就足够了 - 并且可移植。