Не могу прочитать сохраненный файл в Pascal 1.9.2

  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);

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

Оцените статью
clickpad.ru
Добавить комментарий