绕过 cout 到自定义函数

Detour cout to custom function

我做了一个相当大的程序,它一直在屏幕上打印很多信息。 问题是我不能一直在那里阅读并最终发现错误。所以我想出了把cout打印的所有东西都写到一个文件中的想法。 问题是,我已经写了很多"cout's"。完成整个代码并用自定义函数替换每个 cout 会非常烦人。

有什么方法可以 "hook" 重定向到我的自定义函数吗?

您可以通过 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);
    }
};

然后在您的 intilization/main 例行程序中执行以下操作:

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.

}