Классификация: нестандартный, структурированный (сложный) тип. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Классификация: нестандартный, структурированный (сложный) тип.



Тип файл

Классификация: нестандартный, структурированный (сложный) тип.

Имя определяет программист.

Структурная организация

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

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

При определении переменной типа файл мы определяем две структуры - структуру на внешнем устройстве и структуру в оперативной памяти (рис. 24.1)

Структура на внешнем устройстве представляет собой последовательность однотипных компонентов, ограниченную признаком конец файла. Для связи переменной типа файл с конкретным внешним устройством задаются специальные команды.

Структура в оперативной памяти - буфер или окно файла, размером в один компонент файла. Все общение с файлом, расположенном на внешнем устройстве, осуществляется через буфер файла, который находится в оперативной памяти.

Рис. 24.1. – Структурная организация данных типа файл

Определение типа

Для того, чтобы определить тип файл необходимо определить тип элементов, которые могут входить в файл. Количество компонентов не определяется. Типом компонентов может быть любой, кроме файлового, тип. Непосредственное определение типа файл приведено на рис. 24.2.

Рис. 24.2. – Определение типа файл

Как всегда, это определение делается в разделе нестандартных типов. Однако язык позволяет не определять тип компонента файла. В этом случае в качестве типа данных указывается тип FILE (такой файловый тип называется нетипизированным). Для нетипизированного файла нельзя выполнять стандартные операции по чтению и записи.

Примеры определения файловых типов и файлов:

TYPE

tf1=file of integer;

tf2=file of real;

VAR

f1:tf1;

f2:tf2;

f3:FILE;

В этих примерах f1 – файл из целых чисел, f2 – файл из вещественных чисел, f3 - нетипизированный файл. С файлом f3 нельзя выполнять стандартные операции по чтению и записи.

Множество значений

Включает в себя все значения, которые могут быть размещены в структуре, заданной определением типа.

Множество операций

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

Виды файлов

Различают три вида файлов:

- последовательные;

- прямого доступа;

- текстовые или символьные.

Эти виды определяют способы организации работы с файлами.

Разбиение на виды находится в непосредственной зависимости от технических возможностей устройств, на которых размещаются файлы. Так на экране дисплея может размещаться только текстовый файл, файл такого же типа размещается на клавиатуре ПЭВМ. На магнитофоне может размещаться только последовательный файл. На магнитном диске может размещаться файл любого вида, но наибольший интерес здесь представляют файлы прямого доступа, так как механизм перемещения головок дисковода над поверхностью диска обеспечивает доступ к любому компоненту файла, в противоположность механизму магнитофона, который требует прокрутить ленту (просмотреть все предыдущие компоненты), чтобы выбрать необходимый элемент.

Алгоритм сортировки файла прямого доступа

Сортировка файла методом пузырька (обменная сортировка)

Спецификация подпрограммы

  1. Назначение: сортировка файла прямого доступа из целых чисел по убыванию (файл обязательно существует; количество компонентов в файле произвольное).Файловый тип определяется ранее подпрограммы следующим образом type tf=file of integer;
  2. Имя: sortfilepuz
  3. Вид: процедура
  4. Перечень параметров:

Таблица 24.1. Перечень параметров

Статус Назначение Имя Тип Вид
Вход имя физического файла name string параметр-значение
  1. Заголовок подпрограммы: procedure sortpuz(name:string);

Метод решения

Так как в файле прямого доступа все существующие компоненты пронумерованы (то есть проиндексированы), то для сортировки файла прямого доступа можно использовать любой метод сортировки массива. Используем обменную сортировку с флагом, известную под названием метод "пузырька". При этом для сокращения количества переборов будем просматривать только неупорядоченную часть.

1. Связываем логический и физический файлы

assign(f,name);

2. Открываем для работы файл прямого доступа в режиме работы с существующим файлом

reset(f);

3. Определяем размер не отсортированной части файла (перед началом сортировки это все существующие компоненты файла)

nkz:=filesize(f);

4. Повторяем просмотр не отсортированной части элементов до выполнения условия до выполнения условия – при очередном переборе элементов перестановки не было (признак отсутствия перестановки – флаг flag при отсутствии перестановки имеет значение ложь, а при наличии – значение истина)

