定制定制功能

Detour cout to custom function

本文关键字:功能      更新时间:2023-10-16

我制作了一个相当大的程序,它总是在屏幕上打印很多信息。问题是,我不可能一直在那里阅读并最终发现错误。所以我想出了把cout打印的所有东西都写进一个文件的主意。问题是,正如我已经写的那样,有很多"cout"。处理整个代码并用自定义函数替换每个cout会非常烦人。

有没有一种方法可以将cout"挂钩"重定向到我的自定义函数?

您可以通过rdbuf方法提供自定义流缓冲区。下面是一个将cout重定向到文件的示例:

std::ofstream ofs("output");
std::cout.rdbuf(ofs.rdbuf());

您可以使用带有输出重定向的命令行将标准输出直接重定向到文件

fileneame.exe > log.txt
     or
./filename > log.txt

否则使用一些RAII,如下所示:

class Logger
{
    std::ofstream filehandle;
    std::ostream&   myStream;
    std::streambuf* mySavedStreambuf;
public:
    Logger( std::ostream& oldStream, std::string const& filename)
        : filehandle(filename)
        , myStream(oldStream)
        , mySavedStreambuf(oldStream.rdbuf())
    {
        oldStream.rdbuf(filehandle.rdbuf());
    }
    ~Logger()
    {
        myStream.rdbuf(mySavedStreambuf);
    }
};

然后在初始化/主例程中执行以下操作:

int main()
{
 {
      Logger temp( std::cout, "log.txt" );
      // call funcs that has std::cout, all outputs will be in log.txt
 }// temp goes out of scope, std::cout restored.
 // Call funcs that has std::cout, now all outputs on standard ouput.
}