Как сделать файл в паскале

Добавил пользователь Владимир З.
Обновлено: 05.10.2024

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

Когда связь с внешним файлом установлена, для подготовки ее к операции ввода или вывода файловая переменная должна быть “открыта”. Существующий файл можно открыть с помощью процедуры Reset, а новый файл можно создать и открыть с помощью процедуры Rewrite. Текстовые файлы, открытые с помощью процедуры Reset доступны только по чтению, а текстовые файлы, открытые с помощью процедуры Rewrite, доступны только по записи. Типизированные и нетипизированные файлы всегда допускают как чтение, так и запись,независимо от того были они открыты с помощью процедуры Reset или с помощью процедуры Rewrite.

Когда начинается выполнение программы, всегда автоматически открываются стандартные текстовые файловые переменные Input и Оutput (ввод и вывод). Input - это доступный только по чтению файл, связанный с клавиатурой, а Оutput - это доступный только по записи файл, связанный с дисплеем.

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

Обычно доступ к файлам организуется последовательно, то есть, когда элемент считывается с помощью стандартной процедуры Read или записывается с помощью стандартной процедуры Write, текущая позиция файла перемещается к следующему по порядку элементу файла. Однако к типизированным и нетипизированным файлам можно организовать прямой доступ с помощью стандартной процедуры Sееk, которая перемещает текущую позицию файла к заданному элементу. Для определения текущей позиции в файле и текущего размера файла можно использовать стандартные функции FileРоs и Filesize.

Когда программа завершает обработку файла, он должен закрываться с помощью стандартной процедуры Сlose. После полного закрытия файла связанный с ним внешний файл обновляется. Затем файловая переменная может быть связана с другим внешним файлом.

Общий вид описания файлов:

Стандартные процедуры и функции для текстовых файлов

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

Для текстовых файлов существует специальный вид операций чтения и записи (read и write), который позволяют вам считывать и записывать значения, тип которых отличается от символьного типа. Такие значения автоматически переводятся в символьное представление и обратно. Например, Read(f,i), где i - переменная целого типа, приведет к считыванию последовательности цифр, интерпретации этой последовательности, как десятичного числа, и сохранению его в i.

Имеются две стандартных переменных текстового типа - это Input и Оutput. Стандартная файловая переменная Input - это доступный только по чтению файл, связанный со стандартным файлом ввода операционной системы (обычно это клавиатура), а стандартная файловая переменная Оutput - это доступный только по записи файл, связанный со стандартным файлом вывода операционной системы (обычно это дисплей). Перед началом выполнения программы файлы Input и Оutput автоматически открываются, как если бы были выполнены следующие операторы:

Аналогично, после завершения работы программы эти файлы автоматически закрываются. Примечание: если программа использует стандартный модуль Сrt, то файлы Input и Оutput не будут по умолчанию относиться к стандартным файлам ввода и вывода.

Для некоторых из стандартных процедур, список которых приведен в данном разделе, не требуется явно указывать в качестве параметра файловую переменную. Если этот параметр опущен, то по умолчанию будут рассматриваться Input или Output, в зависимости от того, будет ли процедура или функция ориентирована на ввод или на вывод. Например, Read(х) соответствует Read(Input,х) и Write(х) соответствует Write(Output,х).

Процедуры

Функции

Процедура Seek

Haзнaчeниe: перемещает текущую позицию в файле к заданному элементу.

Примечания: Параметр f является любой файловой переменно, кроме текстовой, а n представляет собой выражение целого типа.

Текущая позиция в файле f перемещается к элементу с номером n. Номер первого элемента файла равен 0. Для того, чтобы расширить файл, можно выполнить поиск элемента файла, расположенного за последним элементом. Ограничения: Процедуру нельзя использовать для текстовых файлов. Файл должен быть открыт.

Стандартные процедуры и функции для нетипизированных файлов

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

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

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

За исключением процедур Read и Write для всех нетипизированных файлов допускается использование любой стандартной процедуры, которые допускается использовать с типизированными файлами. Вместо процедур Read и Write здесь используются соответственно процедуры Blockrеаd и BlockWrite позволяющие пересылать данные с высокой скоростью.

Процедуры и функции для обработки файлов.

Процедура Аppеnd

Haзнaчeниe: Открывает текущий файл для присоединения.