повторять

<просмотр не отсортированной части файла>

до

При просмотре не отсортированной части выполняются следующие действия:

а) признаку перестановки при начале очередного перебора присваивается значение ложь (нет перестановки)

flag:=false;

b) перебираются все элементы не отсортированной части c начального по предпоследний. Начальный элемент имеет порядковый номер 0; предпоследний элемент – nkz-2 (минус два, т.к. нумерация не с единицы, а с нуля)

Для каждого номера элемента i выполняются следующие действия

b.1) буфер файла связывается с текущим элементом

seek(f,i);

b.2) читаются текущий и следующий элементы файла

read(f,r1,r2).

Компилятор, обрабатывая такое обращение к процедуре чтения из файла, преобразует его в эквивалентный составной оператор

begin

read(f,r1);

read(f,r2)

end;

b.3) при сортировки по убыванию, если следующий элемент больше текущего (при сортировки по возрастанию, если меньше), то буфер файла связывается с текущим компонентом; записывается в файл следующее значение, а затем текущее; формируется признак наличия перестановки (флагу перестановки присваивается истина)

Компилятор, обрабатывая обращение к процедуре записи в файл, преобразует его в эквивалентный составной оператор

begin

write(f,r2);

write(f,r1)

end;

c) так как в правую часть файла переместился отсортированный элемент, то размер не отсортированной части уменьшается на единицу

nkz:=nkz-1;

5. Закрываем файл для работы

close(f).

Информационная модель

Таблица 24.2. Информационная модель

Назначение Имя Тип
Имя логического файла f tf
Номер очередного компонента файла i longint
Размер неотсортированной части файла nkz longint
Значение очередного компонента файла r1 integer
Значение следующего компонента файла r2 integer
Признак наличия перестановки flag boolean

Программная модель

 

type tf=file of integer;

 

procedure sortpuz(name:string);

var f:tf;

i,nkz:longint;

r1,r2:integer;

flag:boolean;

 

begin

assign(f,name);

reset(f);

nkz:=filesize(f);

repeat

flag:=false;

for i:=0 to nkz-2 do

begin

seek(f,i);

read(f,r1,r2);

if r2>r1 then

begin

seek(f,i);

write(f,r2,r1);

flag:=true

end

end;

nkz:=nkz-1

until not flag;

close(f);

end;

Спецификация

1. Назначение: проверка существования физического файла вне зависимости от его вида

2. Имя: FS

3. Вид: процедура

4. Перечень параметров:

Таблица 24.3. Перечень параметров

Статус Назначение Имя Тип Вид
Вход имя физического файла name string параметр-значение
Возвращ. признак существования файла (true –файл существует, false – нет) fs Boolean -
  1. Заголовок подпрограммы: function fs(name:string):Boolean;

Метод решения

В основу метода решения положено условие выполнения процедуры открытия существующего файла для работы reset(<илф>). Если физический файл соответствующий заданному логическому существует, то файл открывается для работы, если отсутствует, то возникает ошибка ввода-вывода. Поэтому метод решения следующий:

1) связываем физический и логический файлы assign(f, name), где f – имя логического нетипизированного файла. Нетипизированный файл позволяет сделать подпрограмму независимой от вида файла (но с таким файлом нельзя выполнять стандартные операции чтения и записи);

2) отключаем систему прерываний по ошибкам ввода-вывода {$I-};

3) выполняем вызов процедуры reset(f);

4) включаем систему прерываний по ошибкам ввода-вывода {$I+};

5) анализируем наличие ошибки при выполнении последней операции ввода-вывода. Это может быть только одна ошибка – перед выполнением процедуры reset физический файл, соответствующий логическому отсутствует. Если ошибка есть, то формируем результат функции false. Если ошибки нет, то формируем результат функции true и демонополизируем файл

Информационная модель

Таблица 24.4. Информационная модель

Назначение Имя Тип
Имя логического файла f file

Текст подпрограммы

function fs(name:string):boolean;

var f:file;

begin

assign(f,name);

{$I-}

reset(f);

{$I+}

if ioresult<>0 then

fs:=false

else

begin

fs:=true;

close(f)

end

