РАБОТА С ФАЙЛАМИ
Файл (последовательность) - это одна из наиболее фундаментальных структур данных. Программная организация компьютеров, их связь с внешними устройствами основаны на файловой структуре.
Файлы позволяют решить две проблемы:
1) возможность формирования и сохранения значений для последующего использования другими программами (например, в программах многократной обработки информационных систем, таких как платежные ведомости, различные АСУ, базы данных, необходимость длительного хранения информации очевидна);
2) взаимодействие программ с внешними устройствами ввода-вывода: дисплеем, принтером, АСП и т.п.
В Паскале эти проблемы снимаются с помощью структурированных данных файлового типа.
Файловый тип данных в программе задается следующем образом:
type <имя файлового типа> = file of <тип компонентов>
В качестве типа компонентов файла разрешается использовать любой тип данных, кроме файлового. Например:
type
intfile = file of integer;
refile = file of real;
chfile = file of char;
ran = 1 .. 10;
st = set of ran;
vector = array[ran] of real;
comp = record
re,im : integer;
end;
setfile=file of st;
vecfile = file of vector;
compfile= file ofcompt;
Описание файловой переменной задается обычным способом в разделе описаний. Например:
var f: intfile; или var f: file of integer;
Файловая переменная является буфером между Паскаль-программой и внешним устройством и должна быть логически с ним связана. Связь осуществляется оператором языка Паскаль:
assign (<имя файловой переменной>,'<имя устройства>')
Как правило, файлы для хранения данных связаны с устройством внешней памяти на магнитных носителях (дисковод) и носят название внешние файлы. Если, например, файл с именем primer, dat логически связан с дисководом А:, то все данные, помещаемые в файл, будут храниться на этом дисковом накопителе, a установка «окна» между программой и файлом будет определяться через файловую переменную f оператором
assign (f, 'primer.dat')
Если внешним устройством является принтер, то связь осуществляется оператором assign(f, '1st:'). Здесь 1st - логическое имя печатающего устройства. Ниже приведены логические имена внешних устройств ввода-вывода:
con - консоль; trm - терминал; kbd - клавиатура; 1st - принтер; aux - буфер сети;
usr-драйвер пользователя.
После осуществления связи файловая переменная f отождествляется с соответствующим файлом.
Для работы с файлом его необходимо открыть, а по окончании работы — закрыть Файл открывается для чтения оператором reset(f), для записи - оператором rewrite(f).
Чтение и запись данных осуществляется известными командами read/write, только в начале списка помещается имя файловой переменной:
read (f, <список ввода>); readln (f, <список ввода>);
write(f, <список вывода>); writeln(f, <список вывода>).
Закрытие файла осуществляется командой close(f).
условно файл можно представить в виде ленты, у которой есть начало, а конец не фиксируется. Компоненты файла записываются на эту ленту последовательно, друг за другом:
Здесь т.м. - текущий маркер, указывающий на рабочую позицию (окно) файла; м.к. (маркер конца файла) - специальный код, автоматически формируемый вслед за последним элементом файла.
Такого рода файлы называются файлами последовательного доступа. В исходной версии Паскаля файлов прямого доступа, для которых можно непосредственно «достать» любую компоненту, не предусмотрено; однако, в Турбо-Паскале элементы прямого доступа есть (например, через функцию seek, см. ниже).
Команда rewrite(f) - открыть файл для записи - устанавливает файл в начальное состояние режима записи; текущий маркер устанавливается на маркер конца файла. Если в файле f до этого была информация, то она уничтожается.
В открытом для чтения командой reset(f) файле текущий маркер устанавливается на нулевое состояние, однако содержимое файла не утрачивается.
Команда закрытия файла close (Q обязательна, поскольку эта команда формирует маркер конца файла, что в большинстве случаев является необходимым нaпpимep, для работы с функцией eof(f), см ниже).
В системе Турбо- Паскаль предусмотрены встроенные функции по работе с файлами:
filesize(f) - текущее количество компонент открытого файла;
filepos(f) -номер текущей позиции маркера;
геnamе (f,имя) - переименование файла, связанного с f;
erase(f) -уничтожение файла;
execute(f) - выполнение СОМ-файла;
chain(f) -выполнение CHN-файла;
seek(f,N) - устанавливает маркер на позицию N;
eof(f) - возвращает TRUE, если найден конец файла;
ealn(f) - возвращает TRUE, если найден конец строки.
На практике широко используются текстовые файлы, которые состоят из литерных (логических) строк. Поэтому в языке Паскаль предусмотрен стандартный файловый тип TEXT (он не является file of char, скорее всего, это - file of string[n]). Логические строки бывают разной длины, в том числе и нулевой. В конец каждой строки помещается специальный символ «конец строки» (eoln - «end of line»). В качестве печатного символа конца строки используют литеру #. Текстовый файл (text) является строго последовательным, к нему не применимы некоторые встроенные функции, в частности, seek. В отличие от типизированных файлов, с текстовым файлом нельзя одновременно проводить операции чтения (read) и записи (write). Однако, допустимы операторы writein и readln. Числовые данные, целые и вещественные, в текстовом файле должны записываться через пробел.
Ниже приведены несколько примеров, иллюстрирующих работу с файлами. Пример 1. Вывод данных на печатающее устройство - принтер (1st:).
Программа 23
program print;
var
fal :text; x :real; name :string[25];
begin
assign (fal, ' 1st:'); rewrite (fal); x:2.5; name:"'Слава';
writeln(fal,x:8:2) ;
writeln(fal,'Привет, '.name); close(fal) :
end. (Здесь файловая переменная fal связывается с принтером 1st:, и запись в файл fal практически означает вывод на печать)
Пример 2. Создание и сохранение в файле «xxx.dat» последовательности целых чисел от 10 до 20.
Программа 24
program zapis;
var
f: file of integer; i: integer;
begin
assign(f,'xxx.dat'); rewrite(f);
for i:=10 to 20 do write(f,i); close (f);
end. ( После выполнения программы формируется внешний файл xxx.dat)
Пример 3.
Считывание первых пяти компонент из существующего файла «xxx.dat» и вывод на дисплей квадратов этих значений.
Программа 25
program read;
var ff: file of integer; j,i : integer;
begin
assign(ff,'xxx.dat'); reset(ff) ;
for j:=l to 5 do begin read(ff.i); writeln(i*i);
end;
close(ff);
end.
Пример 4. В текстовом файле (text) «slov.txt» содержится русский текст. Определить сколько гласных букв в тексте.
Программа 26
program text;
var
ft : text; n : integer; ch : char; st : set of chart begin
assign (ft,'slov.txt'); reset(ft);
st := ['A'.'E','И','О','У,'Ы','Э','Ю','Я'];
st := st+['a','e','и','о','у','ы','э','ю','я'];
n: =0;
while not eof(ft) do begin
read(ft, ch); if ch in st then n:=n+l;
end;
close(ft);
writeln; write('кол-во гласных букв =',n);
end.
Поскольку длина текста (файла) неизвестна, то в цикле «пока» используется логическая функция eof(f), которая возвращает значение TRUE, если найден конец файла.
Пример 5.
Шифрование и дешифрование текста.
Программа шифрования заданного текста (sekret) использует следующее правило шифровки: каждая буква в тексте заменяется на букву, расположенную на n позиций вправо от искомой в русском алфавите. Причем последним символом алфавита является пробел '', а далее алфавит продолжается циклически.
Значение смещения n находится во внешнем файле 'n.key', который формируется программой key. Зашифрованный текст выводится во внешний файл с именем «шифр.eхe» , а также на дисплей.
Программа дешифровки (retsek) считывает шифрованный текст из файла «шифр.tхt» и выводит на экран дисплея искомый текст.
Программа 27 (а)
program key;
var
n : integer; f : file of integer;
begin , .
assign (f,'n.key'); rewrite(f); write\('Bвeди ключ(смещение): ');
readln(n);
write(f,n); close(f);
end.
Программа 27 (б)
program sekret;
var
| slovo,anslovo: string[100];
alfavit : string[33];
n, i, k, p : integer;
fkl : file of integer;
fs : text;
begin
alfavit:='абвгдежзийклмнопрстуфхцчшщъыьэюя ';
assign(fkl,'n.key'); reset(fkl); read(fkl,n); close(fkl);
writeln; write('введи
текст: ');
readln(slovo); anslovo:='';
for k:=l to length(slovo) do begin for i:=l to 33 do
if slovo[k]=alfavit[i] then begin p:=i+n;
if p >33 then p:=p mod 33;
anslovo:=anslovo+alfavit[p];
end;
end;
assign(fs,'шифр.txt'); rewrite(fs); write(fs,anslovo);close(fs);
writeln; write(ansiovo) ;
end.
Программа 27 (в)
program retsek;
var slovo, anslovo : string[100];
alfavit : string[33];
n, i, k, p : integer;
fi : file of integer;
f : text;
begin alfavit:='абвгдежзийклмнопрстуфхцчшщъыьэюя ';
assign(fi,'n.key'); reset(fi); read(fi.n); close(fi);
assign(f,'шифр.txt'); reset(f); read(f,anslovo); close(f)
slovo:='' ;
for k:=l to length(anslovo) do
begin for i:=l to 33 do
if anslovo[k]=alfavit[i] then
begin p:=i-n; if p < 1 then p:=33-p mod 33;
slovo:=slovo+alfavit[p];
end;
end;
writeln; write('TeKCT шифровки: ',slovo);
end.
Контрольные вопросы и задания
1. Какие проблемы решаются при использовании файлов?
2. Какие операции и функции используются при работе с файлами?
3. Найдите площадь выпуклого четырехугольника со сторонами х, у, z, t и одной
из диагоналей d.
4. Заданы три комплексных числа. Найдите их сумму,
5. Имеется внешний файл записей «lab.zap», содержащий сведения об ученика.' школы. Файл формируется приведенной ниже программой.
Составьте программу, в которой необходимо сделать следующее:
а) упорядочить файл по признаку «class» в порядке возрастания;
б) упорядочить файл по признаку «god» в порядке убывания;
в) упорядочить файл в алфавитном порядке.
program lab;
type shcoo 1= record
fiо : string[20], class : 1 .. 11; god : integer; pol: char;
end;
var x:array[1..100] ofshcool; n,i:integer; f:file of school;
begin
write ('введите кол-во учеников:'); readln(n); assign(f,'lab.zap'); rewnte(f);
for i:=l to n do with x[i] do
begin \write('введи Ф.И.О.',1,'-ого ученика:'); readln(fio);
write('клacc:'); readln(class);
write('гoд рождения:-'); readln(god); write('пол(M/Ж):-');
readln(pol); write(f,x[i])…;
end; close(f);
end.
6. Задание рассчитано на двух студентов, использующих «электронную почту» на одном компьютере. Первый студент составляет программу, в которой формирует внешний файл «письмо». Второй студент должен «прочитать» файл и сформировать «ответ».
ПИСЬМО ОТВЕТ
а) последовательность целых чисел до 100 | квадраты этих чисел;
б) простые числа в интервале от 1 до 200 | сумма этих чисел