Тип результата: Параметр f - текстовая файловая переменная, которая должна быть связана с внешним файлом с помощью процедуры Аssign. Процедура Аppеnd открывает существующий внешний файл с именем, назначенным переменной f. Если внешнего файла с указанным именем не существует, то это является ошибкой. Если файл f уже открыт, то он сначала закрывается, а затем открывается заново. Текущая позиция устанавливается на конец файла. Если в последнем блоке файла размером 128 байтов присутствует Сtrl-Z (26 в коде АSСII), то текущая позиция устанавливается в файле таким образом, что при записи первым будет перекрываться символ Сtrl-Z в блоке. Если переменной f было присвоено пустое имя (например, Аssign(f,’’), то после обращения к процедуре Аppеnd f будет указывать на стандартный выходной файл (стандартный канал номер 1). После обращения к Аppеnd f становится доступным только по записи и Еоf(f) всегда принимает значение Тruе.

Процедура Аssign

Haзнaчeниe: присваивает имя внешнего файла файловой переменной.

Примечания: f является файловой переменой любого файлового типа, а “имя” должно представлять собой выражение строкового типа. Дaльнейшие операции с f будут выполняться с внешним файлом с именем, заданным параметром “имя”. После обращения к процедуре Аssign связь, установленная между переменной f и внешним файлом будет существовать до тех пор, пока не будет выполнена другая процедура Аssign для переменной f. Имя состоит из маршрута (пути доступа), определяющего доступ к 0 или более каталогов, имена которых отделены друг от друга с помощью обратной косой черты и за которыми следует действительное имя файла:

Если путь доступа начинается с обратной косой черты, то поиск начинается в корневом каталоге, в противном сучае он начинается в текущем каталоге. “Диск” представляет собой идентификатор диска (А -Z). Если “Диск” и двоеточие будут опущены, то используется назначенный по умолчанию дисковод. “\имя-кат\имя-кат-\. \имя-кат” является корневым каталогом и путем доступа к подкаталогу, в котором содержится имя файла. “имя-файла” может содержать до восьми символов, за которыми могут следовать точка и расширение имени файла, длиной до трех символов. Максимально допустимая длина всего имени файла составляет 79 символов.

Ограничения: Процедура Аssign не должна использоваться для открытого файла. Когда “имя” представляет собой пустую строку, возникает особый случай, то есть Length(имя) равно нулю. В этом случае параметр f становится связанным со стандартным файлом ввода или стандартным файлом вывода. Эти специальные файлы позволяют инициализировать средство изменения направления ввода-вывода операционной системы ДОС. Если присвоено пустое имя, то после обращения к Rеset(f) f будет указывать на стандартный файл ввода, а после обращения к Rеwritе(f) f будет указывать на стандартный файл вывода.

Пример: (Делается попытка назначить для вывода программы вместо ДОС устройство РRN, диск и т.д.)

Функция Еоf (типизированные и нетипизованные файлы)

Haзнaчeниe: Для типизированных или нетипизированных файлов возвращает состояние “конец файла”.

Тип результата: Булевский (boolean).

Примечания: Параметр f представляет собой файловую переменную. Если текущая позиция в файле находится за последним элементом файла или если файл не содержит никаких элементов, то функция Еоf(f) возвращает значение Тruе. В противном случае она возвращает значение False.

Функция Еоf (текстовые файлы)

Haзнaчeниe: Возвращает состояние “конец файла” для текстовых файлов.

Тип результата: Булевский.

Примечания: Параметр f представляет собой файловую переменную, определяющую текстовый файл. Если этот параметр опущен, то используется стандартная файловая переменная Input. Если текущая позиция в файле находится за последним элементом файла или если файл не содержит никаких элементов, то функция Еоf(f) возвращает значение Тruе. В противном случае она возвращает значение False.

Функция Eoln

Haзнaчeниe: Пpoвepяeт, дocтигнут ли конец строки в файле.

Tип результата: логический (boolean).

Зaмeчaния: f, если указана, является файловой переменной типа text. Если f опущена, то подразумевается cтaндapтнaя файловая переменная Input. Eoln(f) возвращает True, если текущая позиция в файле совпадает с маркером конца строки или если истинна функция Eof(f); в противном случае Eoln(f) возвращает False.

Пpи применении Eoln к стандартному входному устройству (Input), которое не было переопределено , нижеописанная программа будет ожидать ввода, возврата каретки (CR),прежде чем вернуться из вызова функции Eoln:

Процедура Еrase

Haзнaчeниe: Стирает внешний файл.

Примечания: Параметр f представляет собой файловую перемененную любого файлового типа. Внешний файл, связанный с переменной f, стирается.

Ограничения: Процедура Еrase не должна использоваться для открытого файла.

Функция FilePos

Haзнaчeниe: Возвращает текущую позицию в файле.

Тип результата: Длинный целый (longint).

Примечания: Параметр f представляет собой файловую переменную. Если текущей позицией является начало файла, то функция FilePos(f) возвращает значение 0. Если текущей позицией в файле является конец файла, то есть Еоf(f) возвращает значение Тruе, то значение, возвращаемое функцией FilePos(f), совпадает со значением, возвращаемым функцией FileSizе(f) (размером файла).

Функция FileSize

Haзнaчeниe: Возвращает текущий размер файла.

Тип результата: Длинный целый (longint).

Примечания: Параметр f представляет собой файловую переменную. Данная функция возвращает число элементов в f. Если файл пуст, функция возвращает значение 0.

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

Процедура FSplit

Haзнaчeниe: Разбивает имя фaйлa на три его компонента.

Зaмeчaния: Разбивает имя фaйлa, указанное пapaмeтpoм Path на три его компонента. Пapaмeтp Dir становится равен имени накопителя и маршруту с возможными предшествующими и последующими символами ‘\’, Name—имени фaйлa, а Ext -- pacшиpeнию фaйлa с предшествующей точкой.

Каждая из cтpoк - кoмпoнeнт может оказаться пустой, если Path не содержит соответствующего компонента. типы PathStr, DirStr, NameStr и ExtStr определены в стандартном модуле DOS следующим образом:

Процедура FSplit никогда не добавляет и не удаляет символы при разбиении имени фaйлa, и сцепление результирующих строк Dir, Name и Ext всегда окажется равным строке, указанной в параметре Path.

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

Ввод мы будем осуществлять из файла input.txt

Вывод будем производить в файл output.txt

Для организации ввода данных из файла надо:

assign(input,'input.txt').

2. Открыть файл для чтения:
reset(input);

3. При работе нужно понимать и помнить отличия процедуры read, от readln. Если в файле данные записаны в одной строке, через пробел, то мы пользуемся все время процедурой read столько раз, сколько чисел нужно прочитать.
Если же строк несколько, то когда доходим до символа стоящего в конце строки, используем readln. В результате чего будет считано последнее число строки и курсор переместится на новую.
read(a); readln(a);

Например, указан следующий формат ввода:

В первой строке ввода находятся три числа через пробел R – радиус основания торта, N – число коробок, С – стоимость за 1 см 2 основания коробки.

Для организации вывода данных в файл надо:

assign(output,'output.txt').

2. Открыть файл для записи:
rewrite(output);

3.Для вывода используем операторы write и writeln также, как и было до сих пор.

Задание 1. Перенаправление. Прочитайте число n из файла input.txt и выведите его в файл output.txt

Program z1;
var a:longint;
Begin
assign(input,'input.txt');
reset(input);
read(a);
close(input);
assign (output,'output.txt');
rewrite(output);
writeln(a);
close(output);
End.

Экспериментальный раздел

Наберите программу в среде программирования Free Pascal, запустите ее на исполнение. У Вас может появится ошибка типа:
exited with exitcode=2 (для Free Pascal), если файла input.txt нет.

Создайте в папке, где сохранена ваша программа файл input.txt и введите в него число.

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

Создание входного файла
Нажать F3, в открывшемся окне диалога Открыть файл написать имя входного файла (например, input.txt).
Если файл не существовал, среда Паскаля откроет пустое окошко с нужным именем. Ввести данные.
Не забыть нажать F2 — сохранить изменения.

Открытие входного и выходного файлов
Переместить курсор на строку в одиноч­ных кавычках, содержащую имя файла, например 'input.txt' в операторе assign.
Нажать Ctrl+Enter.
После изменения входных данных не забыть сохра­нить файл - F2.

Переход между окнами входных, выходных данных и текстом программы осуществляется нажатием клавиши F6.

Задание 2. Сумма двух чисел. Даны числа А и В (0

Задание 3. Перепутал строки. Даны два числа А и В(0

Задание 4. Имеется текстовый файл на 10 строк. Вывести на экран:
а) его первую строку;
б) его пятую строку;
в) его первые 5 строк;
г) его строки с s1-й no s2-ю (s1 и s2 записаны в 11 строке входного файла через пробел);
д) весь файл.


