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