Как открыть файл free pascal

Обновлено: 06.07.2024

В данной главе будут рассмотрены возможности языка Free Pascal для работы с файлами. По ходу изложения материала читатель также познакомится с компонентами Lazarus, предназначенными для выбора файла.

Предварительно давайте познакомимся с типами файлов.

7.1 Типы файлов в Free Pascal

Ввод данных с клавиатуры удобен при обработке небольших объёмов информации. В случае обработки массивов, состоящих из сотен элементов, использовать ввод данных с клавиатуры нерационально. В подобных случаях данные удобно хранить в файлах. Программа будет их считывать, обрабатывать и выводить результаты на экран или в файл . Рассмотрим, как это можно сделать.

C точки зрения программиста все файлы можно разделить на три класса:

  • типизированные;
  • бестиповые;
  • текстовые.

Файлы, состоящие из компонентов одного типа (целые, вещественные, массивы и т. д.), число которых заранее не определено и может быть любым, называются типизированными. Они заканчиваются специальным символом " конец файла ", хранятся в двоичном виде, содержимое подобных файлов нельзя просмотреть обычным текстовым редактором, для их просмотра нужно писать специальную программу.

В бестиповых файлах информация считывается и записывается блоками определённого размера. В подобных файлах хранятся данные любого вида и структуры.

Текстовые файлы состоят из любых символов. При записи информации в текстовый файл все данные преобразуются к символьному типу, в котором и хранятся. Просмотреть данные в подобном файле можно с помощью любого текстового редактора. Информация в текстовом файле хранится построчно. В конце каждой строки хранится специальный символ "конец строки ". Конец самого файла обозначается символом " конец файла ".

Для работы с файлами в программе следует описать файловую переменную. Для работы с текстовым файлом файловая переменная (например f ) описывается с помощью служебного слова text .

var f : text;

Для описания типизированных 1 Типизированные файлы иногда называют компонентными. файлов можно описать файловую переменную следующим образом:

var f : file of тип;

Бестиповый файл описывается с помощью служебного слова file .

Рассмотрим несколько примеров описания файловых переменных.

Рассмотрим последовательно работу с файлами каждого типа.

7.2 Работа с типизированными файлами

Знакомство с методами обработки типизированных файлов начнём с подпрограмм, которые являются общими для всех типов файлов.

7.2.1 Процедура AssignFile

Для начала работы с файлом необходимо связать файловую переменную в программе с файлом на диске. Для этого используется процедура AssignFile(f,s) , где f — имя файловой переменной, а s — полное имя файла на диске (файл должен находиться в текущем каталоге при условии, что к нему специально не указывается путь).

Рассмотрим примеры использования AssignFile для различных операционных систем.

7.2.2 Процедуры reset, rewrite

После установления связи между файловой переменной и именем файла на диске нужно открыть файл, воспользовавшись процедурами reset или rewrite .

Процедура reset(f) , где f — имя файловой переменной, открывает файл, связанный с файловой переменной f , после чего становится доступным для чтения первый элемент, хранящийся в файле. Далее можно выполнять чтение и запись данных из файла.

Процедура rewrite(f) создаёт пустой файл (месторасположение файла на диске определяется процедурой AssignFile ) для последующей записи в него данных.

Если файл, связанный с файловой переменной f , существовал на диске, то после выполнения процедуры rewrite вся информация в нём уничтожается.

7.2.3 Процедура СloseFile

Процедура CloseFile(f) , где f — имя файловой переменной, закрывает файл, который ранее был открыт процедурами rewrite или reset .

Процедуру CloseFile(f) следует обязательно использовать при закрытии файла, в который происходила запись данных.

Дело в том, что процедуры записи в файл не обращаются непосредственно к диску, они записывают информацию в специальный участок памяти, называемый буфером файла. После того как буфер заполнится, вся информация из него переносится в файл. При выполнении процедуры closefile сначала происходит запись буфера файла на диск, и только потом файл закрывается. Если его не закрыть вручную, то закрытие произойдёт автоматически при завершении работы программы. Однако при автоматическом закрытии файла информация из буфера файла не переносится на диск, и, как следствие, часть информации может пропасть.

После записи информации в файл, его обязательно закрывать с помощью процедуры CloseFile. Однако при чтении данных из файла нет необходимости в обязательном закрытии файла.

7.2.4 Процедура rename

