Учитывая приведенную ниже программу на C++, что следует вставить вместо //*****, чтобы обеспечить 100% чистое отключение?
Это экзаменационный вопрос:
Учитывая приведенную ниже программу на 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; //***** }
- А. Ничего не пропало.
- B. выход ();
- C. clog.rdbuf(clog_buf);
- D. clog.rdbuf(0);
- E. log.rdbuf(0);
Я довольно запутался в использовании log
а также clog
в этом коде. Почему мы не можем просто создать файл и записать все, что нам нужно? Любое объяснение будет оценено.
3 ответа
clog_buf
указывает на буфер потока, на который указывает засорение, прежде чем вы сбросите его rdbuf
, Чистое отключение может быть достигнуто путем сброса буфера потока засорения к тому, что было раньше, используя C (clog.rdbuf( clog_buf );
).
Код меняет стандарт clog
Поток (который изначально работает на STDERR) для файлового потока. Это означает, что любой код в любой точке программы, которая передает clog
вместо этого теперь будет выполняться потоковая передача в файл. Это хороший локализованный способ перенаправления вывода журнала, который не требует поиска / замены десяти миллионов высказываний текста. clog
в вашем исходном коде.
Ответ С, который обращает clog
вернуться к тому, как вы нашли его до неявного return 0
запускается, и программа завершается изящно, включая обычное уничтожение файлового потока.
exit()
это постепенное завершение работы, которое не приведет к правильному закрытию вашего файлового потока.
Этот код не является безопасным для исключений. Поэтому, несмотря на исключения, ни один из ответов не обеспечит 100% -ное отключение.