Работа с файлами в Паскале: общие сведения

В языке Pascal выделяются файловые данные, которые используются для работы с информацией, находящейся на внешних устройствах. Данная информация заложена в памяти компьютера, формируя определенную область, которую называют «файл».

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

Файлы классифицируют на логические и физические. Последние располагаются на съемном носителе и им задается имя. Логические представлены в программе.

Язык Pascal содержит 3 вида файлов:

  1. Текстовые (text).
  2. Типизированные файлы (fileof<тип>);
  3. Бестиповые или нетипизированные (file).

Описание файловых переменных. Пример:

var
f1: fileofchar;
f2: fileofinteger;
f3: file;
t: text;

Стандартные процедуры и функции

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

Assign(f, FileName)

Отвечает за связку файловой переменной f с файлом, имя которого указано в строке FileName. Эта связь будет непрерывной до завершения работы программы или до того времени, пока не произойдет переназначение.

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

Пример:

Assign (chf, ‘G:\Home\ Student\ Lang\ Pascal\ primer.dat’);

Reset(f)

Открывает файл для чтения, с которым в связке файловая переменная f. После выполнения процедуры Reset файл будет готов к чтению из него первого элемента. Если указанный файл не будет найден, процедура Reset будет завершена с сообщением об ошибке.

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

Rewrite(f)

Процедура открывает файл для записи, с которым в связке файловая переменная f. После выполнения процедуры Rewrite файл готов к записи. Если такой файл уже существовал, то данные будут перезаписаны.

Пример:

Rewrite(<имя_ф_переменной>);

Close(f)

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

Пример:

Close(<список файловых переменных>);

EOF(f): boolean

Процедура возвращает значение TRUE, когда во время чтения будет достигнут конец файла. Это значит, что в файле был прочитан последний элемент или он оказался пустым.

Rename(f, NewName)

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

Erase(f)

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

IOResult

Процедура возвращает целое число, которое соответствует коду последний ошибки ввода-вывода. Если операция будет завершена нормально, функция IOResult вернет значение 0. Значение функции нужно присваивать какой-либо переменной, поскольку при каждом вызове функция будет обнулять свое значение. IOResult работает с ключом компиляции {$I-}или когда выключен режим проверок ошибок ввода.

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

Что такое текстовый файл? По сути, это совокупность строй, которые разделены метками конца строки. Файл завершается меткой конца файла. К каждой строке предоставляется доступ только последовательно, начиная с первой. Чтение и запись одновременно – запрещены.

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

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

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

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

Количество символов, соответствующее длине строки, помещается в переменную типа string (и то только в том случае, если ранее не встретились символы конца файла или конца строки).

Чем отличаются Read от ReadLn? В первой процедуре после прочтения данных пропускаются все остальные символы в данной строке, в том числе и метка конца строки. Если списка переменных нет, ReadLn(f) пропускаетстрокупричтениитекстовогофайла.

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

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

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

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

Процедура WriteLn в отличие от Write после записи всех значений из переменных записывает ищи метку конца строки (создается законченная строка файла).

Добавление информации к концу файла:

Append(f)

Данная процедура открывает текстовый файл чтобы добавить информацию к его концу. Эту процедуру применяют вместо Rewrite.

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

Что такое типизированный файл? Это последовательность компонент любого заданного типа (за исключением типа «файл»). К компонентам файла осуществляется доступ по их порядковым номерам. Нумерация начинается с 0. Номер текущей компоненты (указатель) после открытия файла стоит в его начале на нулевом компоненте. После каждой записи или чтения указатель будет сдвигаться к следующему компоненту.

Запись в файл:

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

Эта процедура записывает информацию из списка переменных в файл f.

Write(<имя_ф_переменной>, <список записи>);

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

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

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

Смещение указателя файла:

Seek(f, n);

Смещает указатель файла f на заданную позицию (n). Нумерация в файле считается с нуля.

Определение количества компонент:

FileSize(f): longint;

Процедура возвращает количество компонента в файле f.

Определение позиции указателя:

FilePos(f): longint;

