【问题标题】:Strange interaction between popen() and printf vs. cout in C++C++ 中 popen() 和 printf 与 cout 之间的奇怪交互
【发布时间】:2011-10-26 21:28:10
【问题描述】:

任何人都可以在没有看到所有源代码和库等的情况下回答这个问题,但我会尝试。

我有一个使用 boost-1.41 用 C++ 编写的程序 X。如果X 输出为std::cout,则使用fp=popen("X", "r") 从另一个程序运行X 允许通过fgets(buff, 1024, fp) 看到X 的输出。

现在,如果我将X 更改为使用printf() 而不是std::cout,则不再看到X 的输出。但是,从 bash 运行 X 会产生预期的输出。

什么可以解释这种差异?!我怀疑这里涉及到 boost,但我对 boost 了解不多。

注意:我很高兴坚持std::cout,我的问题已经解决了。但我试图了解printf() 的问题所在。

【问题讨论】:

    标签: c++ printf popen cout


    【解决方案1】:

    原因是您可能将std::endlstd::cout 一起使用。除了写入换行符之外,它还会刷新输出缓冲区。

    要对printf 执行相同操作,您只需在调用后添加fflush(stdout);

    【讨论】:

    • 干得好;就是这样。我不知道 std::endl 刷新缓冲区。
    • 它们也会定期冲洗自己,但在很大程度上无法预测。
    • @Fixee:是的,这就是为什么std::cout << std::endlstd::cout << '\n' 慢很多
    • 这就是std::endl 的用途。通常最好只使用'\n'"\n" 并让系统决定何时刷新其缓冲区。
    • 谢谢;这里刷新很关键,因为(显然)写入管道自动刷新的频率远低于写入术语设备,这让我感到困惑。
    猜你喜欢
    • 2015-12-24
    • 1970-01-01
    • 2015-07-30
    • 2016-12-13
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    相关资源
    最近更新 更多