私は、ファイルとコンソールに同時に書き込むソリューションを探していました。私は良い解決策を見つけた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'には既にそれらを扱う演算子があります。その仕事をして、フォーマットされた出力を処理させてください。 2つのストリームで生の出力を複製するだけで済みます。これは 'streambuf'クラスの仕事です。それを正しく実装し、すべてのオペレーションを他の2つのバッファにリダイレクトしてください:[Dr.Dobbの記事](http://www.drdobbs.com/questions-answers/184403387)、[別のリンク](http://www.cplusplus。 com/forum/general/64174 /#msg347154) –