Подтвердить что ты не робот

Мне нужно закрыть std:: fstream?

Возможный дубликат:
Нужно ли вручную закрыть ifstream?

Нужно ли мне называть fstream.close() или fstream правильным объектом RAII, который закрывает поток при уничтожении?

У меня есть локальный объект std::ofstream внутри метода. Могу ли я предположить, что файл всегда закрыт после выхода из этого метода без вызова close? Я не мог найти документацию деструктора.

4b9b3361

Ответ 1

Я думаю, что предыдущие ответы вводят в заблуждение.

fstream является правильным объектом RAII, он автоматически закрывается в конце области действия, и нет необходимости вообще обращаться к close вручную, когда закрытие в конце области является достаточным.

В частности, это не "лучшая практика", и ее не нужно очищать вывод.

И хотя Дракоша прав, что вызов close дает вам возможность проверить бит-бит потока, в любом случае этого никто не делает.

В идеальном мире можно просто называть stream.exception(ios::failbit) заранее и обрабатывать исключение, которое создается в деструкторе fstream. Но, к сожалению, исключения в деструкторах являются сломанной концепцией в С++, поэтому это не очень хорошая идея.

Итак, , если вы хотите проверить успех закрытия файла, сделайте это вручную (но только тогда).

Ответ 2

Чтобы добавить к Amy Lee ответ, лучше сделать это вручную, так как вы также можете проверить наличие ошибок.

BTW, согласно "закрыть" manpage:

Не проверять возвращаемое значение close() является общим, но тем не менее серьезная ошибка программирования. Тихо возможно, что ошибки в предыдущем запись (2) сначала сообщается на последнем закрытии(). Не проверять возвращаемое значение при закрытии файла может приводят к бесшумной потере данных. Это может особенно наблюдаются с NFS и с дисковой квотой.

Успешное закрытие не гарантирует что данные были успешно выполнены сохранен на диске, поскольку ядро пишет. Это не характерно для файловая система для сброса буферов, когда поток закрыт. Если вам нужно убедитесь, что данные физически сохраненное использование fsync (2). (Это будет зависеть на аппарате диска в данный момент.)

Ответ 3

Я считаю хорошей практикой закрыть ваш поток, потому что вам нужно сбросить буфер, что мне сказали