- •А.И. Газейкина Основы структурного программирования на языке Паскаль
- •Тема 1. Линейные программы 4
- •Некоторые стандартные функции языка Турбо Паскаль
- •Примеры решаемых задач
- •Контрольные задания
- •Тема 2. Разветвляющиеся программы Краткое изложение теоретического материала
- •Примеры решаемых задач
- •Контрольные задания
- •Тема 3. Циклические программы Краткое изложение теоретического материала
- •Примеры решаемых задач
- •Контрольные задания
- •Тема 4. Обработка данных строкового типа Краткое изложение теоретического материала
- •Примеры решаемых задач
- •Контрольные задания
- •Тема 5. Система типов языка Паскаль Краткое изложение теоретического материала
- •Тема 6. Перечисляемый тип Краткое изложение теоретического материала
- •Тема 7. Тип-диапазон Краткое изложение теоретического материала.
- •Тема 8. Множество (множественный тип) Краткое изложение теоретического материала
- •Примеры решаемых задач
- •Контрольные задания
- •Тема 9. Массивы в языке Паскаль Краткое изложение теоретического материала
- •Примеры решаемых задач
- •Контрольные задания
- •Тема 10. Графика в языке Паскаль Краткое изложение теоретического материала
- •Контрольные задания
- •Тема 11. Подпрограммы в языке Паскаль Краткое изложение теоретического материала
- •Процедуры в языке Турбо Паскаль
- •Функции в языке Турбо Паскаль
- •Примеры решаемых задач
- •Контрольные задания
- •Тема 12. Тип данных запись (Record) Краткое изложение теоретического материала
- •Примеры решаемых задач
- •Контрольные задания
- •Тема 13. Работа с файлами в языке Паскаль Краткое изложение теоретического материала
- •Текстовые файлы
- •Примеры решаемых задач
- •Типизированные файлы
- •Примеры решаемых задач
- •Контрольные задания
- •Тема 14. Динамические переменные в языке Паскаль Краткое изложение теоретического материала Статические и динамические переменные
- •Указатели
- •Типизированные указатели
- •Нетипизированные указатели
- •Динамические структуры данных
- •Примеры решаемых задач
- •Контрольные задания
- •Список литературы
Типизированные файлы
Записи типизированного (структурированного) файла имеют одинаковый тип (а значит, имеют одинаковый размер – именно поэтому к ним и возможен прямой доступ). Структуру типизированного файла представлена на Рис. 7.
Запись 0 |
| |
Запись 1 |
| |
Запись 2 |
| |
Запись 3 |
| |
Eof |
| |
Рис. 7. Структура типизированного файла
|
Записи файла пронумерованы. Нумерация начинается с нуля. В конце файла записан специальный неотображаемый символ Eof («End of file» - конец файла).
Для работы с типизированными файлами в языке Паскаль используются следующие команды, описания и функции:
Описание файловой переменной:
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 – целые числа }
Связывание файловой переменной с конкретным именем внешнего файла:
Assign ( f, <имя файла> );
где f – имя файловой переменной, <имя файла> - строковая константа или переменная. Например, выполнение команды Assign ( f, ’c:\tp70\data’ ) свяжет файловую переменную f с файлом «data», который расположен на диске C: в папке с именем «tp70». После записи такой команды в тексте программы нигде далее не будет указываться имя файла, с которым работает программа.
Открытие файла для записи данных:
Rewrite (f);
Файл создается заново. Если для записи открыт уже существующий файл, то все данные из него будут потеряны.
Открытие файла для чтения данных:
Reset (f);
Для чтения можно открыть только существующий файл. Указатель устанавливается на первую запись (т.е. на первый символ первой строки) файла.
Запись данных в файл:
Write ( f, <имя переменной> );
Тип переменной должен совпадать с типом записей файла.
Чтение данных из файла:
Read ( f, <имя переменной> );
Закрытие файла:
Close ( f );
Функция FileSize( f ) возвращает количество записей в файле.
Функция FilePos ( f ) возвращает номер текущей записи, т.е. той записи файла, на которую указывает указатель.
Команда 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 …
т.е. «пока не конец файла и товар не найден». Это означает, что просмотр файла будет выполняться либо до конца файла, либо до тех пор, пока в файле не будет найден новый товар.