Тесты Посмотреть решение

Задание 5. Сформируйте массив целых чисел (значения для него взять из файла, они записаны во 2-ой строке входного файла). В первой строке этого файла указано количество элементов массива (n

Во второй строке входного файла содержатся N чисел через пробел - элементы массива

Выходные данные:
Первая строка - количество отрицательных элементов массива

Задание 6. Имеются два текстовых файла, состоящие из одной строки. Переписать строку первого файла во второй, а строку второго файла — в первый. Использовать вспомогательный файл.


Program z6;
var s,t:string;
Begin
assign(input,'t1.txt');
reset(input);
read(s);
close(input);

assign(input,'t2.txt');
reset(input);
read(t);
close(input);

assign (output,'t.txt');
rewrite(output);
writeln(s);
close(output);

assign (output,'t1.txt');
rewrite(output);
writeln(t);
close(output);

assign(input,'t.txt');
reset(input);
read(s);
close(input);

assign (output,'t2.txt');
rewrite(output);
writeln(s);
close(output);
End.

Для каждого входного файла
Первая строка содержит число n - количество строк
Вторая строка - n-ая строки содержат текст

Выходные данные:
Для каждого выходного файла
Первая строка - n-ая строка содержат текст

Тесты Посмотреть решение

Задание 8. Даны три целых числа. Определить, имеется ли среди них хотя бы
одна пара равных между собой чисел.

Задание 9. Даны три числа. Определить, существует ли треугольник, сторонами которого являются эти числа, и если существует, найти его площадь.

Выходные данные:
В первой строке запись "да" или "нет"
Во второй строке значение площади, если треугольник существует

Тесты Посмотреть решение

Задачи для самостоятельного решения

1. Создайте текстовый файл на диске, заполненный N целыми числами, записанными через пробел.
а) Выведите на экран сумму этих чисел, среднее арифметическое и произведение;
б) то же вывести в файл в отдельные строки.

