std::cerr
とstd::cout
の出力をファイルにリダイレクトしたいとします。この目的のために、私はrdbuf
関数を以下のコードサンプルのように使用しました。私はstd::cout
かstd::cerr
には何も書いてみるたび残念ながら、私は例外std :: cerrをファイルにリダイレクトしようとするとアクセス違反の例外が発生する
Exception thrown: read access violation.
*(__imp_std::basic_ios<char,std::char_traits<char> >::rdbuf(...)) was 0xCCCCCCCC.
を受けます。ここで
は私の問題を生成コードサンプルです:
void redirect()
{
auto t = std::time(nullptr);
auto tm = *std::localtime(&t);
std::ostringstream oss;
oss << std::put_time(&tm, "%Y-%m-%d_%H-%M-%S.log");
auto cerrFileName = "cerr-" + oss.str();
auto coutFileName = "cout-" + oss.str();
std::ofstream cerrFile(cerrFileName, std::ios::ate); // file is created
std::cerr.rdbuf(cerrFile.rdbuf());
std::ofstream coutFile(coutFileName, std::ios::ate); // file is created
std::cout.rdbuf(coutFile.rdbuf());
}
int main()
{
redirect();
std::cout << "Test"; // The exception is thrown here.
return 0;
}
このサンプルでは、それが必要として、2つのファイルを作成しますが、それらのいずれに何も書き込みません。私は間違って何をしていますか?
出力をリダイレクトしているオブジェクトの寿命を考えてみましょう。 – molbdnilo