检查将哪些输出写入标准输出

时间:2015-08-18 17:44:45

标签: c++ stdout cout

我想检查输出是否在程序的某个部分写入标准输出(通过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 个答案:

答案 0 :(得分:3)

您可以创建一个流缓冲区,它既可以收集写入的字符,也可以将它们转发到另一个流缓冲区,例如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被破坏时,您应该在刷新流缓冲区时恢复pubsync()的流缓冲区(即调用std::cout)。 / p>