Процедурный язык обработки файлов
Основные функции языка:
· перепись информациииз файла в ОЗУ и обратно,
· создание новых файлов,
· изменение названий существующих файлов,
· удаление файлов.
Для организации обработки файла (что особенно важно: для одновременной работы сразу с несколькими файлами) в языке Pascal, предусмотрен специальный класс информационных объектов – файловых переменных.
Опр. Файловая переменная – информационный объект размещенный в оперативной памяти и содержащий следуюшие данные о файле:
§ полное название файла на ВЗУ и его размер,
§ адрес начала файла на ВЗУ и адрес активной записи (позиции) файла,
§ описание структуры файла.
§ признак состояния файла (открыт, закрыт, режим чтения или записи).
Описание файловых переменных проводится с помощью стандартных операторов Var.
Примеры:
Type T1= array[1..50] of real; {описываем структуру записи файла, каждая
запись которого состоит из пятидесяти вещественных чисел типа REAL }
T2=record of {описываем структуру записи файла, в которой размещаются данные о ФИО и дате рождения неких лиц. Размер каждой записи 96 байт}
Fam, Im, Ot: string[30];
God, Mes, Den: integer;
End;
. . . . . . .
Var Fa, Fb: file of T1; {файловые переменные с именами Fa, Fb будут обслуживать
типизированные файлы с записями типа T1}
P: file of T2; {файловая переменная с именем P будет обслуживать
типизированные файлы с записями типа T2}
TF1, TF2, TF3: text; {файловые переменные с именами TF1, TF2, TF3 будут
обслуживать текстовые файлы с записями типа string}
FF, FL: file; {файловые переменные с именами FF, FL планируется
использовать для обслуживания не типизированных файлов }
{создаем в оперативной памяти рабочие переменные (информационные объекты) для размещения информации одной записи для каждого типа используемых файлов}
R: T1; { R - для файлов с типом записи T1}
Rp: T2; { Rp - для файлов с типом записи T2 }
S: string; { S - для текстовых файлов}
. . . . . . .
Для начала работы с любым файлом надо связать соответствующую структуре файла файловую переменную с конкретным физическим файлом. Эта команда дается процедурой
Assign (FileVar , FileName);
где FileVar – имя файловой переменной,
FileName – имя файла (параметр типа string).
Примеры:
Assign (Fa,’A:\Dann.kk’); {Семантика: Файловая переменная Fa назначается для
обслуживания файла с именем Dann.kk, который находится на диске А}
Assign (P,’Infor23’);
Assign (TF2,’Referat.txt’);
Assign (FF,’G:\Referat.doc’);
После привязки файловой переменной к конкретному физическому файлу, этот файл нужно перевести в состояние планируемого информационного обмена:
· открыть только для чтения, команда Reset(FileVar);
· открыть только для записи, команда Rewrite(FileVar);
· открыть для записи и чтения, команда Append(FileVar);.
Команда «прочесть очередную запись из файл» реализуется процедурой Read(FileVar , RabName); , где RabName – рабочая переменная (фрагмент оперативной памяти) соответствующая типу записей файла FileVar.
Команда «поместить очередную запись в файл» реализуется процедурой Write(FileVar , RabName); , где RabName – рабочая переменная соответствующая типу записей файла FileVar.
Команда Close(FileVar);закрывает доступ к файлу.
15.2.Программа “ Жизненный путь файла “
(Создание файла, запись в файл, чтение из файла, уничтожение файла)
Program JPF;
Type TF = array [1..3] of real;
Var FL : file of TF;
AR: TF;
i, j: integer;
Begin
{создание файла}
ASSIAN(FL, ‘A:\F3.RR‘);
REWRITE (FL);
for j :=1 to 4 do
Begin
for i:=1 to 3 do AR [i]:=i + j*100;
WRITE(FL ,AR);
end;
CLOSE(FL);
{чтение информации из файла}
RESET (FL);
for j :=1 to 2 do
Begin
READ(FL, AR);
for j :=1 to 3 do WRITE (AR[i]:10:3);
WRATELN;
end;
CLOSE(FL);
{уничтожение файла}
ERASE(FL);
End.
Семантика →звуковая транскрипция
и прагматика {пояснение смысла и цели} операторов этой программы.
Program JPF ;→ Начни чтение и трансляцию команд (операторов)
программы с именем JPF .
{ текст программы должен быть размещен в файле с именем JPF.pas }
Type TF= array [1..3] of real ;→ Запомни под именем TF структуру информационных объектов (ИО), которые состоят из трех, последовательно расположенных, чисел стандартного типа Real .
{ переменные типа TF образуют отдельные записи файла}
Var FL : file of TF ; → Размести в оперативной памяти ИО с именем FL. Тип этого ИО – файловая переменная, предназначенная для обслуживание файлов с записями структуры TF.
AR : TF ; → Размести в оперативной памяти ИО с именем AR, структура этого ИО описана ранее под именем TF .
{В эту область памяти (переменную с именем AR) планируется копировать
(читать) информацию из файла. Информация из AR будет также копироваться
(записываться) в файл, т.е. на ВЗУ(Внешнее Запоминающее Устройство)}
i , j : integer ; → Размести в оперативной памяти два ИО (носителя цело-
численной информации) с именами i и j.
{ i и j – рабочие (вспомогательные) переменные программы
для организации циклических вычислений }
Begin → Начни чтение “исполнимых“ операторов программы.
ASSIGN ( FL , ‘A : \ F3 . RR‘ ) ;→ Внеси в файловую переменную FL имя
конкретного файла (в нашем случае это имя: A : \ F3 . RR).
{ файл планируется создать на флоппи-диске A :\ , собственное имя файла F3.RR }
REWRITE (FL) ; → Создай новый (пустой) файл, параметры которого указаны (ранее записаны) в файловой переменной FL.
{если файл с именем F3 . RR уже существует на диске A : \ , то его
содержимое будет уничтожено, т.е. “стерто с дискеты“ }
For j : =1 to 4 do → Повторяй выполнение всех операторов, размещённых ниже, в операторных скобках begin … end, последовательно наращивая на 1 содержимое переменной j начиная от 1 и до 4 .
{ j – счетчик количества записей (номер очередной записи) заносимых в FL}
Begin →Открой операторную скобку.
For i: =1 to 3 do→ Повторяй выполнение, следующего за словом-разделителем DO, оператора присвоения, последовательно наращивая на 1 содержимое переменной i начиная от 1 и до 3 .
{ организуем перебор всех трех элементов массиваAR ,
содержимое которого планируется записать в файл }
AR[i] : = i + j*100 ; → Выполни арифметические операции над числовыми переменными, указанными в правой части оператора, и внеси результат в i–ый элемент массива AR .
{ заполняем массивAR (фрагмент ОЗУ) " некой полезной информацией "}
WRITE(FL , AR) ; → Перепиши информацию из фрагмента ОЗУ с
именем AR в файл FL.
{Записать (скопировать) информацию из массиваAR в очередную запись файла, описанного в файловой переменной FL}
End; → Закрой операторную скобку.
CLOSE ( FL ) ; → Закрой доступ к файлу, описанному в переменной FL.
{теперь в файл с именем «A:\F3.RR» нельзя: ни читать, ни писать}.
{ в созданный файл F3 . RR внесены четыре записи, каждая из которых содержит по три числа. Информация файла может интерпретирована как таблица чисел: }
← 1-ая запись файла | |||
←2-ая запись файла | |||
←3-ая запись файла | |||
←4-ая запись файла |
RESET(FL) ;→ Открой доступ к файлу FL для чтения информации.
{имя и параметры файла ранее внесены в файловую переменную FL}
For j : =1 to 4 do → Повторяй выполнение всех операторов, приводимых в ниже следующих операторных скобках begin … end, последовательно наращивая содержимое переменной j от 1 до 4 .
{организуем цикл чтения всех четырех записей файла}
Begin →Открой операторную скобку.
READ(FL, AR); → Прочти запись из файла FL в память по адресу AR.
{содержимое очередной записи файла будет скопировано в массив AR}
For i: =1 to 3 do → Повторяй выполнение нижеследующего оператора печати последовательно наращивая содержимое переменной i от 1 до 3.
{Цикл печати всех трех элементов массива будет выполнена в одной строке экрана}
WRITE(AR[i]: 10: 3) ; → Напечатай на экране монитора содержимое переменной AR[i] как число в формате F. Курсор экрана оставь в позиции за последней отпечатанной цифрой.
{формат F:10:3 означает размещение действительного числа в 10-и позициях, три из которых отводятся под запись дробной части}
WRITELN ; →Напечатай на экране «ничего...», но обязательно перемести
курсор экрана в следующую строку.
{Эта команда позволяет распечатать записи файла строго: одна под
другой, т.е. вывести содержимое файла в форме таблицы}
End; → Закрой операторную скобку.
CLOSE (FL) ;→ Закрой доступ к файлу FL для чтения и записи.
{теперь описанный в файловой переменной FL файл можно
переименовывать или удалять}
ERASE (FL) ; →Уничтожь файл FL.
{На дискете будет вытерта (удалена) только информация о названии файла, но
само содержимое файла, т.е. соответствующие магнитные записи останутся}
End. → Заверши чтение блока " исполнимых " операторов программы и всей программы.
Результат работы программы – печать на экране монитора таблицы:
101.000 102.000 103.000
201.000 202.000 203.000
301.000 302.000 303.000
401.000 402.000 403.000
Текстовые файлы
Структурная организация текстового файла имитирует размещение привычной текстовой информации на бумажном носителе:
· сам файл – аналог листа бумаги (лист неограниченной длины),
· каждая запись файла – отдельная строка на листе,
· запись состоит из последовательности символов (символ – байт),
· размер (длина) каждой строки – произвольна и может включать от 0 до 255 символов, запись без символов – аналог пустой строки,
· все записи пронумерованы: сверху вниз (от первой и до последней),
· строка состоит из последовательности символов, которые номеруются слева направо.
Информация в текстовом виде передается посредством упорядоченной последовательности слов (в частности – чисел), которые разделяются специальными символами – разделителями (чаще всего – пробелами).
Текстовые файлы допускают только последовательный доступ к своему содержимому. Файлы этого типа могут быть открыты либо только для чтения, либо только для записи, причем записи читаются и записываются строго по порядку: от первой к последней.
Битовое содержимое записи текстового файла соответствует структуре переменных типа STRING. Однако информация из текстового файла может быть прочитана и в переменные любого скалярного типа: Real, Integer, Word, Boolean и т.д., но только в том случае - если она представлена соответствующими символами.
Процесс записи информации в текстовый файл аналогичен ранее рассмотренной операции вывода информации (печати) на экран монитора, т.е. допускает использование форматов.
Освоение текстовых файлов не должно вызывать особых трудностей, т.к. мы уже имеем должный опыт работы с файлами этого типа:
· периферийное устройство клавиатура - постоянно открытый для чтения текстовый файл, обслуживаемый стандартной файловой переменной с именем KBD. Если в универсальных операторах чтения Read и ReadLN вообще не указывать файловую переменную, то чтение данных будет осуществляться именно с клавиатуры,
· периферийное устройство алфавитно-цифровой экран – постоянно открытый для записи текстовый файл, обслуживаемый стандартной файловой переменной с именем SCR. Если в универсальных операторах записи Write и WriteLN вообще не указывать файловую переменную, то запись данных будет осуществляться только на экран,
· консольный ввод информации задействует оба этих стандартных файла,
· тексты набираемых Вами программ (с помощью встроенного редактора turbo.exe) размещаются в типичных текстовых файлах, но со специальным расширением имени PAS, а не TXT.
Пример работы с текстовым файлом:
Program NNN;
Var F: text; S: string; i: integer; R: real; b: Boolean;
BEGIN
Assign(F,’Dann.pas’); ReWrite(F); {связать файловую переменную с файлом под
именем ’Dann.pas’ и открыть файл для записи}
Writeln(F,’Отладочные данные ’); {первая запись в файл содержит информацию,
смысл которой предназначен для человека }
Writeln(13 567.4011 true’); {вторая запись в файл, содержит символы,
которые можно трактовать как значения
переменных стандартных для языка Pascal типов }
I:=55; R:=444.777; b:=false;
Writeln(F,’ i:6, R:10:2,’ ‘,b); {образец записи форматированной информации
в текстовый файл }
Reset(F); {переключение файла в режим чтения}
Readln(F, S); WriteLn(S); {читаем первую запись файла и выводим ее на экран}
Read(F, I, R, b); Writeln(I:5, R:7:1, b); {читаем форматированную информацию
из текстового файла в соответствующие переменные
и тут же печатаем их на экране }
Read(F, I, R, b); Writeln(I, R:7:1, b);
Close(F) {закрываем доступ к файлу}
END.
Результат работы: в текстовом файле с именем Dann.pas будут размещены три записи (содержимое файла можно просмотреть с помощью любого текстового редактора):
Отладочные данные
13 567.4011 true
55 444.78false
На экран монитора будет выведено:
Отладочные данные
13 567.4true
55 444.8false
Дата добавления: 2021-12-14; просмотров: 353;