Пока ваша программа работает, если вы продолжаете открывать файлы, не закрывая их, наиболее вероятным результатом будет то, что у вас закончатся файловые дескрипторы/дескрипторы, доступные для вашего процесса, и попытка открыть больше файлов в конечном итоге потерпит неудачу. В Windows это также может помешать другим процессам открывать или удалять файлы, которые вы открыли, поскольку по умолчанию файлы открываются в режиме эксклюзивного общего доступа, который не позволяет другим процессам открывать их.
Как только ваша программа завершится, операционная система очистится за вами. Он закроет все файлы, которые вы оставили открытыми, когда завершит ваш процесс, и выполнит любую другую очистку, которая необходима (например, если файл был помечен как удаляемый при закрытии, он удалит файл тогда; обратите внимание, что такие вещи являются платформой -специфический).
Однако еще одна проблема, с которой следует быть осторожным, — это буферизация данных. Большинство файловых потоков буферизуют данные в памяти перед их записью на диск. Если вы используете потоки FILE*
из библиотеки stdio, то есть две возможности:
- Ваша программа завершилась нормально либо путем вызова функции
exit(3)
, либо путем возврата из main
(который неявно вызывает exit(3)
).
- Ваша программа завершилась аварийно; это можно сделать, вызвав
abort(3)
или _Exit(3)
, умирание от сигнала/исключения и т.д.
Если ваша программа завершилась нормально, среда выполнения C позаботится об очистке всех открытых буферизованных потоков. Итак, если у вас есть буферизованные данные, записанные в FILE*
, которые не были сброшены, они будут сброшены при обычном выходе.
И наоборот, если ваша программа аварийно завершится, любые буферизованные данные не будут сброшены. ОС просто говорит: «Боже мой, вы оставили дескриптор файла открытым, я лучше закрою его для вас», когда процесс завершается; он понятия не имеет, что где-то в памяти лежат какие-то случайные данные, которые программа намеревалась записать на диск, но не сделала этого. Так что будьте осторожны с этим.
person
Adam Rosenfield
schedule
17.11.2011
fclose
, по крайней мере, не в большей степени, чем с использованиемgoto
. Все зависит от ситуации. - person R.. GitHub STOP HELPING ICE   schedule 18.11.2011