我做了一個非常大的程序,它一直向屏幕輸出非常多的信息。 問題是,我無法一直在那裏閱讀並最終發現錯誤。所以我想出了將cout打印的所有內容寫入文件的想法。 問題是,我已經寫了很多「cout」。通過整個代碼工作並用自定義函數替換每個cout會非常煩人。繞道自定義功能
有沒有辦法讓我可以「掛鉤」cout被重定向到我的自定義函數?
我做了一個非常大的程序,它一直向屏幕輸出非常多的信息。 問題是,我無法一直在那裏閱讀並最終發現錯誤。所以我想出了將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.
}
「查找並替換...」 - >「全部替換」正常工作。只是開玩笑,看看[這裏](http://stackoverflow.com/questions/10150468/how-to-redirect-cin-and-cout-to-files)。 – Downvoter
爲什麼不在命令行上重定向程序的輸出,然後解析它? – StoryTeller