Переименование файла, связанного с файловой переменной f , осуществляется в то время, когда он закрыт, при помощи процедуры rename(f,s) , где f — файловая переменная, s — новое имя файла (строковая переменная).

7.2.5 Процедура erase

Удаление файла, связанного с переменной f , выполняется посредством процедуры erase(f) , в которой f также является именем файловой переменной. Для корректного выполнения этой операции файл должен быть закрыт.

7.2.6 Функция eof

Функция eof(f) (end of file), где f — имя файловой переменной, принимает значение "истина" ( true ), если достигнут конец файла, иначе — "ложь" ( false ). С помощью этой функции можно проверить, достигнут ли конец файла и можно ли считывать очередную порцию данных.

При запуске окна FreePascal оно имеет небольшие размеры.



Для увеличения размеров консольного окна в Windows кликнем правой кнопкой мыши в заголовок окна и в выпадающем меню выберем пункт "Свойства":



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



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



С новыми параметрами окно FreePascal выглядит комфортно больше:



Для создания программы, нужно создать новый файл - Выбираем меню "File -> New".



Составили код программы и обрактив внимание, что по умолчанию наша программа называется noname01.pas. Замечу, что и местом сохранения по умолчанию является каталог компилятора FreePascal, что не сосвсем-то хорошо.



Поэтому выберем своё место расположения файла и дадим программе своё имя файла. Выбираем меню "File -> Save as. ".



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



обратите внимание, что две точки для перехода на уровень выше всегда располагаются после всех каталогов текущего уровня:



Остановимся в каталоге C:\FPC\ (чтобы далеко не ходить) и дадим нашему файлу своё название.



Вверху окна с кодом программы мы увидим путь и название нашегой файла.



Для компиляции и выполнения нашей программы выбираем меню "Run -> Run" или на клавиатуре нажимаем комбинацию клавиш Ctrl+F9 .





Выбрав строчку в окне "Compile Messages" с найденной ошибкой и нажав на ней Enter - курсор установится в указанном месте, где компилятор обнаружил ошибку (в нашем случае - 4 строка, 11 символ).



Исправим ошибки - сменим двойные кавычки на одинарные:



и снова выбирем меню "Run -> Run" или на клавиатуре нажмём комбинацию клавиш Ctrl+F9 .



При удачной компиляции это окно мелькнет и закроется, программа запустится и исполнится. Мы вернёмся к окну с кодом нашей программы.



Для просмотра результата работы программы необходимо выбрать меню "Debug -> Output"



Нам откроется чёрное окно вывода "User screen", в котором мы увидим результат выполнения нашей программы:



Для переключения с черного окна вывода обратно к окну нашей программы нужно выбрать меню "Window -> Next" или на клавиатуре нажать клавишу F6 (при необходимости несколько раз - это переключение по всем окнам во FreePascal).



Если в тексте (коде) программы производились изменения и они не записаны в файл на диске (т.е. изменения сечас держаться в памяти), то об этом факте нам сигнализирует звёздочка указанная стрелкой на картинке:



Для сохранения изменений в текущем окне необходимо выбрать меню "File -> Save" или на клавиатуре нажать клавишу F2 . Программа сохранится в наш файл на диске. Сигнальная звездочка пропадёт.



Чтобы правильно выйти из FreePascal нужно в меню выбрать "File -> Exit" или на клавиатуре нажать комбинацию клавиш Alt+X . FreePascal корректно закроется.



Буфер FreePascal не взаимодействует с буфером операционной системы. Поэтому, чтобы скопировать текст (код) написанной нами программы, нужно найти наш файл с расширением .pas на диске и открыть через блокнот. Идём в каталог (C:\FPC\), в котором мы сохраняли нашу программу:



В нем мы можем увидеть несколько файлов с названием p001. Чтобы точно знать какой файл открывать в блокноте, настроим проводник Windows так, чтобы он показыввал все расширения. Для этого идем по стрелкам на картинке: Упорядочить, затем Параметры папок и поиска.





Видим наш файл с программой p001.pas - нажимаем на нём правую кнопку мыши и в выпадающем контекстном меню выбираем "Открыть с помощью", затем Выбрать программку. .



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



Раскроются программы для открытия.



Среди программ найдём "Блокнот", выберем её и уберём галочку напротив опции "Использовать выбранную программу для всех файлов такого типа". Далее нажмем "OK".



Наша программа откроется в блокноте.



