我想将std::cerrstd::cout的输出重定向到文件。为此,我在下面的代码示例中使用了rdbuf函数。不幸的是,我收到了异常(exception)

Exception thrown: read access violation.

*(__imp_std::basic_ios<char,std::char_traits<char> >::rdbuf(...)) was 0xCCCCCCCC.

每当我尝试将任何内容写入std::coutstd::cerr时。

这是产生我的问题的代码示例:
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;
}

此示例应创建两个文件,但不会向其中两个写入任何文件。我究竟做错了什么?

最佳答案

std::ofstream拥有其缓冲区,并且当std::ofstream对象超出范围时,它们将破坏缓冲区,从而使用指向缓冲区的无效指针来生成std::coutstd::cerr

确保不要过早删除缓冲区。

09-10 07:29
查看更多