2015-12-12 126 views
1

我做了一個非常大的程序,它一直向屏幕輸出非常多的信息。 問題是,我無法一直在那裏閱讀並最終發現錯誤。所以我想出了將cout打印的所有內容寫入文件的想法。 問題是,我已經寫了很多「cout」。通過整個代碼工作並用自定義函數替換每個cout會非常煩人。繞道自定義功能

有沒有辦法讓我可以「掛鉤」cout被重定向到我的自定義函數?

+0

「查找並替換...」 - >「全部替換」正常工作。只是開玩笑,看看[這裏](http://stackoverflow.com/questions/10150468/how-to-redirect-cin-and-cout-to-files)。 – Downvoter

+1

爲什麼不在命令行上重定向程序的輸出,然後解析它? – StoryTeller

回答

3

您可以通過rdbuf方法提供自定義流緩衝區。下面是重定向cout到一個文件中的一個例子:

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

您可以直接重定向標準輸出使用命令行與輸出重定向

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. 

}