Я искал решение для записи в файл и консоль одновременно. Я нашел приятное решение здесь.
Поскольку я работаю с pre С++ 11, мне пришлось внести небольшое изменение в код из Lightness Races на орбите:
#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
, но все же мне хотелось бы знать, что здесь происходит и как его исправить.