Файловые
переменные.
Типы данных, с которыми мы до сих пор имели дело (числовые:integer,
real и др.; строковые: string и т. д.), предназначены для манипулирования
информацией, содержащейся в оперативной памяти компьютера. Однако известно, что
оперативная память способна хранить данные только временно – пока компьютер
включен. Но как сохранить информацию, чтобы была возможность пользоваться ей и
после выключения компьютера. Для этого, данные сохраняют в долговременной
памяти (дисковые накопители) в виде файлов.
Файл представляет собой некоторое поименованное место на внешнем
носителе (например, на диске). Файл состоит из записей. В структуре файла
имеется специальный так называемый указатель записи, который указывает на
обрабатываемую в данный момент запись. При обработке указатель автоматически
перемещается на следующую запись. Это так называемый последовательный доступ.
При необходимости указатель можно установить в любое место файла.
В Паскале существует три типа файловых переменных:
1.
Типизированные;
2.
Текстовые;
3.
Нетипизированные.
Работа с файловыми переменными в Паскале.
I Описание файловых переменных.
Файл в Паскале является переменной и,
следовательно, он, как и другие переменные, должен иметь имя и описываться в
разделе описания программы.
§ Для типизированных файлов:
Var f:file of a;
Где f – имя файловой переменной,
а –
тип элементов содержащихся в файле (integer, real, string и др.),
file и
of – служебные
слова, имеющие смысл файл и из.
Например: Var
f:file of integer;
§
Для текстовых файлов:
Var f:text;
Где f – имя файловой переменной,
Text
– обозначает, что тип
файловой переменной текстовый.
§
Для нетипизированных
файлов:
Var
f:file;
Где f – имя файловой переменной,
file – обозначает, что тип файловой переменной нетипизированный.
II
Ассоциирование файла с файловой переменной.
При описании файловой переменной в разделе описания программы, не
указывается ни имя файла, ни в каком каталоге он содержится. И поэтому, для
того чтобы конкретный файл стал доступным, его необходимо как-то связать (или
ассоциировать) с ранее объявленной файловой переменной. Такое связывание
осуществляется с помощью процедуры assign.
Формат процедуры:
Assign(f, ‘name’);
Где f – имя файловой переменной любого вида, с которой
ассоциируется файл с диска, имеющий имя name (параметр name принадлежит типу string).
Например:
Assign(f, ‘c:\lesson.txt’);
Результат: файловая переменная ассоциирована с файлом lesson.txt,
который расположен в корневом каталоге диска С.
III
Открытие файла.
Открыть файл можно для чтения, для
записи, а также для чтения и записи одновременно. До открытия файл должен быть
связан (с помощью процедуры Assign) с ранее объявленной
файловой переменной.
Для открытия файлов предназначены
процедуры Reset, Rewrite, Append.
1. Процедура Reset.
Эта процедура,
примененная к текстовому файлу, открывает его только для чтения. Если она
применена к типизированному или нетипизированному файлу, то она открывает его
как для чтения, так и для записи.
Формат:
Reset (f);
Где f – файловая переменная любого типа.
Файл,
открываемый с помощью процедуры Reset, непременно должен
уже существовать. Иначе – ошибка.
2. Процедура Rewrite.
Эта
процедура, примененная к текстовому файлу, открывает его только для записи.
Если она применена к типизированному или нетипизированному файлу, то она
открывает его как для чтения, так и для записи.
Формат:
Rewrite (f);
Отличие
между процедурами Reset и Rewrite:
1)
если процедуру Reset
применить к несуществующему файлу, будет иметь место ошибка; процедура Rewrite
в этом случае создаст новый файл;
2)
если процедуру Reset
применить к уже существующему файлу, файл будет открыт; процедура Rewrite
в этом случае удалит содержимое старого файла и создаст новый
файл с тем же именем.
§
Процедура Append.
Эту процедуру можно использовать только для открытия текстовых файлов.
Формат:
Append (f);
Данная процедура предназначена для добавления информации в уже
существующий файл – она открывает файл и позиционирует указатель в его конец.
IV Ввод-вывод.
Для
осуществления ввода информации в файл и вывода из файла для текстовых и типизированных
файлов предназначены процедуры Read и Write (Readln и Writeln
– только для текстовых файлов), а для нетипизированных
- BlockRead и BlockWrite.
В Паскале имеется две стандартные файловые переменные input
и output ,
которые автоматически открываются при запуске программы и автоматически
закрываются после работы. Эти две переменные ассоциируются не с файлами, а с
конкретными устройствами компьютера: input - с клавиатурой: output – с монитором. Ранее мы использовали процедуры для вывода информации
на экран - write(a,b,’вывод на экран’) и ввода с клавиатуры read(a,b).
Их можно записать иначе: write(output,a,b, ’вывод на экран’) и read(input,a,b) соответственно. Здесь первый оператор записывает в файл output (т.е. выводит на
экран) значения переменных a и b, а также строку текста ’вывод на экран’.
Второй оператор считывает из файла input значения
(т.е. позволяет ввести их с клавиатуры), которые будут присвоены переменным a и b. Первая и вторая пары операторов эквивалентны.
Поэтому, в процедурах read и write,
когда требуется осуществить ввод с клавиатуры или вывод на экран, указывать
файл (input или output) необязательно.
Упомянутые стандартные файлы можно «переассоциировать». Для этого
достаточно воспользоваться процедурой assign, например:
Assign(output,’text.txt’);
Если после этого в данной программе вызвать процедуру write
без указания файла, соответствующая информация окажется, записана в файл text.txt.
1.
Ввод-вывод для типизированных файлов.
Использование
процедуры считывания read для типизированных файлов
заключается в считывании одного или нескольких компонентов файла и присвоении
значения некоторой переменной.
Формат
процедуры считывания из типизированного файла:
Read(f,v1,v2,…,vn);
Где f – файловая переменная;
v1,v2,…vn – имена
переменных, которым будут присвоены данные из файла.
Например:
Read(f,v1,v2);
Запись в
файл осуществляется процедурой write. Использование
данной процедуры для типизированных файлов заключается в присвоении значения
некоторой переменной компоненту файла.
Формат
процедуры записи в типизированный файл:
Write(f,v1,v2,…vn);
Где f – файловая переменная;
v1,v2,…vn – имена
переменных, значения которых записывается в файл. Они должны быть того же типа,
что и компоненты файла.
После
записи каждой переменной, указатель текущей позиции файла перемещается к следующему
элементу. Если указатель находится в конце файла, то при записи очередного
элемента этот элемент дополняет файл.
2.
Ввод-вывод для текстовых файлов.
Текстовый
файл представляет собой последовательность строк разной длины, состоящих из
символов. Каждая строка текстового файла оканчивается маркером конца строки. К
элементам текстового файла возможен только последовательный доступ, начиная с
первого.
Формат
процедуры считывания из текстового файла:
Read(f,v1,v2,…vn);
Где f – файловая переменная;
v1,v2,…vn – имена
переменных, которым будут присвоены данные из файла.
Например:
Read(f,v1,v2);
Как
будет выполняться эта строка:
-
если переменные v1,v2 типа Char, то из файла
считывается символ и присваивается переменной v1, затем считывается следующий символ и присваивается следующей переменной
v2 (если очередной
считанный символ окажется маркером конца файла, то выполнение процедуры считывания
будет прекращено и программа перейдет к следующему оператору);
-
если переменные v1,v2 типа string, то из
файла считываются символы до ближайшего маркера конца строки (пробел или enter) и присваиваются переменной v1, а переменной v2 будет присвоено нулевое значение. А для того чтобы считывать несколько
строк, необходимо использовать не Read, а readln;
-
если переменные v1,v2 типа integer или real,то из файла будут считываться только символы являющиеся числом.
Формат
процедуры записи в текстовый файл:
Write(f,v1,v2,…vn);
Где f – файловая переменная;
v1,v2,…vn – имена
переменных, значения которых записывается в файл.
Файл для
записи должен быть открыт. Если указатель текущей позиции расположен в начале
файла, новая информация записывается поверх старой. Если же указатель находится
в конце файла, то новая информация дополняет содержимое файла.
Например:
Rewrite(f);
Write(f,v1,v2);
Как
будет выполняться этот фрагмент:
процедурой
Rewrite(f) открывается файловая переменная f; процедура Write(f,v1,v2) записывает в файл значения переменных v1,v2.
3.
Ввод-вывод для нетипизированных файлов.
Нетипизированные
файлы отличаются тем, что для них при объявлении не определяется тип
компонентов. Это позволяет получать доступ к файлам с любой структурой. При
открытии файла (процедурами reset или rewrite) необходимо только указать размер элементов (записей), которыми будет
проводиться обмен с файлом. При этом файл трактуется как последовательность
этих записей (т.е. элементов произвольного типа). Вот как выглядит обращение к
процедурам reset и rewrite для
открытия нетипизированного файла:
Reset(f,512);
Rewrite(f,256);
Здесь f – файловая переменная, имеющая тип file (что
соответствует нетипизированным файлам). Второй параметр (512 и 256) – это
размер записей (в байтах), которыми будет производиться считывание из файла или
запись в файл данных. Если этот параметр не задан, по умолчанию длина записи
считается равной 128 байт.
При
определении длины записи следует принять во внимание, что длина файла может оказаться
не кратна этой величине. В этом случае последняя запись окажется неполной и несколько
последних байтов файла, могут быть не считаны, Чтобы этого не случилось, можно
установить длину записи равной единице.
Для
манипулирования нетипизированными файлами подходят те же процедуры, что и для
типизированных, за исключением read и write, Для обмена данными с нетипизированными файлами применяются
специальные процедуры: blockread и blockwrite.
Формат
процедуры blockread:
Blockread(f,buf,c,r);
Где f – нетипизированная файловая переменная;
Buf – переменная, ранее объявленная в программе и используемая в качестве
рабочего буфера. Размер этого буфера, который предназначен для обменов, не
должен быть меньше длины записи, определенной при открытии файла процедурой Reset или Rewrite. Имя этой переменной в качестве
параметра указывается при вызове процедуры Blockread.
C – выражение или значение, соответствующее количеству записей, которые
следует считать из файла;
R – значение, возвращаемое процедурой и соответствующее количеству
считанных записей (необязательный параметр).
Формат
процедуры blockwrite:
Blockwrite(f,buf,c,r);
Где f – нетипизированная файловая переменная;
Buf – переменная, ранее объявленная в программе и используемая в качестве
рабочего буфера. Размер этого буфера, который предназначен для обменов, не
должен быть меньше длины записи, определенной при открытии файла процедурой Reset или Rewrite. Имя этой переменной в качестве
параметра указывается при вызове процедуры Blockwrite.
C – выражение или значение, соответствующее количеству записей, которые
следует добавить в файл;
R – значение, возвращаемое процедурой и соответствующее количеству
добавленных записей (необязательный параметр).
V Специальные операции.
1. Процедура Seek.
Эта
процедура устанавливает указатель на определенный элемент в файле. Файл, к которому
применяется процедура Seek, должен быть открыт.
Формат
процедуры:
Seek(f,n);
Где f – файловая переменная;
n
– номер элемента в файле.
Например,
для того чтобы переместить указатель текущей позиции к третьему элементу файла,
процедура выглядит так: Seek(f,3);
2. Процедура Truncate.
Данная
процедура, будучи применена к открытому файлу, удаляет его содержимое от текущей
позиции и до конца.
Формат
процедуры:
Truncate(f);
Где f – файловая переменная.
3. Функция FileSize.
Определяет
длину файла (т.е. число содержащихся в нем элементов). При этом файл должен
быть открыт.
Формат
функции:
FileSize(f);
Где f – файловая переменная любого типа, за исключением Text.
4. Функция FilePos.
Показывает положение указателя
текущей позиции в файле. При этом файл должен быть открыт.
Формат функции:
FilePos(f);
Где f –
файловая переменная любого типа за исключением Text.
5. Функция EoF.
Значение
этой функции истина (true), когда указатель текущей позиции находится в конце файла, либо если
файл пустой, и ложь (false), во всех других случаях. Эта функция позволяет «нащупать» конец
файла.
Формат функции:
EoF(f);
VI Закрытие файлов.
Открытые
файлы закрываются процедурой close.
Формат
процедуры:
Close(f);
VII. Удаление файла.
Формат
процедуры:
Erase(f);
F –файловая переменная.
Данная
процедура удаляет файл с диска. Процедура отнесена к завершающим, поскольку в
конце работы временно созданные файлы часто приходиться удалять.
Итак, при работе с файловыми
переменными, возможны следующие операции, которые подробно описаны выше:
I Описание файловых переменных.
II
Ассоциирование файла с файловой переменной.
III
Открытие файла.
IV Ввод-вывод.
V Специальные операции.
VI Закрытие файла.
VII. Удаление файла.
Примеры:
1.
С клавиатуры вводятся пять чисел. Определить
все четные числа и записать их в файл.
Uses crt;
Var f:text;
a,x:integer;
begin
assign(f,’c:\file’);
rewrite(f);
for x:=1 to
5 do
begin
readln(a);
if a mod 2=0
then write(f,a);
end;
close(f);
end.
2.
Создать файл file1, записав в
него пять целых чисел, вводимые с клавиатуры. Создайте другой файл file2, сохранив в нем удвоенное значение чисел из файла file1.
uses
crt;
var
f1,f2:text;
x,a,b:integer;
begin
assign(f1,’c:\file1’);
assign(f2,’c:\file2’);
rewrite(f1);
rewrite(f2);
for
x:=1 to 5 do
begin
readln(a);
writeln(f1,a);
end;
close(f1);
reset(f1);
for
x:=1 to 5 do
begin
readln(a);
b:=a*2;
writeln(f2,b);
end;
close(f1);
close(f2);
end.
3.
В конец файла file2 из
предыдущей задачи добавить строку ‘Конец файла’.
Uses
crt;
Var
f2:text; c:string;
Begin
C:= ‘Конец файла’
Assign(f2,’c:\file2’);
Append(f2);
Writeln(f2,c);
Close(f2);
End.
Задачи:
1.
Создать типизированный
файл и записать в него:
a.
Число 4,5
b.
Слово «Привет»
c.
5 одинаковых целых чисел.
d.
Таблицу Пифагора.
Записываемые данные, кроме таблицы Пифагора, вводятся
с клавиатуры.
2.
В конец существующего
файла с таблицей Пифагора записать фразу «конец таблицы».
3.
Вывести на экран таблицу
Пифагора из файла, созданного ранее.
4.
Имеется типизированный
файл с целыми числами. Все его четные элементы заменить нулями.
5.
Имеется типизированный
файл с числами А1. Переписать все числа из этого файла в конец существующего
файла А2.
Оставьте свой комментарий
Авторизуйтесь, чтобы задавать вопросы.