PROGRAM archivosejercic1o; TYPE num = целочисленный файл; VAR arch_num: num; имя: строка [20]; x: integer; BEGIN Writeln ('Введите имя файла без расширения:'); readln (имя); имя: = имя + '. txt'; Назначить (arch_num, name); Переписать (arch_num); Writeln ('Введите число, которое нужно добавить в файл:'); readln (x); ПОКА (x 0) НАЧАТЬ запись (arch_num, x); Writeln ('Введите другой номер для добавления в файл:'); readln (x); КОНЕЦ; close (arch_num); END.
У меня есть этот код, который создает файл с серией номеров, которые предоставляет пользователь, после компиляции и выполнения файл появляется в каталоге Pascal, но когда я открываю его, я получаю что-то вроде этого:
Я только начинаю взаимодействовать с архивами, поэтому я новичок в этом, если вы можете мне помочь, я буду благодарен.
Двоичный и текстовый
Вы открываете
файл целого числа
. Это означает, что вы записываете в файл целые числа, т. Е. Файл имеет двоичный формат.Но вы называете его
name + '. txt '
, который предлагает мне записать в файл текст , а не двоичные значения.Теперь, если вы отображаете его как текст, но это не текст, вы не получаете того, что хотите.
Двоичный означает, что вы, для например, напишите 4-байтовое целое число, такое как
12345
(или шестнадцатеричное$ 3039
), как эти 4 байта, то есть байты$ 39
,$ 30
,$ 00
и$ 00
в указанном порядке (или в обратном порядке, в зависимости от порядка байтов на вашем компьютере ).Двоичный файл компактен, но редко читается человеком. Если вы отобразите такой двоичный файл как text , вы можете получить странный результат или, возможно, вообще не получить его (просто попробуйте открыть файл .exe в текстовый редактор и посмотрите, что у вас получится). Вероятно, вы захотите записать числа в виде текста. Или вы используете что-то вроде шестнадцатеричного редактора для их просмотра (если вы умеете читать шестнадцатеричный код).
Итак, открывайте файлы как текст
text
:ПРОГРАММА archivosejercic1o; TYPE num = text; VAR arch_num: num; имя: строка [20]; x: целое число; НАЧАТЬ ... Writeln (arch_num, x); ... END.
Подробнее о двоичном формате и тексте : https: //fileinfo.com/help/binary_vs_text_files. Обратите внимание, что это еще не объясняет различные версии текста Unicode.
1
Lazarus (Pascal) RunError (5)
Моя программа завершается с RunError (5), что говорит о том, что она не может получить доступ к файлу, который должен быть доступен. Я проверил, и файл используется должным образом, файл не доступен только для чтения и т.д. Программа создает файл .dat, если он не существует, и использует его для сохранения.. Если я запускаю программу, а файл не существует, файл создается, но после этого при том же выполнении программа не получит доступ к файлу. Это происходит ТОЛЬКО в том случае, если файл был создан в текущем исполнении.
Так вызываются процедуры (код довольно длинный, но я даю вам несколько первых строк, где возникает ошибка):
fileName: = 'labSave.dat'; CreateFile; назначить (labyrinthFile, fileName); Writeln (CheckFileSize);
, а затем есть каждая из процедур:
процедура Initialize; begin fileName: = 'labSave .dat '; assign (labyrinthFile, fileName); конец; процедура CreateFile; начало, если не FileExists (имя файла), то FileCreate (имя файла); конец; функция CheckFileSize: целое число; начало сброса (labyrinthFile); CheckFileSize: = Размер файла (labyrinthFile); close (labyrinthFile); end;
Согласно форуму Lazarus (http://forum.lazarus.freepascal.org/index.php?topic=4936.0) :
Ошибка выполнения 5 означает отказано в доступе. Возможно, файл доступен только для чтения, и вы используете неправильный (по умолчанию) файловый режим, или вы пытаетесь повторно открыть файл с новым дескриптором файла, не закрывая его раньше (где-то в то время и повторяющиеся циклы, возможно, вы назначаете файл более одного раза, затем сброс не работает?).
Если я правильно сейчас помню, рабочий процесс для создания должен быть следующим:
AssignFile (f, имя файла); Перепишите (е); CloseFile (f);
и для существующего файла:
AssignFile (f, filename); Сбросить (f); CloseFile (f);
Видя другие ошибки, обнаруженные в вашем коде, через вопросы в комментариях, я настоятельно рекомендую вам уделять больше времени отладке, а когда такие ошибки случаются - исключить ВСЕ нерелевантный код и проверьте дизайн кода на наличие случаев, подобных описанным выше (назначение файла перед его созданием и т. д.).