我一直在尋找解決方案來同時寫入文件和控制檯。我發現了一個很好的解決方案here。爲什麼`<< std :: endl`不能調用我想調用的操作符?
由於我的工作預先C++ 11我不得不做出從亮度種族代碼的微小變化在軌道:
#include <iostream>
#include <fstream>
#include <string>
struct OutputAndConsole : std::ofstream
{
OutputAndConsole(const std::string& fileName)
: std::ofstream(fileName.c_str()) // constructor taking a string is C++11
, fileName(fileName)
{};
const std::string fileName;
};
template <typename T>
OutputAndConsole& operator<<(OutputAndConsole& strm, const T& var)
{
std::cout << var;
static_cast<std::ofstream&>(strm) << var;
return strm;
};
它可以很好地除了一件小事情需要我的困惑。如果我用這樣的:
int main(){
OutputAndConsole oac("testLog.dat");
double x = 5.0;
oac << std::endl;
static_cast<OutputAndConsole&>(oac << "foo \n" << x << "foo").operator<<(std::endl);
oac << "foo" << std::endl;
}
那麼所有的std::endl
都在控制檯上的輸出,而他們在文件中正確顯示忽視。我的猜測是,當我使用std::endl
時,將調用ostream::operator<<
,它將打印到文件而不是控制檯。帶有static_cast<OutputAndConsole&>
的行是我試圖調用正確的操作符的嘗試,但仍然只有\n
的換行符出現在控制檯上。
爲什麼要調用std::endl
錯誤的運算符?
我該怎麼稱呼正確的?
PS:我知道,我可以使用\n
沒有問題,但我仍想知道這到底是怎麼回事,如何解決它。
如果你使用'\ n'來結束一行,你將不會遇到這個問題。你真的需要'std :: endl'做的額外的東西嗎? –
@PeteBecker你是絕對正確的,我不需要它,但我仍然想知道什麼是錯的,以及如何解決它。 – user463035818
停下。 'ostream'已經有處理這些的操作符。讓它完成工作並處理格式化的輸出。您只需要通過其他兩個流複製原始輸出。這是'streambuf'類的工作。只要正確實施,並將所有操作員重定向到其他兩個緩衝區:[Dr.Dobb的文章](http://www.drdobbs.com/questions-answers/184403387),[另一個鏈接](http://www.cplusplus。 com/forum/general/64174 /#msg347154) –