gpt4 book ai didi

c++ - 如果需要,如何让 std::endl 输出 "\r\n"?

转载 作者:搜寻专家 更新时间:2023-10-31 02:09:14 27 4
gpt4 key购买 nike

我有以下代码:

std::cerr << "Hello" << std::endl;
std::cerr << "World" << std::endl;

...这通常会很棒。

但是:我在一个 Erlang 端口程序中运行它,而 Erlang 已经对终端做了一些事情,这意味着“\n”不再转换为 CRLF,这意味着我的输出显示为...

Hello
World

Erlang 对我的终端做了什么?我如何检测它?在这种情况下,如何让 std::endl 输出 \r\n

注意:(可能)不仅仅是 Erlang 从我的程序中获取 stderr 并搞砸了换行。如果我在 NIF 中使用 plain-ol' printf("Hello\n"),我会看到同样的问题。

最佳答案

首先不要使用 ::std::endl。它并没有真正做你想要的。它总是输出 '\n' 并刷新流。在大多数情况下,刷新流会造成巨大且不必要的性能损失。

'\n' 就是这个意思。实际的文字 '\n'。它不做任何类型的翻译或人们认为它做的任何事情。只是一个扁平的 '\n' 和一个冲洗,即使在 Windows 上也是如此。您在 Windows 下获得的换行符转换由较低级别的 iostream 设施处理,并由流是否处于 binary 模式控制。

Erlang 对您的终端所做的可能是将其置于 CBREAK 模式。这里有一两个很好的问题,其答案描述了 Unix 中原始、熟化和 cbreak 终端驱动程序模式之间的区别。

您可以手动将终端设置回熟化模式。 Erlang 这样做的唯一原因是通常你只会得到人们在回车时输入的内容。 CBREAK 可让您获取输入的每个字符。

您还可以自己测试终端处于什么模式。Linux(以及后来的 Posix 修订版)显然已经用各种标志替换了三种终端模式,这些标志的综合效果导致与旧终端模式非常相似的行为。

首先,您可能想使用 isatty(1)(在 stdout 上调用 isatty)在尝试任何其他操作之前查看您的输出是否真的是一个终端。

然后,您可以使用tcgetattr 将各个位的当前设置读入struct termios。此结构包含一个名为 c_oflag 的成员,用于输出模式位。这种情况下的相关位可能是 ONLCR,也可能(但我怀疑不是)OPOST

关于c++ - 如果需要,如何让 std::endl 输出 "\r\n"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46712840/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com