【问题标题】:Limit on cout stream?限制 cout 流?
【发布时间】:2009-05-22 22:47:15
【问题描述】:

一个困扰我的谜题。在一些简单的测试工具代码中,如果我将太多字符流式传输到标准输出,程序就会失败。奇怪但非常可重复。这可能是 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);
}

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

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

【问题讨论】:

  • 我认为您需要提供有关您正在运行的编译器版本、操作系统和内存的更多详细信息。至少我们中的一些人没有看到这个问题。
  • 另外,尝试使用类似“reverse.exe

标签: c++ windows buffer stdout


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    这里没有这样的问题:

    C:\Temp> cl
    Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
    

    编辑:更多信息

    我通过编译您发布的程序对此进行了测试。我创建了一个包含 0123456789 的文件,重复了 100,000 次(使其大小为 1,000,000 字节)。然后,我跑了

    C:\Temp> t.exe < test.in
    

    还有

    C:\Temp> cat test.in | t.exe
    

    C:\Temp> t.exe < test.in > test.out
    

    没有问题。等待这 1,000,000 个字符滚动确实需要很长时间。

    【讨论】:

    • 我也没有问题:Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86 on Vista x64。
    • 优秀而彻底的测试!感谢您抽出宝贵时间查看。
    【解决方案3】:

    问题可能是管道运算符 (|) 而不是“cat”。 Windows 命令解释器[1] 没有真正的管道(如 Unix)并使用临时文件模拟它们。您可能会用完磁盘空间或溢出命令解释器中的某些缓冲区。

    您可以尝试“输入 bigfile.txt | reverse.exe”,看看是否得到相同的结果。

    [1] 至少旧版本没有真正的管道。我没看过最新版本。有趣的是,Michael Burr 无法在 Vista x64 上重现它。也许 MS 已经解决了这个问题。

    【讨论】:

      【解决方案4】:

      您可以在每次循环迭代期间或每 100 次迭代期间睡一小段时间吗?这将使操作系统有机会刷新缓冲区。

      我不知道在 c++ 中执行此操作的命令是什么,但在 c# 中是

      System.Threading.Sleep(10);
      

      【讨论】:

        【解决方案5】:

        感谢所有建议,尤其是 Michael Burr,他正确地推断出 cat 命令而不是 reverse.exe 可能会失败!就是这样...... reverse.exe

        【讨论】:

        • 如果您可以将这些观察结果添加为对原始问题的编辑,以便其他人可以在上下文中看到它们,这将更加有用。你的“猫”从何而来?我的来自 Cygwin 发行版。
        【解决方案6】:

        如果您尝试在 win32 上将特殊字符写入标准输出,我之前遇到过这个问题。你的测试数据中有这样的字符吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-01-27
          • 2011-05-03
          • 2016-04-29
          • 2016-09-26
          • 1970-01-01
          • 1970-01-01
          • 2015-03-15
          • 2020-08-07
          相关资源
          最近更新 更多