【问题标题】:Qt -" \n" doesn't work, but std::endl does?Qt -" \n" 不起作用,但 std::endl 可以吗?
【发布时间】:2013-10-01 19:34:09
【问题描述】:

我有一个以前从未遇到过的奇怪问题,我不知道是什么原因造成的。我在 Qt 4.7 中工作,我的项目中有很多东西可以打印到终端。这些打印都是由一键触发触发的。但是,当我按下按钮时,它们并没有全部打印出来。相反,所有以<< std::endl; 结尾的打印语句都将打印,但第一个以"random text...\n"; 结尾的语句不会打印,之后的任何语句都不会打印,无论它们使用哪种样式。如果我再次按下按钮以再次运行整个程序,它将然后打印剩余的语句,然后是与上次相同的初始输出。我可以将它们全部制作为 std::endl,但它们有很多 很多,所以我真的不想这样做。我以前从未见过这样的事情,有人对如何解决它有任何建议吗?谢谢!

编辑:根据请求,这是语法(假设 UI 上有一个按钮调用 mybutton)

void on_mybutton_pressed()
{
std::cout << "A" << std::endl;
std::cout << "B" << std::endl;
std::cout << "C\n";
}

第一次按下按钮后的输出:

A
B

第二次按下后的输出:
C
A
B

【问题讨论】:

  • 请看你的代码
  • @dare 我会添加一个语法示例
  • @Pavel Windows,但我之前在 Qt 中使用过 \n 无数次,没有任何问题,我已经在其中工作了几个月,这是它第一次给我带来问题.
  • @Pavel Strakhov:那是错误的。在文本输出流(如std::cout)中,\n 会自动转换为适合目标平台的任何内容。例如。在 Windows 上,它将自动转换为 \r\n 序列。
  • @PavelStrakhov 嗯,这取决于你的编译器。 C 和 C++ 标准 don't require \n to be translated to either CR or LF (or CR+LF).

标签: c++ qt std qtcore


【解决方案1】:

字符输出被缓冲。缓冲区满时会被刷新,但通常对于您不想等待的终端; std::endl 的特殊之处在于它会立即刷新缓冲区。

【讨论】:

  • 不应该只发生在缓冲区已经打印出大量数据的情况下吗?似乎只有当缓冲区已经用于打印大量字符时才真正成为问题,但是如果我将 \n 放入第一个打印语句中,它的行为将与我将其放入第 100 个相同>
  • @thnkwthprtls 我不太明白你的问题。 \n 不会强制将缓冲区写入设备,但 std::endl 会这样做,并且输出量根本不会改变。
【解决方案2】:

如果您真的想要,可以在程序开始时为 cout 启用单元缓冲:

std::cout << std::unitbuf;

这将在每个输出操作后刷新缓冲区。

在您的情况下,我认为这有点像 hack 而不是解决方案。与刷新相关的性能损失(尽管如果您不以高频率打印它们并不重要)。

【讨论】:

  • s/“启用”/“禁用”?
  • 我不这么认为? Afaik,“单元缓冲”是指只有 一个“单元”被缓冲,即在每个 &lt;&lt; 之后自动刷新。
猜你喜欢
  • 2015-04-19
  • 2012-01-08
  • 1970-01-01
  • 2018-11-15
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
相关资源
最近更新 更多