Информатика -продвинутый курс

       

РАБОТА С ФАЙЛАМИ


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

Файлы позволяют решить две проблемы:

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            | сумма этих чисел


Содержание раздела