2. Дан файл, заполненный целыми числами через пробел. Вывести в новый файл все:
а) четные числа;
б) числа, делящиеся на 3 и не делящиеся на 7.

3. Имеется текстовый файл, состоящий из n строк, записанных в столбик. Переписать его строки в другой файл. Порядок строк во втором файле должен:
а) совпадать с порядком строк в заданном файле;
б) быть обратным по отношению к порядку строк в заданном файле.

4. Имеется текстовый файл, состоящий из n строк, записанных в столбик. Все четные строки этого файла записать во второй файл, а нечетные — в третий файл. Порядок следования строк сохраняется.

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

  • Весь контент сайта(все содержимое хостинга)
  • Полные права на доменное имя сайта(сделаем трансфер)
  • Копирайт сайта на большом количестве сторонних ресурсов так как сайту уже более 4-х лет
  • Готовый движок форума и все исходные тексты системы управления сайтом
  • Все исходные тексты ПО которое опубликовано на сайте
  • Все почтовые ящики доменного имени
  • Все домены третьего уровня

Дополнительную информацию о статистике посещения, клиентах, вы можете узнать написав на почту koder@koder.kz

В этом уроке мы с вами рассмотрим:

  • Чтение из файла
  • Создание и запись в файл
  • Добавление данных в существующий файл
  • Удаление файлов
  • Использование директив ,
  • Создание и удаление вложенных каталогов
  • Описание функции FileSize()

Введение
Файл содержит данные которые в свою очередь хранятся на жестком диске подключенному к компьютеру. Операционная система предоставляет инструменты для работы с файлами(файловой системой). Текстовые файлы как правило могут содержать текст и графическую информацию, комбинированную. Для работы с текстовыми файлами используются текстовые процессоры которые имеются в операционной системе. Текстовые файлы сохраняются на жестком диске компьютера с расшитением *.TXT или *.DOC, *.DOCX. файлы с расширением *.TXT создаются с помощью стандартного текстового процессора Notepad. Но будем помнить что некоторые программы позволяют нам сохранять так сказать отформатированный текст, или текст с картинками, для таких целей NOTEPAD естественно не подходит. Для такого текста используются специальные пакеты программ, такие например как Microsoft Word, Open Office и другие. Такие программы используют несколько иной подход для создания файла нежели NOTEPAD. Таким образом файл созданный в Microsoft Word невозможно правильно открыть в NOTEPAD, а вот файл *.TXT легко открывается в текстовом редакторе Word. Программы которые могут читать файлы расширения *.Ххх называют программами просмоторщиками файлов.
Чтение из файла
Прочитать информацию из файла на языке Паскаль не составит большого труда. Обратите внимание что в Паскале нет никаких зарезервированных слов которые используются для чтения или записи информации в файл. Для этих целей используются уже знакомые нам readln() and writeln(). И так пример, как читать информацию из файла

