Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2011_12 Комп.Науки_2сем.doc
Скачиваний:
4
Добавлен:
13.09.2019
Размер:
476.67 Кб
Скачать

17.6.7.Поэлементная обработка текстовых файлов, состоящих из строковых значений и чисел

Пусть описаны переменные

var F:text; s:string[15]; x:integer;

а каждая строки файла F содержит текст и число.

Оператор readln(F, s, x) прочитает в переменную s либо все символы строки файла вплоть до признака конца строки, либо столько, сколько в ней поместится. Чтение в переменную x закончится ошибкой ввода.

Если текст и число в строке файла поменять местами, то оператор readln(F, x, s) успешно выполнит чтение.

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

Таким образом, проблем при чтении в строковую переменную не будет, если строка файла читается целиком или строковая переменная является последней в списке оператора ввода.

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

17.7.1.Описание и структура типизированного файла

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

var F :file of тип_компонентов, где тип_компонентов не может быть файловым, не может быть динамической структурой. Т.е. при описании типа компонентов должен быть известен размер компонента в байтах.

Например:

type Matrix=array[1..10,1..15] of real;

Person=record

FIO:string[20];

group:1..12

end;

var FI: file of integer; //файл из целых чисел

FM: file of Matrix; //файл из двумерных массивов

FP: file of Person; //файл из записей

Cтруктура типизированного файла:

компонент

компонент

. . .

компонент

Eof

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

17.7.2.Особенности типизированных файлов

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

  2. Типизированный файл можно одновременно и читать, и писать. Процедуры Reset и Rewrite открывают файл и на чтение, и на запись, устанавливая файловый указатель на 0-ой компонент.

17.7.3.Дополнительные подпрограммы для организации прямого доступа

Текущая позицию файлового указателя

function FilePos(F): int64

Возвращает текущую позицию файлового указателя.

  • После открытия файла FilePos(F)=0

  • После завершения чтения всего файла FilePos(F)=FileSize(F)

Количество компонентов файла

function FileSize(F): int64

Возвращает количество компонентов файла.

Установка файлового указателя

procedure Seek(F, n)

Устанавливает файловый указатель на компонент с номером n.

  • Установка на начало файла: Seek(F,0)

  • Установка на последний компонент: Seek(F,FileSize(F)-1)

Усечение файла

procedure Truncate(F)

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

Удаление всех компонентов: Seek(F,0); Truncate(F) или проще: Rewrite(F).

17.7.4.Типичные задачи для типизированных файлов

Дан файл целых чисел:

var F:File of integer; x:integer;

Чтение файла от начала до конца

Вариант 1

Reset(F);

while not Eof(F) do Read(F,x); //Пока не наступит конец файла

//Номер прочитанного компонента равен FilePos(F)-1

Вариант 2

Reset(F);

for i:=0 to Filesize(F)-1 do Read(F,x) //Для всех компонентов файла

//Номер прочитанного компонента равен i.

Чтение файла в обратном порядке (с конца до начала)

Reset(F);

for i:=Filesize(F)-1 downto 0 do //Для всех компонентов файла с номером i от последнего до 0-го

begin Seek(F,i); Read(F,x) end

Замена только что прочитанного компонента файла на новый компонент

Reset(F);

while not Eof(F) do

begin Read(F,x);

if (x надо заменить на xnew) then

begin Seek(FilePos(F)-1); //Возврат на позицию, откуда был прочитан x

write(F,xnew) //Запись нового компонента

end

end

Удаление компонента из типизированного файла

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

for i:=p+1 to Filesize(F)-1 do //p – номер удаляемого компонента

begin

Seek(F,i);

read(F,x);

Seek(F,i-1);

write(F,x);

end;

Truncate(F); //Удаление последнего компонента

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

Rewrite(Fnew); //Открытие нового файла

Seek(F,p); //p – номер удаляемого компонента

while not Eof(F) do

begin

read(F,x);

if (FilePos(F)-1)<>p

then write(Fnew,x);

end;

Вариант 3. На место удаляемого компонента записать последний компонент файла, затем последний удалить. Преимущество – малое число операций. Недостаток – нарушается порядок компонентов файла.

Seek(F,Filesize(F)-1); //Установка указателя на последний компонент

Read(F,y); //Чтение последнего компонента

Seek(F,p); //p – номер удаляемого компонента

write(F,y);

Seek(F,Filesize(F)-1);

Truncate(F); //Удаление последнего компонента

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]