0

这是一道考试题:

考虑到下面的 C++ 程序,应该插入什么 //*****来确保 100% 干净关闭?

#include <iostream>
#include <fstream>

int main(int argc, char* argv[])
{
    using namespace std;

    fstream log("log.txt", ios::out);
    streambuf* clog_buf = clog.rdbuf(log.rdbuf());

    clog << "Test the logger" << endl;

    //*****
}
  • A. 什么都没有。
  • B. 退出();
  • C. clog.rdbuf(clog_buf);
  • D. clog.rdbuf(0);
  • E.log.rdbuf(0);

我对这段代码的使用log和使用感到困惑。clog为什么我们不能只创建一个文件并写下我们需要的所有内容?任何解释将不胜感激。

4

3 回答 3

2

该代码将标准clog流(最初适用于 STDERR)交换为文件流。这意味着程序中任何流向的代码clog实际上现在将流向文件。这是重定向日志输出的一种很好的本地化方式,它不需要搜索/替换clog源代码中的一千万条文本话语。

答案是C,它将clog流恢复到您在隐式启动之前找到它的方式return 0,并且程序优雅地结束,包括正常的文件流销毁。

exit()是非正常关闭,不会正确关闭您的文件流。

于 2013-12-16T22:56:39.597 回答
2

clog_buf指向 clog 在您用 重置它之前指向的流缓冲区rdbuf。通过使用 C ( ) 将 clog 的流缓冲区重置为之前的状态,可以实现完全关闭clog.rdbuf( clog_buf );

于 2013-12-16T22:54:23.917 回答
0

此代码似乎不是异常安全的。因此,面对异常,没有一个答案可以确保 100% 干净关闭。

于 2013-12-16T23:04:47.540 回答