Открытия, записи и закрытия файла


У меня маленький 10-вкладыш функция, которая записывает данные в файл с помощью функции std::потока. Я прямо не называют .метод close() в конце функции, но это не код комментарий с причиной что лучше явно вызвать его для стиля и детализации причин. Я понимаю, что нет никакого вреда в призвание .закрыть() явным образом, но не называя его прямо перед возвращением заявления, указывает на отсутствие понимания или веры в РАИИ?

Стандарт C++ говорит:

§27.8.1.2

виртуальный ~ basic_filebuf ();

[3] воздействие: уничтожает объект класса basic_filebuf. Призывы закрыть().

Имею ли я право на мой аргумент, что звоню .метод close() в конце функции избыточных и/или ненужные?

bool SomeClass::saveData()
{
    std::ofstream saveFile(m_filename);

    if (!saveFile.is_open())
        return false;

    saveFile << m_member1 << std::endl;
    saveFile << m_member2 << std::endl;

    saveFile.close(); // passed review only with this line
    return true;
}

Функция должна возвращать значение false , если файл не может быть открыт для записи.



7453
65
задан 2 февраля 2011 в 04:02 Источник Поделиться
Комментарии
4 ответа

Я утверждаю прямо противоположное.

Явно закрывает поток, вероятно, не то, что вы хотите сделать. Это потому, что когда вы закрыть() поток есть потенциал для исключений быть брошенным. Таким образом, когда вы явно закрыть файловый поток, это означает, что вы оба хотите закрыть поток и четко обрабатывать любые ошибки, которые могут привести (исключения это или плохо-бит) от закрытия потока (или потенциально вы говорите, если это не удается, я хочу не быстро (исключение-разрешено убить приложение)).

Если вы не заботитесь об ошибках (т. е. вы не собираетесь в любом случае, чтобы справиться с ними). Вы должны просто позволить деструктор делать закрытия. Это потому, что деструктор будет ловить и выбрасывать исключения, таким образом, позволяя кодекса течь обычно. При общении с закрытием файла-это то, что вы обычно хотите сделать (если закрытие не имеет ли это значение?).

67
ответ дан 2 февраля 2011 в 07:02 Источник Поделиться

Предполагая, что fstream объекта является локальным для функции, я бы склонны возразить против этого. Люди должны привыкнуть к тому, чтобы разрешить РАИИ делать свою работу, и закрывать объект fstream попадает под эту категорию. Дополнительный код, который не выполняет что-то полезное-это почти всегда плохая идея.

Редактировать: чтобы не быть неправильно понятым, я хотел возразить против этого, не только за этот конкретный случай, А вообще. Это не просто бесполезно, но, как правило, забывается то, что нужно, и (что хуже всего) - это, по сути, невозможно реализовать в любом случае-люди, которые думают только с точки зрения "нормального" выхода из функции действительно нужны, чтобы остановиться и осознать, что в ту минуту они добавлена обработка исключений в C++, правила изменились коренным образом. Вы должны думать в терминах РАИИ (или нечто подобное), что обеспечивает очистку при выходе из области-и явно закрывать файлы, освобождая память и т. д., никак не квалифицируются.

37
ответ дан 2 февраля 2011 в 04:02 Источник Поделиться

Здесь золотую середину. Причиной эксперты хотел, что явного вызова метода close() "как стиль и многословие" заключается в том, что без него они не могут сказать, просто читая код, если вы хотели сделать это таким образом, или если вы совершенно забыли об этом и просто повезло. Кроме того, возможно, их эго было в синяках от падения заметить или вспомнить, по крайней мере сначала, что метод close() будет вызван деструктор. Добавляя комментарий, что деструктор вызывается метод close() не плохая идея. Это немного дармовые, но если ваши сотрудники нуждаются в уточнении и/или заверения, теперь, есть хороший шанс, случайный сопровождающий несколько лет вниз по дороге тоже, особенно если ваша команда не много файл ввода-вывода.

16
ответ дан 2 февраля 2011 в 11:02 Источник Поделиться

Я разрываюсь на этом. Вы абсолютно правы. Однако если стандарт кодирования требует вызова метода close() явно или группы народный консенсус этого, существует не так много вы можете сделать. Если бы я был тобой, я бы просто плыть по течению. Утверждая такие вещи бесперспективно.

8
ответ дан 2 февраля 2011 в 04:02 Источник Поделиться