end;

Постановка задачи

Создать файл прямого доступа с информацией об учащихся. Имя создаваемого физического файла определяет пользователь. Компоненты файла представляют собой записи типа tinfstud.

Метод решения

1) получить от пользователя имя физического файла (namebd) для хранения базы данных;

2) если файл с таким именем существует, то сообщить об этом пользователю и прекратить выполнение программы

3) связать логический и физический файлы assign(fbd,namebd);

4) открыть файл прямого доступа в режиме создания нового файла
rewrite(fbd);

5) повторять до ответа пользователя не продолжать создание файла:

a) ввод информации об очередном студенте (ввод записи r);

b) запись информации в файл write(fbd,r);

c) получение ответа на запрос – продолжать создание базы данных?[Y/N]

6) закрыть файл для работы close(fbd).

Предложенный метод можно использовать и для создания последовательных файлов, так как никаких особенностей файлов прямого доступа не используется.

Информационная модель

Таблица 24.5. Информационная модель

Статус Назначение Имя Тип
Вход имя физического файла с БД namebd string
Пром имя логического файла с БД fbd tfileinfstud
Пром информация об очередном учащемся r tinfstud
Вход ответ на запрос(Y – продолжать, N – нет) otvet char

Программная модель

{программа создания базы данных (файл Z1.pas)}

program z1;

{$I FILE0.PAS}

var otvet:char;

begin

writeln('Введите имя создаваемого файла с базой данных');

readln(namebd);

if fs(namebd) then

begin

writeln('ОШИБКА!!! Файл с именем ',namebd,' уже существует');

halt

end;

assign(fbd,namebd);

rewrite(fbd);

repeat

writeln('Введите информацию об очередном студенте?');

with r do

begin

writeln('Фамилия?');

readln(fam);

writeln('День, месяц, год рождения, год поступления, средний балл ',

'для студента ',fam);

readln(dr.d, dr.m, dr.g, gp, sb);

write(fbd,r)

end;

writeln('Продолжать?[y/n/]');

readln(otvet)

until (upcase(otvet)='N') or (otvet='т') or (otvet='Т');

close(fbd)

end.

Постановка задачи

Просмотр на экране содержимого файла типа tfileinfstud. Имя физического файла для просмотра задает пользователь.

Метод решения

При выводе информации на экран будем использовать алгоритм вывода большого количества значений.

1) получить от пользователя имя физического файла, который будем просматривать readln(namebd);

2) если физический файл с таким именем отсутствует, то сообщить об этом пользователю и прекратить выполнение программы

3) связать логический и физический файлы assign(fbd,namebd);

4) открыть файл в режиме работы с существующим файлом (в данном методе будем только последовательно читать информацию из файла) reset(fbd);

5) очистить экран clrscr;

6) вывести шапку таблицы
writeln('ФАМИЛИЯ ':20,' ДАТА РОЖД.',' ГП ',' БАЛЛ');

7) в счетчик заполненных строк экрана занести 1 k:= 1;

8) пока не достигли признака конца в файле fbd повторять (not eof(fbd) )

a) чтение очередного компонента файла read(fbd,r);

b) вывод на экран компонентов записи r с информацией об учащемся;

c) увеличение счетчика выведенных строк на 1 k:=k+ 1;

d)

9) закрыть файл для работы close(fbd).

Предложенный метод решения позволяет выводить на экран содержимое любого файла типа tfileinfstud. Причем файл может быть прямого доступа, так и последовательным, потому что в методе решения не используются ни какие особенности файлов прямого доступа.

Информационная модель

Таблица 24.6. Информационная модель

Статус Назначение Имя Тип
Вход имя физического файла с компонентами типа tinfstud namebd string
Пром имя логического файла fbd tfileinfstud
Пром информация об очередном учащемся r tinfstud
Вход счетчик заполненных строк экрана k integer

Программная модель

{программа просмотра файлов с компонентами типа tinfstud (файл z2.pas)}

program z2;

uses CRT;

{$I FILE0.PAS}

var k:integer;

begin

writeln('Введите имя просматриваемого файла ');

readln(namebd);

if not fs(namebd) then

begin

writeln('ОШИБКА!!! Файл с именем ',namebd,' не существует');