Из которого мы уже можем скопировать текст программы в буфер Windows оним способом:



. или другим способом:



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

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

Процедурный стиль

Это довольно старый стиль, использующейся ещё во времена, когда Pascal не был объектно-ориентированным языком. Суть его в том, что задается тип файла, определяющий, какие будут храниться в нем данные. Для этого, используется конструкция вида: file of <тип данных>, где <тип данных> - название типа, который хранит в себе файл. Помимо стандартных типов (integer, extended, char и т.д.), существует особый тип - TextFile. Он определят, что каждая строка заканчивается специальным(ми) символом(ами) конца строки (См. LineEnding). Эти файлы могут быть открыты и отредактированы внутри среды Lazarus или в любом другом текстовом редакторе.

Ниже представлены примеры создания собственных типов файлов:

Обработка ошибок ввода/вывода

Параметр компилятора обработки ошибок ввода/вывода указывает, как должна вести себя программа при возникновении ошибки в процессе работы с файлами: вызвать исключение или хранить результат операции ввода/вывода в специальной переменной IOResult.

Это задаётся с помощью специальной директивы компилятора:

В случаи подавления ошибок ввода-вывода () результат операции с файлом будет храниться в переменной IOResult типа cardinal (числовой тип). Каждое число, хранимое в IOResult определяет тип возникшей ошибки(подробнее: [1]).

Процедуры работы с файлами

Эти процедуры и функции находятся в модуле system. Для более подробной информации смотрите документацию FPC:

  • AssignFile (не допускайте использование процедуры Assign) - Связывает переменную с файлом
  • Append - Открывает существующий файл для записи данных в конец и их редактирования
  • BlockRead - Чтение данных из не типизированного файла в память
  • BlockWrite - Запись данных из памяти в не типизированный файл
  • CloseFile (не допускайте использование процедуры Close) - Закрыть открытый файл
  • EOF - Проверка наличия конца файла
  • Erase - Стереть файл с диска
  • FilePos - Получить позицию в файле
  • FileSize - Получить размер файла
  • Flush - Записать файловый буфер на диск
  • IOResult - Возвращает результат последней операции ввода\вывода
  • Read - Считать из текстового файла
  • ReadLn - Считать из текстового файла и перейти к следующей строке
  • Reset - Открыть файл для чтения
  • Rewrite - Создать и открыть файл для записи
  • Seek - Изменить позицию в файле
  • SeekEOF - Переместить позицию в файле в его конец
  • SeekEOLn - Переместить позицию в файле в конец строки
  • Truncate - Удалить все данные, после текущей позиции
  • Write - Записать переменную в файл
  • WriteLn - Записать переменную в текстовый файл и перейти к новой строке

Пример

Пример работы с текстовым файлом (тип TextFile):

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

Обратите внимание, что в примере используется блок try/except. Данный способ позволяет выполнять несколько операций с файлами и использовать обработку исключений. Вы также можете использовать режим , но тогда вам придется проверять переменную IOResult после каждой операции с файлами для контроля ошибок.

Ниже приведен пример записи текста в конец файла:

Чтение текстового файла:

Объектный стиль

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

Кроме того, большинство классов обработки строк, могут иметь возможность загружать/сохранять содержимое из/в файл. Эти методы обычно называются SaveToFile и LoadFromFile.

Двоичные файлы

Для прямого доступа к файлам, так же удобно использовать класс TFileStream. Этот класс представляет собой инкапсуляцию системных процедур FileOpen, FileCreate, FileRead, FileWrite, FileSeek и FileClose, расположенных в модуле SysUtils.

В приведенном ниже примере обратите внимание, что обработка действий с файлом, расположена внутри блока try..except. Поэтому обработка ошибок происходит так же, как в случаи использования процедур работы с файлами в классическом Pascal.

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

Для работы с файлами большого объёма, рекомендуется использовать буфер, например в 4096 байт.

Копирование файла

Теперь,зная методы работы с файлами, мы можем реализовать простую функцию копирования файла, скажем FileCopy.(такой функции нет в FreePascal, хотя Lazarus её имеет copyfile):

Обработка текстовых файлов (TStringList)

Для текстовых файлов можно использовать класс TStringList, чтобы загрузить весь файл в память и иметь легкий доступ к его строкам. Вы также можете записать StringList обратно в файл:

Демо: сохранить одну строку в файл

