При программировании я часто открываю и закрываю файлы. Я понимаю, что при открытии файла важно проверить наличие ошибок, чтобы увидеть, действительно ли он открылся. Я не знаю ни одного экземпляра, хотя при закрытии файла возникла бы проблема (за исключением, может быть, если открытие файла действительно дало ошибку, и оно не проверялось).
В настоящее время я программирую на ходу, и под os
упаковать .Close()
функция Можно вернуть ошибку, если это необходимо. Я знаю, что в C ++ это тоже возможно.
Итак, наконец, мой вопрос: какие обстоятельства могут вызвать ошибку при попытке закрыть файл?
Да. Закрытие файла может вызвать ошибку / сбой. Смотрите, например, ошибки, которые close(3)
может вернуться — http://linux.die.net/man/3/close — такие вещи, как повреждение файловой системы является одной из вероятных причин.
Часто вы не можете ничего с этим поделать, кроме как записать ошибку и знать, что ваши данные, вероятно, испорчены (в зависимости от ошибки) — вы можете редко «исправить это», за исключением, возможно, перезаписи данных в другое место, если вы еще есть и т.д.
Язык, который вы используете (Go, C ++, без разницы) не имеет значения. Если файловая система переполнена, повреждена или кто-то физически вырвал жесткий диск, то ваш язык программирования просто не сможет вас спасти, и закрытие не удастся, и можно догадаться, безопасно ли где-то хранятся ваши данные или нет.
На уровне операционной системы при закрытии файлов также могут возникать проблемы, особенно если вы записали в них файлы (например, проблемы с буферизацией, нехватка места на диске, удаление носителя и т. Д.).
C ++ fstream
имеет void close()
функция, которая ничего не возвращает. Принцип заключается в том, что после того, как вы вызвали close, вы больше не можете использовать поток независимо от того, произошла ошибка или нет. Однако, когда возникает ошибка закрытия, бит сбоя устанавливается так, что он может быть обнаружен, и код ошибки может быть получен обычным способом.
C fclose()
возвращает int
который показывает, была ли ошибка или нет. Если вы хотите знать, почему это не удалось, вы должны получить и проанализировать errno
код ошибки. Это не так самоочевидно, как функция void, но и здесь вы больше не можете использовать FILE * после завершающего вызова, независимо от того, произошла ошибка или нет.