halt

end;

assign(fbd,namebd);

reset(fbd);

clrscr;

writeln('ФАМИЛИЯ ':20,' ДАТА РОЖД.',' ГП ',' БАЛЛ');

k:=1;

while not eof(fbd) do

begin

read(fbd,r);

with r do

begin

fam:=copy(fam+' ',1,20);

writeln(fam:20, dr.d:3,'.',dr.m:2,'.', dr.g:4, gp:5, sb:5:2)

k:=k+1;

if k=23 then

begin

writeln('Для продолжения нажмите Enter');

readln;

clrscr;

writeln('ФАМИЛИЯ ':20,' ДАТА РОЖД.',

' ГП ',' БАЛЛ');

k:=1;

end

end

end;

close(fbd);

writeln('Информация исчерпана!!!')

end.

Постановка задачи

Сортировка файла прямого доступа с информацией об учащихся. Фамилии упорядочиваются по алфавиту, если фамилии совпадают, то информация об однофамильцах упорядочивается по возрастанию дат рождения. Имя сортируемого физического файла определяет пользователь. Компоненты файла представляют собой записи типа tinfstud.

Метод решения

Так как файл прямого доступа в полной мере является аналогом массива, то для сортировки можно использовать любой метод сортировки массива. Выбираем метод сортировки выбором с перестановкой:

1) получить от пользователя имя физического файла, который будем сортировать readln(namebd);

2) если физический файл с таким именем отсутствует, то сообщить об этом пользователю и прекратить выполнение программы

3) связать логический и физический файлы assign(fbd,namebd);

4) формируем все компоненты файла с начального по предпоследний. В файлах прямого доступа начальный компонент имеет номер 0. Количество существующих компонентов файла прямого доступа определяется с помощью функции filesize(<илф>), так как нумерация с 0, то номер предпоследнего компонента файла на 2 меньше, чем количество компонентов
" i:=0..filesize(fbd)-2:

5) для каждого формируемого компонента i:

a) выбираем экстремальный компонент, начиная с формируемого компонента по последний элемент файла и определяем его местоположение;

b) осуществляем перестановку значений с формируемого места и места экстремального значения;

6) закрываем файл для работы close(fbd).

a) Выбор экстремального компонента осуществляем следующим образом:

1) читаем из файла очередной компонент (он находится на формируемом месте i) и принимаем его значение за экстремальное read(fbd,extr);

2) фиксируем место экстремального значения nm:=i;

3) перебираем все остальные компоненты файла. Пока не достигли конца файла not eof(fbd) повторяем

- чтение очередного компонента файла в переменную r read(fbd,r);

- если (r.fam<extr.fam) (r.fam=extr.fam)&(r.dr<extr.dr)

b) Перестановка значений

Перед выполнением этой подзадачи сложилась ситуация показанная на рис.24.3

Рис. 24.3. – Результат выбора

1 шаг перестановки – на место экстремального значения помещается значение с формируемого места:

- позиционирование на компонент i seek(fbd,i);

-.чтение из файла в промежуточную переменную r read(fbd,r);

- позиционирование на компонент nm seek(fbd,nm);

- запись значения переменной r в файл write(fbd,r);

2 шаг перестановки – на формируемое место записывается экстремальное значение

- позиционирование на компонент i seek(fbd,i);

- запись значения переменной extr в файл write(fbd,extr);

Обратите внимание, что после выполнения действий по перестановке, буфер связан с i+1 компонентом, то есть для выполнения п.5. буфер файла связан с необходимым компонентом.

Информационная модель

Таблица 24.7. Информационная модель

Статус Назначение Имя Тип
Вход имя физического файла с компонентами типа tinfstud namebd string
Пром имя логического файла fbd tfileinfstud
Пром номер формируемого компонента файла i longint
Пром экстремальное значение extr tinfstud
Пром номер компонента с экстремальным значением nm longint
Пром информация об учащемся r tinfstud

Программная модель

{программа сортировки (файл Z3.PAS)}

program z3;

{$I FILE0.PAS}

var i,nm:longint;

extr:tinfstud;

begin

writeln('Введите имя файла с информацией о студентах');

readln(namebd);

