Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по ПА и ПО (с пояснениями).doc
Скачиваний:
10
Добавлен:
23.09.2019
Размер:
851.97 Кб
Скачать

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

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

Erase(…) – стирание файла

Rename(…) – переименование

ChDir(…) – установка каталога по умолчанию

MkDir(…) – создание каталога

RmDir(…) –удаление каталога

Пример работы с файлами:

  1. Программа, создающая целочисленные файлы и записывающая в них данные:

Program WriteFile (input,output);

Var

F: file of integer;

AR:array [1..10] of integer;

i: integer;

begin

for i:=1 to 10 do AR[i]:=i-1;

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

Assign(F,’int_file.dat’);

//открываем файл

Rewrite(F);

//записываем в файл значения элементов массива

For i:=1 to 10 do write(F,AR[i]);

//закрываем файл

Close(F);

End.

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

// описания переменных те же, что и в 1.

AR[8]:=20;

Assign(F,’int_file.dat’);

//открытие файла для его модификации

Reset(F);

//процедура установки указателя в файле на элемент номер 7

Seek(F,7);

Write(F,AR[8]);

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

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

Write(F,AR[8]);

Close(F);

End.

  1. Программа чтения целочисленного файла произвольной длины:

Var

F:file of integer;

i,v,c: integer //вспомогательные переменные

begin

Assign(F,’int_file.dat’);

Reset(F);

c := FileSize(F);

for i:=1 to c do

begin

Read(F,v); //читаем очередную запись

Write(v); //печатаем её

End;

Close(F);

End.

Специальные типы файлов языка Pascal.

Наряду со стандартными типизированными файлами присутствуют текстовые и нетипизированные файлы. Текстовые файлы являются особыми в том смысле, что состоят из записей произвольной длины и не все описанные выше файловые операции к ним применимы, а те, что применимы, иногда имеют другой смысл. Элементом файла является строка. В качестве разделителей записей используют специальные управляющие символы: возврат каретки (CR) и перевод строки (LF). В программе текстовый файл описывается следующим образом: Var F: text;

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

SeekEoLn(F); - установка указателя на конец текущей строки.

SeekEoF(F); - установка указателя в конец файла.

Операции в/в (read, write) имеют свои особенности при работе с текстовыми файлами. Главная особенность: при работе с данными других типов, происходит автоматическое преобразование этих данных к текстовому типу.

Данные хранят в текстовых файлах, если их нужно перенести в другую вычислительную среду. “+”: возможность редактирования, скрыт механизм преобразования типов; ”–”: потери времени на преобразование типов, усечение младших разрядов.

В любой прог-е на Pascal объявлены 2 файловые переменные (input, output), они связаны со стандартными устройствами в/в.

Program name(input, output);

var

input, output: text;

write(output, p1, p2,…);

read(input, p1, p2,…);

end.

С помощью процедуры Assign можно переназначить значения переменных input и output. Когда прог-а начинает исполняться, эти файлы считаются открытыми.

Для текстовых файлов определены 2 дополнительные стандартные процедуры:

Append(F); - открывает текстовый файл для записи, является аналогом процедуры Rewrite(F); (но Rewrite устанавливает указатель на начало файла, а Append – на конец файла)

SetTextBuf(var F; var Buf; BufSize); - устанавливает буфер для операций над текстовыми файлами, позволяет управлять размещением и размером буфера. По умолчанию размер буфера =128 байт и находится в системной области. (F – файловая переменная; Buf – буфер(например, массив типа char); BufSize – размер буфера (типа word)).

Эти 2 операции только для текстовых файлов.

Нетипизированные файлы:

Не входят в стандарт языка Pascal. Нетипизир-е файлы предназначены для работы с данными произвольной структуры. Тип элемента файла неопределён. Единственное, что известно – длина элемента (записи) файла.

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

Нетипиз-е файлы описываются в программе так: Var F: file;

Пример открытия нетипиз-е файла:

Assign (F, ‘a.dat’);

Reset(F,Size); // Size – длина записи

Rewrite(F,Size);

Следует принимать во внимание соответствие длины записи Size и размера физического блока устройства. Для жёстких дисков эта рекомендация не так важна. Универсальное решение проблемы – установить Size=1. Size должен быть кратен длине физической записи, иначе последняя запись может быть не прочитана.

Для организации обмена с нетипизированными файлами, используются 2 стандартные процедуры:

BlockRead(var F: file; var Buf; count: word; var Result: word);

Count – количество записей, заказанных для чтения (за 1 операцию в/в).

Result – число фактически прочитанных записей (за 1 операцию в/в). (Result<=Count)

BlockWrite(те же параметры)

Count – количество записей, заказанных для вывода.

Result – число фактически записанных элементов файла.

Close(F); - работает и для нетипизированных файлов.

Размер буфера (Buf) всегда равен произведению размера записи на значение переменной Count. Размер_буфера_Buf=Size*Count

Пример (использование нетипизированных файлов):

Прог-а копирования любых файлов. (copy источник приёмник)

program FileCopy;

count

BufSize = 512; //размер буфера обмена данных

var

FileIn, FileOut : file; //размер буфера обмена в байтах

NumRead,NumWritten : world;

Buf : array[1..BufSize] of Char; //буфер обмена

begin

if ParamCout < 2 then Halt;

Assign(FileIn, ParamStr(1));

//ParamStr возвращает строку (1-й параметр)

{$I-} Reset(fileIn,1);

//{$I-} – отключение автоматической обработки ошибок

if IOResult <> 0 then // IOResult – внутненняя ф-ция

begin

writeln(‘Файл – источник не найден’); Half

end;

//откроем выходной файл

Assign(FileOut,ParamStr(2));

//ParamStr возвращает имя файла приёмника

Rewrite(FileOut,1);

//цикл копирования

repeat

BlockRead(FileIn,Buf,BufSize,NumRead);

BlockWrite(FileOut,Buf,NumRead,NumWritten);

until (NumRead = 0) or (NumRead <> NumWritten)

close(FileIn);

close(FileOut);

end.