Halt и незакрытие файлов

Добрый вечер!

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

В участке кода:

assign(output, 'filename.out'); rewrite(output);
...
if statement then begin write(0); halt; end;
...

Если условие выполнялось, то программа завершала работу успешно, но создавался пустой файл filename.out и там не появлялся 0.

Заработало только после добавления close(output);

Это баг или нормальное поведение? Пробовали запустить под Free Pascal (на контесте его не было), там выводился 0.

А правильно ли это - завершать работу программы, не закрыв файлы? Во многих знакомых мне системах для повышения эффективности работы с файлами используется отложенная запись, когда буферы не особенно спешат выгружаться во внешнюю память. Операция явного закрытия файла принудительно выгружала эти буферы. Конечно, я не знаю, как сделано тут, но рисковать бы не стал - не так уж сложно поставить явно закрытие файла.

Нет, неправильно.

Я согласен, что неправильно. Файлы, разумеется, должны закрываться. Но, насколько я знаю, почти во всех ЯП при завершении программы все файлы выгружаются и закрываются. Поэтому я и ожидал такого поведения от PascalABC.NET. Это не мой код, а код участника олимпиады по программированию - а на олимпиадах участники привыкли к такому поведению компилятора, поэтому мне и стало интересно, почему здесь так не работает.

Это не так.

Я отметил выше, что мой, более чем 40-летний опыт программирования свидетельствует об обратном: далеко не всегда “компилятор отличается умом и сообразительностью”. Да и не хотелось бы, если честно, “навязчивых сервисов”. Если программист сам себе злобный буратинка - зачем ему в этом мешать?

Вы неправильно используете halt.

Файл output закрывается в секции финализации системного модуля если программа завершается нормально и Вы забыли его закрыть. То есть, Вы в файле увидите 0.

Но halt - это аварийное завершение программы - до секции финализации дело не доходит - программа завершается мгновенно. Операционная система закроет файлы, но буферы файлов, которые принадлежат программе, окажутся не сброшенными на диск. Поэтому часть информации будет утеряна.

Вместо halt используйте exit - и всё будет хорошо. Эта процедура просто выходит из подпрограммы или основной программы неаварийно - все секции финализации будут вызваны.

3 лайка