Возвращает порядковый номер текущего компонента файла f.

Отсечение последних компонент файла:

Truncate(f);

Функция отсекает конец файла (с текущей позиции включительно).

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

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

Открытие нетипизированного файла:

Reset(f, BufSize)

Rewrite(f, BufSize)

BufSize задает число байтов, которые записываются в файл или считываются из него за одно обращение. Максимальное значение BufSize – 64 Кбайт, минимальное – 1 байт. Если значение не указано, то по умолчанию используется 128.

Чтение данных из нетипизированного файла:

BlockRead(f, X, Count, QuantBlock);

Процедура осуществляет чтения в переменную Х количества блоков (за одно обращение), заданное параметром Count. Длина блока соответствует длине буфера. Значение Count не бывает меньше 1. Максимальный объем чтения – 64 Кбайт за одно обращение.

QuantBlock – необязательный параметр. Он возвращает число блоков, прочитанных текущей операцией BlockRead. При успешном завершении операции чтения QuantBlock равно Count. При аварийной ситуации QuantBlock будет содержать число блоков, которые были удачно прочитаны. Таким образом, параметр QuantBlock позволяет осуществлять контроль за правильностью выполнения операции чтения.

Запись данных в нетипизированный файл:

BlockWrite(f, X, Count, QuantBlock);

За одно обращение процедура осуществляет запись из переменной Х количества блоков, которые были заданы параметром Count. Длина блока = длине буфера. QuantBlock возвращает число блоков, которые были успешно записаны текущей операцией BlockWrite.

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

Пример решения задачи с файлами Pascal

Условия задачи: нужно сформировать текстовый файл на языке Pascal, после через переписать из него во второй файл стройки, которые начинаются с большой или маленькой буквы «А» («а»).

В таком случае, потребуется две файловые переменные f1 и f2. Так как файлы текстовые тип переменных – text. Решение задачи состоит из двух частей:

  1. Создание первого файла.
  2. Чтение первого файла и создание второго.

Также есть смысл задать еще одну часть, которая не была указана в задачи, — вывод содержимого второго файла на экран.

Program primer;
Var f1,f2:text;
I,n: integer;
S: string;
Begin
{1 часть: формируем первый файл}
Assign(f1, ‘file1.txt’); {устанавливаемсвязьфайловойпеременной с физическим файлом на диске}
Rewrite(f1); {открываем файл для записи}
Readln(n) {определим количество вводимых строк}
for i:=1 to n do
begin
readln(s); {вводим с клавиатуры строки}
writeln(f1,s); {записываем последовательно строки в файл}
end;
close(f1); {завершаем работу с первым файлом, теперь на диске есть файл с именем file1.txt, содержащий введенные нами строки. На текущемэтапепрограммуможнозакончить, работу с файлом можно продолжить в другой программе, в другое время, но мы продолжим}

{2 часть: чтение из первого файла и формирование второго}
Reset(f1); {открываем первый файл для чтения}
Assign(f2, ‘file2.txt’); {устанавливаемсвязьвторойфайловойпеременной с физическим файлом}
Rewrite(f2); {открываем второй файл для записи}

{Затемнужнопоследовательносчитывать строки из первого файла, проверять выполнение условия и записывать необходимые строки во второй файл. Для чтения из текстового файла лучше использовать цикл по условию «пока не конец файла»}
While not eof(f1) do
Begin
Readln(f1,s);{из первого файла считываем очередную строку}
If (s[1]=’A’) or (s[1]=’a’) then
Writeln(f2,s); {во второй файл записываем строки, удовлетворяющие условию}
End;
Close(f1,f2); {завершаем работу с файлами}

{3 третья: выводим на экран второй файл}
Writeln;
Writeln(‘Второй файл содержит строки:’);
Reset(f2); {открываем второй файл для чтения}
While not eof(f2) do {пока не конец второго файла}
Begin
Readln(f2,s);{считываем очередную строку из второго файла}
Writeln(s); {выводим строку на экран}
End;
End.

Видео урок по работе с файлами в Паскаль

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *