c++ - cout流的限制?

标签 c++ windows buffer stdout

一个让我印象深刻的谜题。在一些简单的测试工具代码中,如果我将太多字符流式传输到标准输出,程序就会失败。奇怪但非常可重现。这可能是 Windows 独有的问题,但很容易看出:

#include <iostream>
#include <deque>

using namespace std;

int main() 
{
  deque<char> d;
  char c;

  while (cin.get(c)) d.push_back(c);

  for (deque<char>::reverse_iterator j = d.rbegin(); j != d.rend(); j++)
    cout << (*j);
}

前面的代码只是从 stdin 加载一个字符流并以相反的顺序输出它们。它适用于最多 100K 左右的字符,但对于更大的文件,它会在 Windows 中出现“错误写入标准输出”消息。它总是以相同的角色死去。 重现问题只需要一个 shell 命令,如“cat bigfile.txt | reverse.exe”。 MSFT 和 Intel 编译器的行为都相似。

我知道 stdout 上可能有一个缓冲区,但当它被填满时不应该自动刷新吗?

最佳答案

您可以尝试强制缓冲区以这种方式刷新其内容:

cout << (*j) << std::flush;

否则 std::endl 也可以工作,但也提供行尾(我想你不想要?)

关于c++ - cout流的限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/900319/

相关文章:

android - 即使在 CMake 中构建 Release 时,也会在最终 SO 文件中获取调试符号

c++ - 如何将 CString 传递给格式字符串 %s?

ruby-on-rails - 在 Windows 中使用 Puma 通过 ssl 运行 Rails App

javascript - 将响应缓冲区转换为 JSON

c++ - 抑制状态错误 LNK1104 无法打开文件 'IlmImfd.lib'

c++ - 构造函数?或者是其他东西?

c++ - 使用 C++ 打印 HTML 标记

HKCU 的 c# 权限

search - 如何在emacs中搜索其他缓冲区中的字符串?

node.js - 带有内存复制的 ArrayBuffer 的缓冲区