Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка Паскаль.doc
Скачиваний:
127
Добавлен:
30.04.2015
Размер:
661.5 Кб
Скачать

Типизированные файлы

Записи типизированного (структурированного) файла имеют одинаковый тип (а значит, имеют одинаковый размер – именно поэтому к ним и возможен прямой доступ). Структуру типизированного файла представлена на Рис. 7.

Запись 0

Запись 1

Запись 2

Запись 3

Eof

Рис. 7. Структура типизированного файла

Записи файла пронумерованы. Нумерация начинается с нуля. В конце файла записан специальный неотображаемый символ Eof («End of file» - конец файла).

Для работы с типизированными файлами в языке Паскаль используются следующие команды, описания и функции:

  1. Описание файловой переменной:

Var f : File Of <тип записи файла>;

где f – имя файловой переменной.

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

Записи файла могут иметь любой из рассмотренных выше типов (как стандартный, так и сконструированный в блоке Type).

Например:

Type Stud = Record

Name : String;

Group : Integer;

Rating : Real

End;

Var f1 : File of Stud; { записями файла f1 являются записи (Record) из трех полей }

f2 : File Of Integer; { записи файла f2 – целые числа }

  1. Связывание файловой переменной с конкретным именем внешнего файла:

Assign ( f, <имя файла> );

где f – имя файловой переменной, <имя файла> - строковая константа или переменная. Например, выполнение команды Assign ( f, ’c:\tp70\data’ ) свяжет файловую переменную f с файлом «data», который расположен на диске C: в папке с именем «tp70». После записи такой команды в тексте программы нигде далее не будет указываться имя файла, с которым работает программа.

  1. Открытие файла для записи данных:

Rewrite (f);

Файл создается заново. Если для записи открыт уже существующий файл, то все данные из него будут потеряны.

  1. Открытие файла для чтения данных:

Reset (f);

Для чтения можно открыть только существующий файл. Указатель устанавливается на первую запись (т.е. на первый символ первой строки) файла.

  1. Запись данных в файл:

Write ( f, <имя переменной> );

Тип переменной должен совпадать с типом записей файла.

  1. Чтение данных из файла:

Read ( f, <имя переменной> );

  1. Закрытие файла:

Close ( f );

  1. Функция FileSize( f ) возвращает количество записей в файле.

  2. Функция FilePos ( f ) возвращает номер текущей записи, т.е. той записи файла, на которую указывает указатель.

  3. Команда Seek ( f , n ) устанавливает указатель на запись файла с номером n. Например, команда Seek ( f , FileSize( f ) ) установит указатель после последней записи файла. Это позволяет, в частности, дописывать данные в конец типизированного файла.

Примеры решаемых задач

Пример 1. Составить программу, которая:

а) запишет в файл Price список товаров (название и цена);

б) обработает файл Price следующим образом:

- выведет на экран прайс-лист;

- изменит цену товара с заданным наименованием;

- допишет в файл данные о новом товаре (предварительно проверив, что в файле информации о таком товаре нет).

Программы:

Program A;

Uses Crt;

Type tovar = Record

name : String;

price : Real

End;

Var t : tovar; { переменная t для хранения информации об очередном товаре }

f : File Of tovar; { f – файловая переменная }

k, n : Integer;

Begin

Clrscr;

Assign (f, ’Price’); { связывание файловой переменной f с файлом ‘Price’, который будет создан в текущей папке }

Rewrite(f); { открыли файл для записи }

Write (‘Введите количество товаров в списке ‘);

Readln (n);

For k:=1 To n Do

Begin

Write (‘Введите наименование ’,k,’-го товара ’);

Readln (t.name); { запросили значение первого поля записи }

Write (‘Введите цену товара ’);

Readln (t.price); { запросили значение второго поля записи }

Writeln (f, t) { записали в файл запись t }

End;

Close (f); { закрыли файл }

Writeln (‘Файл создан’); { вывели на экран поясняющее сообщение}

Readln

End.

Program B;

Uses Crt;

Type tovar = Record

name : String;

price : Real

End;

Var t : tovar; { переменная t для хранения информации об очередном товаре }

f : File Of tovar; { f – файловая переменная }

k, n : Integer;

nt : String;

new_price : Real;

new_t : tovar;

Begin

Clrscr;

Assign (f, ’Price’); { связывание файловой переменной f с файлом ‘Price’, который будет создан в текущей папке }

{ вывод на экран содержимого файла }

Reset (f); { открыли файл }

Writeln (‘Прайс – лист: ‘);

While Not Eof (f) Do { пока не достигнут конец файла }

Begin

Readln (f, t); { прочитали из файла очередную запись в переменную t }

Writeln (t.name:20, t.price:10:2) { вывели на экран значения полей записи – наименование и цену товара }

End;

Close (f); { закрыли файл }

{ изменение цены отдельного товара }

Reset (f); { открыли файл }

Write (‘Введите наименование товара, у которого меняется цена ‘);

Readln (name_t);

Write (‘Введите новую цену ‘);

Readln (new_p);

While Not Eof (f) Do { пока не достигнут конец файла }

Begin

Readln (f, t); { прочитали из файла очередную запись в переменную t }

If t.name = nt { если прочитанное из файла наименование товара совпадает с тем, у которого меняется цена, то}

Then Begin

t.price := new_price; { меняем цену товара в записи t }

Seek (f, FilePos (f) -1); { устанавливаем указатель обратно на ту запись в файле, у которой изменили цену}

Write (f, t) { записываем переменную t с измененным значением поля price в файл }

End

End;

Close (f); { закрыли файл }

{ дописывание в конец файла информации о новом товаре }

Write (‘Введите наименование нового товара ‘);

Readln (new_t.name);

Write (‘Введите цену ‘);

Readln (new_t.price);

Reset (f); { открыли файл }

{ проверим, есть ли данные о таком товаре в файле }

flag := false; { сначала считаем, что такого товара в файле нет }

While Not Eof (f) Do { пока не достигнут конец файла }

Begin

Readln (f, t); { прочитали из файла очередную запись в переменную t }

If t.name = new_t.name { если прочитанное из файла наименование товара совпадает с тем, который хотим дописать в файл}

Then Flag := True { запоминаем, что данные о таком товаре есть в файле}

End;

If Not flag { если данных о новом товаре в файле не найдено (т.е. значение переменной flag осталось равным false) }

Then Begin

Seek (f, FileSize (f) ); { устанавили указатель в конец файла }

Write (f, new_t) { записали в файл данные о новом товаре}

End;

Close (f); { закрыли файл }

Writeln (‘Новые данные дописаны в файл’);

Readln

End.

Примечание. При проверке, есть ли в файле данные о новом товаре или нет, правильнее заголовок цикла While записать в виде:

While (Not Eof (f)) And (Not Flag)Do …

т.е. «пока не конец файла и товар не найден». Это означает, что просмотр файла будет выполняться либо до конца файла, либо до тех пор, пока в файле не будет найден новый товар.