我一直在寻找解决方案来同时写入文件和控制台。我发现了一个很好的解决方案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) –