Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции Турбо Паскаль.doc
Скачиваний:
17
Добавлен:
22.03.2016
Размер:
307.71 Кб
Скачать

Операции ввода-вывода

  1. Процедура Read (f, <список>);

где f - файловая переменная, <список> - перечень переменных, которые могут иметь различный тип. Переменные отделяются друг от друга запятыми.

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

Работа осуществляется следующим образом:

начиная с текущей позиции указателя файла последовательно считываются значения, содержащиеся в файле и присваиваются переменным <списка>. После каждого чтения указатель файла перемещается на следующую позицию.

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

Если файл заканчивается, а список ввода еще не исчерпан, то происходит преждевременное прекращение ввода данных и выдается ошибка – «конец файла».

  1. Функция Eof (var f) – проверка на конец файла f, значение функции равно true, если текущий указатель находится за последней компонентой файла или файл пуст, в противном случае – false.

будет выделено 10 разрядов, из которых после (.) будет записано 3 разряда, переменная q запишется в ширину поля соответствующую 10 разрядам с двумя разрядами после (.).

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

Список значений, помещаемых в файл должен совпадать с базовым типом файла.

Перемещения по файлу

  1. Процедура Seek (var f, n: longuit); - позволяет изменить положение текущего указателя, установив его на элемент файла с заданным номером. В этой процедуре f – файловая переменная, n – целая переменная типа longiut, обозначающая порядковый номер элемента файла, на который необходимо установить указатель.

2. Функция File Size (f) и File Pos (f) – позволяет получить дополнительную информацию о файле f.

File Size возвращает общее число элементов файла, а File Pos – номер элемента, на который установлен текущий указатель.

Пример: установить текущий указатель на позицию на 2 элемента большую предыдущей, т.е. пропустить 2 элемента в файле f:

Seek (f, FilePos (f) + 2);

Установить текущий указатель на начало файла:

Seek (f, 0);

Установить текущий указатель на последний элемент файла:

Seek (f, FileSize (f));

  1. Truncate (f); - процедура используется для отсечения от файла его конца, начиная с текущей позиции указателя включительно.

Например: отсеч от файла с файловой переменной f все элементы, начиная с пятого.

Seek (f, 5);

Truncate (f);

Специальные операции

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

1. Erase (f); – функция удаляет внешний файл; функция не может быть использована для открытого файла. F – файловая переменная любого типа.

2. Rename (var f, newname: string); - функция переименовывает внешний файл, имеющий файловую переменную f на имя, указанное в строковой переменной newname.

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

Например:

На винчестере был файл Port.txt, переименовать его в tran.dat.

Program q (port.txt);

Var

f: text;

Begin

Assign (f,’c:\port.txt’);

Reset (f);

Close (f);

Rename (f,’tran.dat’);

End.

3. ChDir(s:string); - функция изменяет текущий директорий (справочник).

S – выражение строкового типа, соответствующее новому каталогу.

Например:

Изменить каталог Gr121 на Gr221. Сделать Gr121 – активным. Затем набрать команду ChDir(‘Gr221’).

Текущий маркер файла при выполнении Block Read (Block Write) продвигается на число записей, определенных в Result.

Перед обращением Block Read (Block Write) файл должен быть открыт.

Пример:

В файле ank.dat хранятся анкеты студентов. Содержание анкеты: фамилия и инициалы студентов (20 символов), год рождения, пол (запись).

Количество единовременно-передаваемых записей – 34, логическая запись – 30 (байт).

Подсчитать, сколько анкет относится к лицам мужского пола. Пол задан символами «муж» или «жен».

Program anket;

Type

Str = string [30];

Var

J, n, m: word;

S: array [1..34] of str; {буфер}

Fp: file; {нетипизированный файл}

Begin

N:=0;

Assign (fp, ‘Ank.dat’);

Reset (fp, 30);

While not eof (fp) do

Begin

Block Read (fp, s, 34, M); {М будет равно 34, а в конце - остатку}

For j:=1 to M do

If copy (s[j], 26, 3) = ‘муж’ then n:=n+1;

End;

Close (fp);

Writeln (‘число копий’,N:3);

End.

Один и тот же файл может быть описан в разных программах (и в одной), как текстовый, типизированный и нетипизированный. Гланое правильно использовать при этом структуру файла.

Работая с нетипизированным файлом Вы берете на себя ответственность за правильность доступа к данным. Ошибочное значение второго аргумента процедур Reset и Rewrite дезорганизует работы программы с файлом.

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

Пример:

1. Дан файл вещественных чисел

abcdabcdabcdabcd……abcd

1 2 3 4 n

В записи числа объединить по 4.

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

Abcdabcd …… abcd

n n-1 1

Если количество элементов в файле не кратно 4, то последнее в новый файл не писать.

Program fr;

Uses crt; {модуль работы с дисплеем}

Var

f, f1: file;

ff, ff1: text;

I, j, k, l: word;

w, x: real;

xx: array [1..4] of real;

Begin

Clrscr;

Assign (f,’ real.dat’); {для исходного массива}

Rewrite (f);

Randomize; {инициализация генератора случайных чисел}

J:=random (10);

J:=j+1; {получение случайного числа j от 1 до 11}

For i:=1 to j do

Begin

W:=random(25)/25; {получение случайного числа w от 0 до 1}

Blockwrite (f, w, size of (real)); {запись в файл f числа из переменной w. Длина числа не превышает

количества отводимого под вещественное

число}

end; {в файл f будет записано j:=11 чисел}

close (f);

reset (f); {открытие файла f для чтения}

i:=0;

repeat;

seek (f, i*size of (real)); {перемещение текущего указателя на велечину следующего указателя}

inc (i); {подсчет количества записей}

until eof(f);

del (i);

writeln (‘количество записей в файле =’,i);

j:= I mod 4; {для определения кратно ли количество записей в файле 4}

l:= I div 4; {количество записей, объединенных по 4 числа}

assign (f1,’rev.dat’);

rewrite(f1);

for k:= l downto 1 do

Begin

Seek f, (k-1) * size of (xx)); {перемещение на начало

очередных четырех чисел}

blockread (f, xx/ sizeof (xx)); {считывается очередных числа,

начиная с конца }

blockwrite (f1, xx, sizeof (xx)); {запись очередных четырех

чисел, начиная с начала}

end;

close (f), close (f1); {формирование обычных файлов вещественных

чисел, удобных для восприятия}

reset (f); {исходящий}

reset (f1); {полученный}

reset (ff, ‘dir’);

assign (ff1, ‘rev’);

rewrite (ff); {файлы вещественных чисел, записанных по одному

rewrite (ff1); числу в символьном виде}

while not eof (f) do

Begin

Blockread (f, x, sizeof (real); {считывание одного числа из

исходного файла}

write (ff, x:6:3,’); {запись очередного числа в файл ff с

шириной поля - 6 и тремя знаками после

запятой через пробел, числа отделяются

друг от друга запяттой}

end;

writeln (ff);

while not eof (f1) do

begin

blockread (f1, x, sizeof (real)); {действия для полученного

файла аналогично исходному}

write (ff1, x:6:3,’ ‘);

end;

writeln (ff1);

close (f);

close (f1);

close (ff);

close (ff1);

end.