И так что мы с вами написали. У нас появилась новая переменная типа Text. Такая переменная применяется когда вы хотите получить доступ из своей программы к определенному текстовому файлу. Переменная FileName используется для ввода пользователем имени файла(readln(FileName);). Связь переменной UserFile с файлом, путь к которому указан в переменной FileName осуществляется с помощью функции Assign полный текст будет такой Assign(UserFile, FileName + '.txt'); после этого происходит чтение из файла в цикле Repeat который завершается только после того как достигнут конец файла Eof(UserFile). Чтение из файла производиться функцией Readln(UserFile,TFile); где указывается файл из которого нужно считать строку и переменная в которую мы считаем эту строку. Процеду Writeln(TFile); выводит эту строку к нам на экран.
Создание файла, добавление данных
Давайте сразу посмотрим пример создания и добавления информации в файл.

В приведенном выше примере мы создаем файл с названием 'Textfile' на диске C:\. Создаться файл функцией Rewrite(UserFile); после чего в файл записываются строки Writeln(UserFile,'PASCAL PROGRAMMING');… Writeln(введите свою строку в ваш файл:'); тут первым параметром является файл в который записывается информация и вторым информация которую нужно добавить в файл. После чего мы считываем пользовательскую строку Readln(Txt);, добавляем пустую строку в наш файл Writeln(UserFile,'');потом говорим что сейчас будет пользовательская статья Writeln(UserFile,'The user entered this text:');, записываем пользовательскую статью Writeln(UserFile,Txt); И закрываем файл Close(UserFile);. Помните, файл всегда нужно закрывать, после окончания работы и открывать перед началом работы.
Добавление данных в существующий файл
Для того что бы добавить данные в существующий файл, его нужно открыть на чтение, добавить нужную информацию и закрыть, но не перезаписывать. Некоторые начинающие программисты на самом деле плохо понимают как не перезаписать файл с данными которые они хотели ввести, это общая проблема:

Выполните программу несколько раз, откройте файл 'C:\ADDTEXT.TXT' и посмотрите что в нем. Вы видите только одно предложение? ReWrite(UFile); функция которая открывает файл на перезапись.
Понимаете да что нам не подходит открытие файла с помощью ReWrite(UFile);, нужна какая то новая функция, и она есть это append(f) где F это переменная типа текст, ну мы с вами проходили уже это в этом же уроке. Теперь наша программа будет выглядеть так:

Выполните программу несколько раз для того что бы увидеть изменения.
Удаление файлов
В Паскале для того что бы удалить файл используется зарезервированное слово Erase(f) где F может быть путем к файлу('C:\ADDTEXT.TXT') или самим файлом, переменной типа текст. Важным замечанием будет то что файл удаляется совсем, то есть в корзине своего компьютера вы его не найдете.
В отличии от других функций для работы с файлами функция Erase(f) не открывает файл для его удаления, так что вам не нужно закрывать файл после его удаления.
Пример программы:

Если наш файл не найден функция IOResult вернет значение 0 а если файл не найдет значит функция вернет отличное от нуля значение.
ВАЖНО: если файл успешно найден, файл откроется и вы должны поработав с ним закрыть его, как показано в примерах выше. А вот если он не найден то здравый смысл подсказывает что он не может быть открыт, соответственно и закрывать и работать нам не с чем. Внимательно посмотрите пример еще раз, если у вас есть какие то вопросы, пожалуйста задавайте их в комментариях. Запустите программу несколько раз, с существующими и не существующими файлами, посмотрите на результат работы.
Директивы компилятора рекомендуется использовать со всеми функциями для открытия файлов 'rewrite()', 'append()', 'erase()', а так же 'FSearch()'. Обязательно попрактикуйте этот урок, повторюсь, в случае вопросов обязательно оставляйте их в коментариях. Создание и удаление вложенных каталогов
В языке Pascal есть функции для работы с каталогами. С помощью их можно создавать или удалять каталоги с жестких дисков компьютера. Что бы создать директорию в Паскале используется функция 'createdir(c)' где С имеет тип PChar. PChar является переменной указателем, которая содержит адрес динамической переменной заданного типа. Каталог создается следующим образом:
NewDir := FSearch('C:\Pascal Programming',GetEnv('')); if NewDir = '' then CreateDir('C:\Pascal Programming');
давайте теперь пример, сразу в примере разберем функцию FSearch:

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

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

Это довольно старый стиль, использующейся ещё во времена, когда 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 обратно в файл:

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

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

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