if not fs(namebd) then

begin

writeln('ОШИБКА!!! Файл с именем ',namebd,' не существует');

halt

end;

assign(fbd,namebd);

reset(fbd);

for i:=0 to filesize(fbd)-2 do

begin

read(fbd,extr);

nm:=i;

while not eof(fbd) do

begin

read(fbd,r);

with r do

if (fam<extr.fam)or

(fam=extr.fam)and((dr.g<extr.dr.g)or

(dr.g=extr.dr.g)and((dr.m<extr.dr.m)or

(dr.m=extr.dr.m)and(dr.d<extr.dr.d)))

then

begin

extr:=r;

nm:=filepos(fbd)-1

end

end;

seek(fbd,i);

read(fbd,r);

seek(fbd,nm);

write(fbd,r);

seek(fbd,i);

write(fbd,extr)

end;

close(fbd);

end.

Постановка задачи

Выборка из файла с БД записей, в которых средний балл не ниже заданного граничного, и занесение этих записей в новый файл результатов выборки. Имена физических файлов с БД и для результатов выборки задает пользователь.

Метод решения

1) получить от пользователя имя физического файла с БД readln(namebd);

2) если физический файл с таким именем отсутствует, то сообщить об этом пользователю и прекратить выполнение программы

3) получить от пользователя имя физического файла (namev) для хранения результатов выборки;

4) если файл с таким именем существует, то сообщить об этом пользователю и прекратить выполнение программы

5) получить от пользователя граничный средний балл (gsb)

6) связать логический и физический файлы с БД assign(fbd,namebd);

7) открыть файл прямого доступа с БД в режиме работы с существующим reset(fbd);

8) связать логический и физический файлы для результатов выборки assign(fv,namev);

9) открыть файл прямого доступа для результатов выборки в режиме создания нового файла
rewrite(fv);

10) перебрать все компоненты файла с БД. Пока не достигли конца файла (not eof(fbd))

a) чтение очередного компонента БД read(fbd,r);

b) если r.sb gsb запись r в файл выборки write(fv,r);

11) закрыть файл с БД close(fbd);

12) закрыть файл с результатами выборки close(fv).

Данный метод справедлив и для последовательных файлов, так как никаких особенностей файлов прямого доступа не используется.

Информационная модель

Таблица 24.8. Информационная модель

Статус Назначение Имя Тип
Вход имя физического файла с БД namebd string
Вход имя физического файла с результатами выборки namev string
Вход граничный средний балл gsb real
Пром имя логического файла с БД fbd tfileinfstud
Пром имя логического файла с результатами выборки fv tfileinfstud
Пром информация об учащемся r tinfstud

Программная модель

{программа выборки из файла по среднему баллу (файл Z4.PAS)}

program z4;

{$I FILE0.PAS}

var namev:string;{имя физического файла с выборкой}

fv:tfileinfstud;{илф выборки}

gsb:real;

begin

writeln('Введите имя файла с информацией о студентах');

readln(namebd);

if not fs(namebd) then

begin

writeln('ОШИБКА!!! Файл с именем ',namebd,' не существует');

halt

end;

writeln('Введите имя файла для выборки');

readln(namev);

if fs(namev) then

begin

writeln('ОШИБКА!!! Файл с именем ',namev,' существует');

halt

end;

writeln('Граничный средний балл?');

readln(gsb);

assign(fbd,namebd);

reset(fbd);

assign(fv,namev);

rewrite(fv);

while not eof(fbd) do

begin

read(fbd,r);

if r.sb>=gsb then

write(fv,r);

end;

close(fbd);

close(fv)

end.

Вариант 1: второй параметр любого целого типа

Если количество символов, полученных при преобразовании целочисленного значения в последовательность символов, меньше, чем число, указанн6ое в дополнительной информации, то слева к символам добавляются пробелы, так, чтобы количество полученных символов равнялось числу в дополнительной информации.

Вариант 2: второй параметр любого вещественного типа

Вещественное значение представляется в показательной форме с нормализованной мантиссой:

<знак числа><значащая цифра>. <цифры дробной части мантиссы>
e<знак порядка><целочисленный порядок>

