close(F);
writeln('Из файла прочитан следующий массив'); for J:=1 to I do
write('M[',J,']=',M[J],' '); readln;
end.
Отличие процедуры ReadLn в том, что после считывания последней переменной оставшаяся часть строки до маркера EOLN пропускается, поэтому следующее обращение к Read или ReadLn начинается с первого символа новой строки. Для пропуска текущей строки можно вызвать процедуру ReadLn без списка ввода.
Пример программы определения объема текстового файла в учетных издательских листах (1 уч. изд. лист = 40000 знаков).
Program Rukopis; var
F: text;
name, S: String; {для имени файла и для хранения прочитанной строки} Sum: LongInt;{счетчик количества символов}
begin
writeln('Введите имя файла'); readln(name);
assign(F, name); reset(F);
while not EOF(F) do begin
readln(F, S); Sum:=Sum+Length(s);
end;
close(F);
writeln('Объем', Sum/4000:7:3, ' учетных издательских листов'); readln;
end.
Процедура Write обеспечивает запись информации в текстовый файл.
Write(файловая переменная, <список вывода>);
Отличие процедуры WriteLn в том, что после ее выполнения курсор переходит на новую строку. Использование процедуры WriteLn без списка
14
вывода в файл будет записана пустая строка.
Пример программы наполнения и чтения текстового файла
Program Rabota_s_textom; var
F: text; S: String; i: integer;
begin
assign(F, 'Text.txt'); rewrite(F);
writeln('Введите три строки, которые запишутся в файл text.txt'); writeln('Внимание! Файл text.txt должен быть предварительно создан!'); for i:=1 to 3 do
begin readln(S);
writeln(F, S); end;
close(F);
reset(F);
writeln('А теперь выводится текст из файла'); while not EOF(F) do
begin
readln(F, S); writeln(S);
end;
close(F);
readln;
end.
Задание 4 – изучить особенности типизированных файлов языка Паскаль.
Длина любого компонента типизированного файла строго постоянна, что дает возможность организовать прямой доступ к каждому из них по порядковому номеру.
Перед первым обращением к процедурам ввода-вывода указатель файла стоит в его начале и указывает на первый компонент с номером 0. После каждого чтения или записи указатель сдвигается к следующему компоненту файла. Переменные в списках ввода-вывода должны иметь тот же тип, что и компоненты файла.
Процедура Read обеспечивает чтение очередных компонентов
15
типизированного файла
Read(файловая переменная, <список ввода>).
Список ввода должен содержать одну или более переменных такого же типа, что и компоненты файла. Файловая переменная должна быть объявлена предложением file of… и связана с именем файла процедурой assign. Файл необходимо открыть процедурой reset.
Процедура Write используется для записи данных в типизированный
файл.
Write(файловая переменная, <список вывода>);
Процедура Seek смещает указатель файла к требуемому компоненту.
Seek(файловая переменная, <N компонента>);
N компонента – выражение типа LongInt указывающее номер компонента файла. Первый компонент файла имеет номер 0.
Функция FileSize возвращает значение типа LongInt которое содержит количество компонентов файла.
FileSize(файловая переменная);
Функция FilePos возвращает значение типа LongInt содержащее порядковый номер компонента файла, который будет обрабатываться следующей операцией ввода-вывода.
FilePos(файловая переменная);
Пример программы, которая создает новый файл для размещения целых чисел, наполняет его случайным числами и затем выводит его содержимое на экран.
Program Files; const
N=20;
var
F: file of Integer; I, K: integer;
begin
16
assign(F, 'data.dat'); rewrite(F);
for K:=1 to N do begin
I:=random(100); write(F, I);
end;
close(F);
reset(F);
while not EOF(F) do begin
read(F, I); writeln(I);
end;
close(F);
readln;
end.
Задание 5 – изучить особенности нетипизированных файлов языка Паскаль.
Подобные файлы объявляются как файловые переменные типа file и отличаются тем, что для них не указан тип компонентов. Отсутствие типа делает эти файлы, с одной стороны, совместимыми с любыми другими файлами, а с другой позволяет организовать высокоскоростной обмен данными между диском и памятью.
При инициализации нетипизированного файла с помощью процедуры reset или rewrite можно указать длину записи нетипизированного файла в байтах. Пример
F: file;
……….
assign(F, 'myfile.dat'); rewrite(F, 512);
Если длина записи не указана она принимается равной 128 байт.
При работе с нетипизированными файлами могут применяться все процедуры и функции, доступные типизированным файлам, за исключением Read и Write, которые заменяются соответственно высокоскоростными процедурами BlockRead и BlockWrite.
17
BlockRead(файловая переменная, буфер, N, [NN]);
BlockWrite (файловая переменная, буфер, N, [NN]);
Буфер это имя переменной, которая будет участвовать в обмене данными с файлом; N – количество записей, которые должны быть прочитаны или записаны за одно обращение к файлу; NN – необязательный параметр, содержащий при выходе из процедуры количество фактически обработанных записей.
За одно обращение к процедурам может быть передано до N*RECS байтов, где RECS – длина записи нетипизированного файла. Передача идет начиная с первого байта буфера. При завершении процедуры указатель смещается на NN записей. Процедурами Seek, FilePos и FileSize можно обеспечить доступ к любой части нетипизированного файла.
Пример программы, которая готовит массив buf из N случайных целых чисел и записывает его в нетипизированный файл. Затем массив buf очищается, в него читается содержимое файла и массив выводится на экран строками по 10 чисел.
Program Files; const
N=50;
var
F: file;
I, K: integer;
BUF: array [1..N] of Integer;
begin
for K:=1 to N do BUF[K]:=random(100);
assign(F, 'untyped.dat'); rewrite(F, 1);
blockwrite(F, BUF, SizeOf(BUF)); close(F);
for K:=1 to N do BUF[K]:=-1;
reset(F);
blockread(F, BUF, SizeOf(BUF), K); close(F);
for K:=1 to N do begin
write(BUF[K], ' ');
if K mod 10=0 then writeln;
18