【问题标题】:Considering the C++ program below, what should be inserted in place of //***** to ensure a 100% clean shutdown?考虑到下面的 C++ 程序,应该插入什么来代替 //***** 以确保 100% 干净关闭?
【发布时间】:2014-01-04 12:37:15
【问题描述】:

这是一道考试题:

考虑到下面的 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.什么都没有。
  • 乙。退出();
  • C. clog.rdbuf(clog_buf);
  • D. clog.rdbuf(0);
  • E. log.rdbuf(0);

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

【问题讨论】:

  • 您有两个(clog 和 log)流都拥有相同的 streambuf。当流超出范围时会发生什么?
  • 在考试季中询问考试问题的答案(即使您已经提交了考试)似乎是一个糟糕的选择。也许你可以/应该问你的导师?
  • @jrok:谢谢,已更正。
  • 典型的考试题。在现实生活中,您会访问 cppreference.com 或查看您的 Strousup 书籍以确保您正确使用了 API。因为通常当您认为自己做对了时,其实并没有。
  • @datenwolf:你还没有更正它。 “编译器可能会警告”和“肯定缺少返回语句”都是不真实的。 main 是一个特例。

标签: c++ clog


【解决方案1】:

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

【讨论】:

  • 感谢您的回答。但是在 VS 2008 上,没有“clog.rdbuf(clog_buf);”的代码运行良好。如何测试是否是干净关机?
  • 你可以调用'clog
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 2010-10-04
      • 2014-01-07
      • 2020-02-18
      • 2016-09-29
      • 2015-12-25
      相关资源
      最近更新 更多