Если математический сопроцессор не подключен, то дробная часть мантиссы содержит 10 цифр, целочисленный порядок – 2 цифры; при подключенном математическом сопроцессоре – соответственно 14 и 4 цифры.

В этом варианте результат преобразования последовательности символов зависит от настройки среды программирования (подключен или нет математический сопроцессор) и количества параметров в дополнительной информации (нет дополнительной информации, одно число в дополнительной информации или два числа):

a) если дополнительная информация отсутствует, то последовательность символов соответствует показательному (научному) формату числа, указанному в начале варианта (вместо знака числа плюс записывается пробел).

b) Если дополнительная информация состоит из одного числа, то это число может оказать влияние на количество позиций, отводимых в текстовом файле под символьное представление вещественного числа.

Если сопроцессор отсутствует и число в дополнительной информации меньше или равно 8, то последовательность символов преобразуется к следующему виду:

Zx. xEzxx

, где Z – знак числа (символ пробел, если знак плюс, символ -, если знак минус);

x – символ любой арабской цифры (первая цифра мантиссы всегда не 0);

z – знак порядка (символ + или символ -).

Если сопроцессор подключен и число в дополнительной информации меньше или равно 10, то последовательность символов преобразуется к следующему виду:

Zx.xEzxxxx

Если сопроцессор отсутствует и число в дополнительной информации,больше 17, то слева к символам числа добавляются пробелы, так чтобы количество полученных символов равнялось дополнительной информации. В случае подключенного сопроцессора такие действия выполняются, когда число в дополнительной информации больше 23.

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

c) если дополнительная информация состоит из двух чисел (второе число всегда меньше первого), последовательность символов преобразуется к представлению числа с фиксированной точкой, общепринятому в арифметике. Здесь второе число в дополнительной информации определяет количество позиций в дробной части записываемого в файл числа. А первое число задает общее количество позиций в записываемом числе, включая знак числа и десятичную точку. Если определяемое первым числом количество позиций не позволяет представить выводимое число, то это первое число не оказывает влияния на выделяемое в файле количество позиций под символьное представление записываемого числа. Если первое число в дополнительной информации позволяет представить в символьном виде записываемое число, то слева к символьному представлению могут добавляться пробелы, так чтобы количество позиций в последовательности символов равнялась первому числу в дополнительной информации.

Вариант 3: второй параметр типа CHAR

В этом случае к символу слева могут быть приписаны пробелы, так чтобы длина образованной последовательности символов равнялась числу в дополнительной информации.

Вариант 4: второй параметр любого строкового типа

Здесь число в дополнительной информации определяет минимальное количество позиций под символьное значение. Последовательность записываемых символов преобразуется по следующему правилу – если количество символов меньше, чем заданное число в дополнительной информации, то слева приписываются пробелы, так чтобы длина образованной последовательности символов равнялась числу в дополнительной информации.

Вариант 5: второй параметр типа boolean

В результате преобразования логического значения получается либо последовательность из четырех символов TRUE, либо последовательность из 5 символов FALSE. Дальнейшее преобразование этих последовательностей символов производится так же, как и в предыдущем варианте 4.

Пример записи в текстовый файл

program outfile;

var f:text;

begin

assign(f,'c:\tp\user\dandatt.pas');

rewrite(f);

write(f,'пример':3);

write(f,'вывода':10);

write(f,true:6);

write(f,false:1);

writeln(f);

write(f,-5:4);

write(f,-252:1);

write(f,32767);

write(f,-3.56);

writeln(f);

write(f,567.42:8);

writeln(f);

write(f,567.42:1:4);

close(f)

end.

В результате работы программы будет создан файл c:\tp\user\dandatt.pas. Содержимое этого файла приведено на рис. 24.4 (компоненты на рисунке располагаются слева направо, сверху вниз).

'П' 'р' 'и' 'м' 'е' 'р' ' ' ' ' ' ' ' ' 'в' 'ы' 'в' 'о' 'д' 'а' ' ' ' ' 'T' 'R' 'U' 'E'

 

'F' 'A' 'L' 'S' 'E' KC ' ' ' ' '-' '5' '-' '2' '5' '2' '3' '2' '7' '6' '7' '-'

 

