Оставляя ostream Open - PullRequest
       6

Оставляя ostream Open

0 голосов
/ 29 мая 2018

Я создал регистратор в моей программе на C ++.Исходя из приведенного ниже кода, есть ли какие-либо проблемы, о которых мне следует знать?Я в основном заинтересован в том, чтобы оставить ostream открытым на время выполнения программы и выйти из программы с помощью нечистых методов (т. Е. X'ing из окна консоли).Будет ли система держать файл открытым после завершения программы или объект ostream будет уничтожен после завершения (без использования функции Log :: Close ()).

Мой ход мыслей: зачем открывать / закрывать егоснова и снова, когда я мог просто открыть его один раз и закрыть при выходе?

#ifndef LOG_HPP
#define LOG_HPP

#include <fstream>

namespace Log
{
    static const char* File = "Logs\\Log.log";
    static std::ofstream Log;

    void Initialize()
    {
        Log.open(File, std::ios::app);
    }

    void Record(const char* Message)
    {       
        Log << Message;
    }

    void Close()
    {
        Log.close();
    }

}; // namespace Log

#endif

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

Будет ли система держать файл открытым после завершения программы

Нет!После выхода из программы, независимо от того, будет ли она завершена «обычным» образом или будет уничтожена какой-либо командой ОС или последовательностью управления консоли, почти все ресурсы программы будут освобождены.

Как я знаю, только не полностьюудаленный ресурс является именованным каналом.Обычные файловые дескрипторы обязательно будут отброшены.

Но: возможно, что последнее содержимое буфера не будет записано в физический файл на диске или куда бы вы ни записали.По этой причине будет хорошей идеей flush () сразу после каждой записи.

0 голосов
/ 29 мая 2018

Мне было бы все равно, что закрывать дескриптор файла.Как сказал Клаус, важнее очистить поток после написания каждого сообщения.В Windows вы всегда можете использовать фрейм SEH, блок __try / __ finally.Независимо от того, как вы выйдете из __try, __finally будет выполнен, даже после бросков или возврата.Я ожидаю, что вы получите аналогичные результаты с try / catch, только не используйте return внутри блока try.Или посмотрите здесь: __ try / __ finally в UNIX

0 голосов
/ 29 мая 2018

Стандарт C ++ не определяет, что происходит, когда вы выходите из программы нечистыми методами (т. Е. Извлекаете из окна консоли).

Однако он определяет, что делатьожидается, что при вызове std::abort.

вызов функции std::abort(), объявленной в <cstdlib>, завершает программу без выполнения каких-либо деструкторов и без вызова функций, переданных в std::atexit() или std::at_quick_exit().

Наиболее вероятный результат нечистого выхода из программы - это то, что вы ожидаете увидеть при вызове std::abort().

Будет ли системаоставьте файл открытым после завершения программы

Даже если деструкторы объектов, которые вызываются при чистом выходе из программы, не вызываются в аварийном завершении, ОС, скорее всего, закроет дескрипторы открытых файлов.По крайней мере, это то, что я наблюдал в Windows и Linux.Если с выходными файлами / потоками связаны какие-либо незаполненные буферы, вы не увидите их очищенными.

...