【问题标题】:Redirecting function output to /dev/null将函数输出重定向到 /dev/null
【发布时间】:2012-01-04 23:43:45
【问题描述】:

我正在使用一个正在向coutcerr 打印警告消息的库。我不希望此警告消息到达我的程序的输出。如何捕获此输出并将其放入 /dev/null 或类似的?

MWE:

#include <iostream>

void foo()
{
    std::cout << "Boring message. " << std::endl;
};

int main()
{
    foo();
    std::cout << "Interesting message." << std::endl;
    return 0;
}

输出应该是:

Interesting message.

我应该如何修改main 以获得所需的输出? (foo 不得更改。)


我尝试使用freopen()fclose(stdout),正如这个问题How can I redirect stdout to some visible display in a Windows Application? 中所建议的那样。结果是没有打印任何内容。

【问题讨论】:

  • freopen 绝对是在这种情况下应用的最佳实践。

标签: c++ stdout


【解决方案1】:

使用 ios::rdbuf:

#include <iostream>

void foo()
{
    std::cout << "Boring message. " << std::endl;
}

int main()
{
    ofstream file("/dev/null");

    //save cout stream buffer
    streambuf* strm_buffer = cout.rdbuf();

    // redirect cout to /dev/null
    cout.rdbuf(file.rdbuf());

    foo();

    // restore cout stream buffer
    cout.rdbuf (strm_buffer);

    std::cout << "Interesting message." << std::endl;
    return 0;
}

【讨论】:

    【解决方案2】:

    我可以建议一个黑客吗?在使用库函数之前,在相关流上设置一个错误/失败位。

    #include <iostream>
    
    void foo()
    {
        std::cout << "Boring message. " << std::endl;
    }
    
    int main()
    {
        std::cout.setstate(std::ios::failbit) ;
        foo();
        std::cout.clear() ;
        std::cout << "Interesting message." << std::endl;
        return 0;
    }
    

    【讨论】:

    • 谢谢你这个作品,但是,我决定将另一个答案标记为接受的答案。
    • 谢谢@Unapiedra。礼貌总是很感激:)
    • 我可以建议通过rdstate 保存当前状态,然后再将其重置为该状态吗?这比清除流的状态要安全一些。
    • @GuyGreer 不认为这对 cout 来说是个问题,至少好像预先设置了一个失败或坏位,那么它无论如何都不会输出,你可能想清除它或找出设置错误位的原因。我不想对其进行过多的修饰,因为它是一个 hack,并且这个问题还有其他很好的答案
    【解决方案3】:

    如果您确定该事物不会重定向输出(例如,到 /dev/tty/,这将再次成为标准输出)(我不认为),您可以在调用它们之前重定向。

    #include <iostream>
    #include <sstream>
    
    void foobar() { std::cout << "foobar!\nfrob!!"; }
    
    int main () {    
        using namespace std;
    
        streambuf *old = cout.rdbuf(); // <-- save        
        stringstream ss;
    
        cout.rdbuf (ss.rdbuf());       // <-- redirect
        foobar();                      // <-- call
        cout.rdbuf (old);              // <-- restore
    
        // test
        cout << "[[" << ss.str() << "]]" << endl;
    }
    

    【讨论】:

      猜你喜欢
      • 2019-10-11
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 2021-04-14
      • 2012-01-15
      相关资源
      最近更新 更多