
- •Var a: array [1..10] of array [1.. 20] of real;
- •Var a: array [1..10, 1..20] of real;
- •14 Алгоритмы сортировки одномерных массивов
- •15 Функции
- •Описание и вызов процедур и функций
- •15 Процедуры
- •18. Механизм передачи параметров
- •23Стандартные процедуры и функции создания графических примитивов
- •26. Графические процедуры и функции: стандартные алгоритмы циклической прорисовки графических примитивов
- •27. Графические процедуры и функции: стандартные алгоритмы прорисовки движущегося рисунка
- •24. Записи
- •5.2. Доступ к файлам
- •5.3. Текстовые файлы
5.3. Текстовые файлы
Текстовые файлы хранят информацию в виде последовательности символов. Символы составляют строки произвольной длины. В конце каждой строки находятся два особых символа: #13 #10, которые отделяют строку от следующей. Текстовые файлы широко распространены, их способен создавать любой экранный редактор.
В программе на Паскале текстовый файл представляет файловая переменная типа TEXT. Ее описывают предложением
VAR имя: TEXT
Файловой переменной назначают имя файла при помощи оператора
assign (файловая переменная, имя файла),
где имя файла — строка, содержащая дисковое имя файла.
Больше нигде в программе не появится имя файла, всюду его заменит файловая переменная.
Теперь файл необходимо открыть. Текстовый файл можно открыть: для чтения — оператором
reset (файловая переменная); для записи — оператором
rewrite (файловая переменная); для пополнения — оператором
append (файловая переменная).
В файл, открытый для записи или пополнения, можно только писать, из файла, открытого для чтения, можно только читать. Если необходимо прочесть из файла, открытого для записи, его сначала надо закрыть оператором
close (файловая переменная),
а затем снова открыть уже для чтения.
Чтение из текстового файла
Чтение из файла выполняется хорошо знакомым нам оператором READ.
Для ввода информации из файла, открытого для чтения, используется уже знакомый вам оператор Read. Правда, в его формате и использовании вы заметите некоторые изменения:
Read(<Имя файловой переменной>, <Список ввода>);
Происходит считывание данных из файла в переменные, имена которых указаны в списке ввода. Переменные должны быть того же типа, что и компоненты файла.
Если перед списком ввода в операторе READ стоит файловая переменная, он вводит данные не с клавиатуры, а из файла.
Например:
var
f: text; a.b.c: integer;
begin
read (a,b,c); {ввод с клавиатуры}
read (f,a,b,c); {ввод из файла}
Текстовый файл для оператора READ такой же источник символов, как и клавиатура, только эти символы следуют друг за другом не во времени, а в пространстве файла. Во времени можно перемещаться лишь в одну сторону, по файлу — тоже. Движение допускается последовательное, от начала к концу, поэтому текстовые файлы называют последовательными.
Чтобы уяснить, что прочтет из файла тот или иной оператор READ, введем понятие указателя файла. Фактически указатель — это номер очередного символа файла, но лучше вообразить его в виде стрелки, направленной в определенную точку файла.
Сразу после открытия стрелка указывает на первый сим\вол файла. Чтение очередной порции данных всегда выполняется, начиная с символа, на который показывает стрелка. После чтения стрелка автоматически передвигается вперед на длину прочитанного участка. Так продолжается, пока стрелка не достигнет конца файла. Дальнейшие попытки чтения вызовут сообщение об ошибке.
Как узнать, можно ли еще читать из файла ? Для этого в Паскале есть логическая функция
EOF (файловая переменная)
Она возвращает true, если достигнут конец файла, и false в противном случае. Название функции сокращает слова «End Of File» — конец файла.
Дополнительный оператор чтения READLN вводит все, предусмотренное списком ввода, и продвигает указатель до начала следующей строки.
ПРИМЕР. Чтение из текстового файла с выводом на экран.
var
f: text;
s: string;
begin
assign (f.'XXX.TXT);
reset (f);
while not eof (f) do
begin
readln (f, s); {ввод из файла}
writeln (s); {вывод на экран}
end {while};
close(f)
end.
Запись в текстовый файл:
Запись в текстовый файл выполняется оператором WRITE, в котором перед списком вывода стоит файловая переменная. Вывод информации производит, как можно догадаться оператор
Write(<Имя файловой переменной>, <Список вывода>);
Данные из списка вывода заносятся в файл, открытый для записи.
Для текстовых файлов используются также операторы Readln и Writeln с соответствующими дополнениями, относящимися к файловому вводу-выводу.
Выводимая информация присоединяется к той, что была выведена в файл с момента его открытия.
Желая создать новый файл, его открывают оператором REWRITE. Если же хотят дополнить уже существующий файл, открытие выполняют оператором APPEND. Открытие существующего файла оператором REWRITE приведет к потере того, что находилось там раньше.
Закончив запись в файл, вы должны его закрыть. Только после закрытия новый файл будет окончательно сформирован.
Дополнительный оператор записи WRITELN выводит все, предусмотренное списком вывода, и символы #13 #10 в придачу.
ПРИМЕР. Ввод с клавиатуры и запись в текстовый файла 10 чисел .
var
f: text;
s: string;
i: integer;
begin
assign (f.'XXX.TXT);
rewrite (f); {открытие файла}
for i:=1 to 10 do
begin
writeln (‘ввести число’); {вывод запроса на экран}
readln (s); {ввод с клавиатуры числа}
writeln (f,s); {вывод в файл}
end
close (f) {закрытие файла}
end.
. Типизированные файлы.
Файлы произвольного доступа в ТП носят название типизированных. Элементами таких файлов могут быть числа, массивы, записи, но только не файлы.
Все элементы типизированного файла одного типа, а значит, и одного размера. Именно благодаря этому возможен произвольный доступ к элементам типизированного файла, т.к. по номеру элемента однозначно определяется его местоположение на магнитном диске. Нумеруются элементы файла целыми числами, начиная с нуля.
Типизированная файловая переменная описывается предложением
var имя: file of базовый тип
Связь файловой переменной с набором данных на диске выполняется, как и для.текстовых файлов, оператором Assign.
В отличие от текстовых, типизированные файлы допускают чередование операций записи и чтения независимо от того, каким оператором, Reset или Rewrite, был открыт файл. Оператором Reset открываются уже существующие файлы, а оператором Rewrite — новые. Закрывается файл оператором Close. Внешне все четыре оператора не отличаются от таких же операторов для текстовых файлов.
Чтение из типизированного файла выполняется оператором
Read (файл, vl [,v2,...,vN]),
запись — оператором
Write (файл, v1 [,v2,...,vN]),
где v1 ,v2 vN — переменные базового типа.
Запись и чтение из типизированных файлов выполняются без преобразования данных, что существенно ускоряет эти операции. За это мы лишаемся важного преимущества
существенно ускоряет эти операции. За это мы лишаемся важного преимущества текстовых файлов — возможности хранить в файле разнотипные данные.
Произвольный доступ к элементам файла выполняется оператором
Seek (файл, номер элемента: longint)
Этот оператор устанавливает указатель файла на элемент, номер которого является вторым параметром. Именно этот элемент будет считан или записан при очередном вводе или выводе.
Текущее положение указателя файла возвращается функцией
FilePos (файл) : longint,
а общее количество записей — функцией
FileSfee (файл) : longirrt
Как и для текстовых файлов, ситуация «конец файла» диагностируется функцией EOF (файл).
Поскольку типизированные файлы не нуждаются в разделителях элементов, функция EOF и дополнительные операторы ReadLn и WriteLn для них не имеют смысла.
ПРИМЕР. Работа с типизированным файлом.
var
f: file of real;
R: real;
i: integer;
begin
{создать новый файл по имени REAL-FILE.DAT}
assign (f, 'REALFILE.DAT');
rewrite (f);
{сохранить вещественные числа в типизированном файле}
for i := 1 to 5 do
begin
readln (R);
write (f,R);
end;
{записать последнее число на место первого}
seek (f, fileSize (f) - 1);
read(f.R);
seek (f, 0);
write (f, R);
{дописать в файл число 5.5}
seek (f, filesize (f));
R := 5.5;
write (f, R);
{вывести содержимое файла на экран}
reset (f);
{без закрытия не будут видны изменения}
while not eof (f) do
begin
read (f,R);
writeln (R);
end {while};
close (f); {закрыть файл}
end,
Теперь рассмотрим непосредственную организацию чтения и записи.
Решим следующую задачу: "Написать программу, которая вводит с клавиатуры список фамилий учащихся, а затем распечатывает его, кроме тех учащихся, у которых фамилия начинается с буквы 'Ш'".
Так как заранее количество данных не известно, то для их хранения используем файл. Тип элементов - строковый.
Program L;
Var
I,N : Integer;
F : File Of String;
S : String;
Begin
Assign(F,'Spis.lst'); {Связываем переменную F с файлом Spis.lst}
Writeln('Введите количество учащихся');
Readln(N); {Вводим количество учащихся}
Rewrite(F); {Создаем файл для записи в него данных}
For I:=1 To N Do {Для всех учащихся}
Begin
Writeln('Введите фамилию');
Readln(S);
Write(F,S)
End;
Close(F);
Reset(F);
Writeln('Список учащихся:');
While Not(Eof(F)) Do
Begin
Read(F,S);
If S[1]<>'Ш' ThenWriteln(S)
End;
Close(F)
End.