'3' '.' '5' '6' '0' '0' '0' '0' '0' '0' '0' '0' 'E' '+' '0' '0' KC ' ' '5' '.' '7' 'E'

 

'+' '0' '2' KC '5' '6' '7' '.' '4' '2' '0' '0'

Рис. 24.4. – Содержимое файла

Вариант 2: второй параметр литерного типа char

1) В буфер считывается одна позиция текстового файла. Если это не признак конец файла, то буфер связывается со следующей позицией текстового файла. Если до выполнения процедуры read был связан с признаком конец файла, то местоположение буфера не изменяется.

2) Прочитанный символ заносится в оперативную память под именем второго параметра.

Вариант 3: второй параметр любого строкового типа

1) В буфер файла считывается столько позиций из текстового файла, сколько определено в строковом типе для второго параметра, если ранее не встретился признак конца строки или признак конца файла.

2) Если встретился признак конец строки или конец файла, то буфер связывается с позицией признака. Если при чтении эти признаки не встретились, то новое положение буфера – первая непрочитанная позиция.

3) Информация из буфера заносится в оперативную память под именем второго параметра, при этом формируется динамическая длина прочитанной строки.

 

Пример чтения из текстового файла

Пусть в текстовом файле c:\tp\user\inp.pas находится информация, приведенная на рис. 24.5.

'F' КС КС '5' ' ' '7' '.' '5' 'e' '-' '3' КС 'П' 'Р' 'И' 'М' 'Е' 'Р'

 

'Ч' 'Т' 'Е' 'Н' 'И' 'Я' ' ' 'И' 'З' ' ' 'Ф' 'А' 'Й' 'Л' КФ

Рис. 24.5. – Содержимое текстового файла

При выполнении программы:

program inptxt;

var f:text;

a:integer;

b:real;

c:char;

d:string[6];

e:string;

begin

assign(f,'c:\tp\user\inp.pas');

reset(f);

read(f,c);

read(f,a);

read(f,b);

readln(f);

read(f,d);

read(f,e);

close(f)

end.

сформируются значения переменных, приведенные на рис. 24.6.

A  
B 7.5e-3
C 'F'
D 'ПРИМЕР'
E 'ЧТЕНИЯ ИЗ ФАЙЛА'

Рис. 24.6. – Содержимое ОП

Тип файл

Классификация: нестандартный, структурированный (сложный) тип.

Имя определяет программист.

Структурная организация

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

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

При определении переменной типа файл мы определяем две структуры - структуру на внешнем устройстве и структуру в оперативной памяти (рис. 24.1)

Структура на внешнем устройстве представляет собой последовательность однотипных компонентов, ограниченную признаком конец файла. Для связи переменной типа файл с конкретным внешним устройством задаются специальные команды.

Структура в оперативной памяти - буфер или окно файла, размером в один компонент файла. Все общение с файлом, расположенном на внешнем устройстве, осуществляется через буфер файла, который находится в оперативной памяти.

Рис. 24.1. – Структурная организация данных типа файл

Определение типа

Для того, чтобы определить тип файл необходимо определить тип элементов, которые могут входить в файл. Количество компонентов не определяется. Типом компонентов может быть любой, кроме файлового, тип. Непосредственное определение типа файл приведено на рис. 24.2.

Рис. 24.2. – Определение типа файл

Как всегда, это определение делается в разделе нестандартных типов. Однако язык позволяет не определять тип компонента файла. В этом случае в качестве типа данных указывается тип FILE (такой файловый тип называется нетипизированным). Для нетипизированного файла нельзя выполнять стандартные операции по чтению и записи.

Примеры определения файловых типов и файлов:

TYPE

tf1=file of integer;

tf2=file of real;

VAR

f1:tf1;

f2:tf2;

f3:FILE;

В этих примерах f1 – файл из целых чисел, f2 – файл из вещественных чисел, f3 - нетипизированный файл. С файлом f3 нельзя выполнять стандартные операции по чтению и записи.

Множество значений

Включает в себя все значения, которые могут быть размещены в структуре, заданной определением типа.

Множество операций

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



Поделиться:


Последнее изменение этой страницы: 2016-06-26; просмотров: 257; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.116.37.228 (0.285 с.)