Для того, чтобы сохранить одну строку в файл, вы можете воспользоваться процедурой, описанной ниже.

Для связи файла в коде программы и действительного файла на внешнем носителе используется процедура ASSIGN :

Текстовые файлы в паскале: процедуры работы

Возможные расширения файлов:
*.txt, *.log,
*.htm, *.html

Метод работы с текстовым файлом в Паскале предусматривает лишь последовательный доступ к каждой строке файла. Это означает, что начинать всегда возможно только с первой строки, затем проходя по каждой строке, дойти постепенно до необходимой. Т.е. можно сказать, что чтение (или запись) из файла (в файл) ведутся байт за байтом от начала к концу.

Предусмотрены два режима работы: режим для записи в файл информации и для чтения ее из файла. Одновременная запись и чтение запрещены.

Открытие файла

Допустим, мы в программе описали переменную для работы с текстовым файлом:

Рассмотрим дальнейшую последовательность работы с ним, и рассмотрим процедуры, необходимые для работы с текстовым файлом в Паскале:

процедура открытия существующего файла для чтения при последовательном доступе:

процедура открытия создаваемого файла для записи в него информации; если файл с таким именем уже существует, то информация в нем стирается:

процедура добавления в конец:

  • При открытии курсор устанавливается в начало файла.

открытие файла

Чтение из файла

Read (f, список переменных); ReadLn (f, список переменных);

Отличие ReadLn от Read в том, что при использовании readln после прочтения данных пропускаются все оставшиеся символы в данной строке, включая метку конца строки.

  • чтение осуществляется с той позиции, где в данный момент стоит курсор;
  • после чтения курсор сдвигается к первому непрочитанному символу.

Чтение до конца строки

close ( f ); reset ( f );

Запись в текстовый файл

Write (f, список переменных); WriteLn (f, список переменных);

Процедуры работы с файлом и закрытие файла

Нахождение конца файла:

Логическая функция, возвращающая True, если достигнут конец файла.

Нахождение конца строки:

Логическая функция, возвращающая True, если достигнут конец строки.

Удалить файл в Паскале

Переименование файла в Паскале

rename(переменная_файла,'новое имя файла');

Закрытие:

Важно: Таким образом, работа с файлом осуществляется через три основных шага:

Рассмотрим пример работы с файлами в паскале:

Пример 1: В файле text.txt записаны строки. Вывести первую и третью из них на экран.
(предварительно создать text.txt с тремя строками)

var filetext: text; a,b,c:string; begin assign(filetext,'c:\text.txt'); reset(filetext); readln(filetext,a); readln(filetext,b); readln(filetext,c); close(filetext); writeln(a); writeln(c); end.

Пример 2: Дан текстовый файл. Вывести количество содержащихся в нем символов и строк (маркеры концов строк EOLN и конца файла EOF при подсчете количества символов не учитывать).

* Из задачника М. Э. Абрамян (Text4)

var F: Text; N,K:integer; Name:String; C:Char; begin Assign(F,'c:\text.txt'); Reset(F); N:=0; K:=0; While not eof(F) do begin inc(N); While not eoln(f) do begin inc(K); Read(F,C); end; Readln(F); end; Close(F); Writeln(N,' ',K); end.

Пример 3:
Считать из файла input.txt числа (числа записаны в столбик). Затем записать их произведение в файл output.txt

var p, x: integer; f: text; begin assign(f, 'input.txt'); reset(f); p := 1; while not eof(f) do begin readln(f, x); p := p * x; end; close(f); assign(f, 'output.txt'); rewrite(f); writeln(f, 'Произведение чисел ', p); close(f); end.

var filetext: text; a:string; i:integer; begin assign(filetext,'c:\text.txt'); rewrite(filetext); for i:=1 to 10 do . reset(filetext); for i:=1 to 10 do begin . . end; close(filetext); end.

pascal file text2. Даны целые положительные числа N и K. Создать текстовый файл и записать в него N строк, каждая из которых состоит из K символов «*» (звездочка).

* Из задачника М. Э. Абрамян (Text1)

pascal file text3. Дана строка S и текстовый файл. Добавить строку S в конец файла.

* Из задачника М. Э. Абрамян (Text5)

Пример 4: Дана строка S и текстовый файл. Добавить строку S в начало файла.

* Из задачника М. Э. Абрамян (Text7)

