检查将啥输出写入标准输出

Posted

技术标签:

【中文标题】检查将啥输出写入标准输出【英文标题】:Check what output is written to standard output检查将什么输出写入标准输出 【发布时间】:2015-08-18 17:44:45 【问题描述】:

我想在程序的某个部分检查输出是否写入标准输出(通过 cout)。

我发现了一种通过更改 cout 的 streambuf 来阻止任何输出的方法。 (这里:C++: Redirecting STDOUT)。这很有趣,首先我认为它可能会有所帮助。我找到了以下代码示例(来源:C++: Redirecting STDOUT的回答)

// Redirect cout.
streambuf* oldCoutStreamBuf = cout.rdbuf();
ostringstream strCout;
cout.rdbuf( strCout.rdbuf() );

// This goes to the string stream.
cout << "Hello, World!" << endl;

// Restore old cout.
cout.rdbuf( oldCoutStreamBuf );

// Will output our Hello World! from above.
cout << strCout.str();

所以我可以通过检查它的大小来检查 strCout.str() 是否是一个包含 1 个或多个字符的字符串。

但如果我不想显着延迟输出怎么办?所以我不想将所有输出保存在我自己的 ostringstream 中,等到我检查程序结束时是否有输出,然后在我的程序结束前不久打印所有输出。我只是想知道,我的程序的某个部分是否有输出。

例子:

main 
bool wasthereoutput=false;

function1();
function2();
startoutputcheckhere();
function3();
function4();
endoutputcheckhere();
therewasoutput=wasthereoutput();

if therewasoutput

//do something

我不想更改 function3 或 function4 中的任何内容。我不想延迟这些函数生成的任何输出,直到我调用 endoutputcheckhere() 甚至 wasthereoutput()。我只想知道是否有任何输出通过 cout 输出到 std 输出。

【问题讨论】:

【参考方案1】:

您可以创建一个流缓冲区,它既可以收集写入的字符供以后使用,也可以将它们转发到另一个流缓冲区,例如std::cout 使用的那个。这种方法的简单实现如下所示:

class savebuf:
    public std::streambuf 
    std::streambuf* sbuf;
    std::string     save;
    int overflow(int c) 
         if (!traits_type::eq_int_type(c, traits_type::eof()) 
             save.push_back(traits_type::to_char_type(c);
             return sbuf->sputc(c);
         
         else 
             return traits_type::not_eof(c);
         
    
    int sync()  return sbuf->pubsync(); 
public:
    savebuf(std::streambuf* sbuf): sbuf(sbuf) 
    std::string str() const  return save; 
;

int main() 
     std::streambuf* coutbuf = std::cout.rdbuf();
     savebuf sbuf(coutbuf);
     std::cout.rdbuf(&sbuf);
     std::cout << "Hello, world\n";
     std::cout.rdbuf(coutbuf); // restore the original stream buffer
     std::cout << "saved \"" << sbuf.str() << "\"\n";

请注意,当std::cout 被破坏时,您应该恢复std::cout 的流缓冲区,因为流缓冲区被刷新(即在其上调用pubsync())。

【讨论】:

以上是关于检查将啥输出写入标准输出的主要内容,如果未能解决你的问题,请参考以下文章

如何让 git diff 写入标准输出?

对标准输入、标准输出和标准错误感到困惑?

检查 python 中正在运行的子进程的标准输出

如何将 CSV 输出写入标准输出?

将 CSV 写入标准输出或文件名

当父母和孩子都写入标准输出时,输出中没有交错