这是一道考试题:
考虑到下面的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。exit()
- C。clog.rdbuf(clog_buf)
- D。阻塞.rdbuf(0)
- E。log.rdbuf(0)
我对这段代码中log
和clog
的使用感到相当困惑。为什么我们不能创建一个文件并写下我们需要的一切?如有任何解释,不胜感激。
clog_buf
指向在使用rdbuf
重置之前阻塞所指向的流缓冲区。通过使用C(clog.rdbuf( clog_buf );
)将阻塞的流缓冲区重置为以前的缓冲区,可以实现干净的关闭。
代码将标准clog
流(最初在STDERR上工作)交换为文件流。这意味着程序中任何地方流到clog
的代码现在实际上都将流到文件中。这是一种很好的本地化重定向日志输出的方法,不需要搜索/替换源代码中文本clog
的1000万个语句。
答案是C,它将clog
流恢复到隐式return 0
启动之前的状态,程序正常结束,包括正常的文件流销毁。
exit()
是一种不正常的关闭,它不会正确关闭文件流。
此代码似乎不是异常安全的。因此,面对例外情况,没有一个答案能确保100%干净的关闭。