var F_in,F_out: Text; Name,S: String; begin Write('S: '); Readln(S); Assign(F_in,'c:\text.txt'); Reset(F_in); Assign(F_out,'c:\text1.txt'); Rewrite(F_out); Writeln(F_out,S); While not eof(F_in) do begin Readln(F_in,S); Writeln(F_out,S); end; Close(F_in); Close(F_out); Erase(F_in); Rename(F_out,'c:\text.txt'); end.

pascal file text4. Дано целое число K и текстовый файл. В данном файле вставить пустую строку перед строкой с номером K . Если строки с таким номером нет, то оставить файл без изменений.
Для решения задачи можно использовать дополнительный временный файл.

* Из задачника М. Э. Абрамян (Text9)

Пример 5: Дано целое число K и текстовый файл. Удалить из файла строку с номером K . Если строки с таким номером нет, то оставить файл без изменений.

* Из задачника М. Э. Абрамян (Text15)

var F_in,F_out: Text; Name,line: string; K,i:integer; begin Write('K: '); Readln(K); Assign(F_in,'c:\text.txt'); Assign(F_out,'c:\text1.txt'); Reset(F_in); Rewrite(F_out); i:=0; While not eof(F_in) do begin Readln(F_in,line); inc(i); if i<>K then Writeln(F_out,line); end; Close(F_in); Close(F_out); Erase(F_in); Rename(F_out,'c:\text.txt'); end.

Пример 6: Дан текстовый файл F1 с набором нулей и единиц. Необходимо заменить все вхождения сочетаний 101 на 000 . Скорректированные записи поместить в файл F2 .

var f1,f2: text; pole:string; pz:integer; begin assign(f1,'1.txt'); assign(f2,'2.txt'); reset(f1); rewrite(f2); while not eof(f1) do begin readln(f1, pole); while pos('101',pole)<>0 do begin pz:=pos('101',pole); delete(pole,pz,3); insert('000',pole,pz); end; writeln(f2,pole) end; close(f1); close(f2); end.

Работа с данными из файла как с массивом

  • для сортировки необходим массив, для того чтобы одновременно работать со всеми числами;
  • неизвестно общее количество чисел.
  • объявляем массив для 100 элементов;
  • открываем файл на чтение, просчитываем количество чисел, заполняя массив, сохраняем количество в N;
  • сортируем N элементов массива;
  • записываем результат в файл.
pascal file text6. Дан текстовый файл. Удалить из него все пустые строки.

* Из задачника М. Э. Абрамян (Text16)

А теперь вернемся к олимпиадному заданию по Паскалю, частично решенному на одном из предыдущих заданиях:

p.in p.out
3
hello earth
khoor hduwk

var a:char; i,n,k:byte; s,s1:string; f_in,f_out:text; begin Assign(F_in,'z:\p.in'); Assign(F_out,'z:\p.out'); Reset(F_in); Rewrite(F_out); s1:=''; readln(f_in,k); readln(f_in,s); for i:=1 to length(s) do begin n:=ord(s[i]); if n<>32 then n:=n+3; if . then . ; if . then . ; if . then . ; a:=chr(. ); s1:=. ; end; writeln(s1); writeln(f_out,s1); close(f_in); close(f_out) end.

var a:char; i,n,k:byte; s,s1:string; f_in,f_out:text; begin Assign(F_in,'z:\p.in'); Assign(F_out,'z:\p.out'); Reset(F_in); Rewrite(F_out); s1:=''; readln(f_in,k); readln(f_in,s); for i:=1 to length(s) do begin n:=ord(. ); if n<>32 then n:=n+3; if n=123 then n:=97; if n=124 then n:=98; if n=125 then n:=99; a:=chr(n); s1:=s1+a; end; writeln(s1); writeln(f_out,s1); close(f_in); close(f_out) end.

полное решение var s, s1: string; i, j, a, n, k, b: integer; begin n := 97; s1 := ''; readln(s); readln(k); for i := 1 to length(s) do begin if s[i] <> ' ' then begin a := ord(s[i]); if a > 122 - k then for j :=123 - k to 122 do begin b:=122-j; if a = j then begin a := n+k-b-1; inc(n); end; end else a := a + k; s1 := s1 + chr(a) end else s1 := s1 + ' ' end; writeln(s1)end. --> pascal file text7. Пять делителей.
Имя входного файла: z3.in
Имя выходного файла: z3.out

Читайте также: