Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР_2_6_Работа_с_файлами.doc
Скачиваний:
0
Добавлен:
15.11.2018
Размер:
237.06 Кб
Скачать

1.Дополнение (материал по работе с файламими на языке Pascal)

Справочная информация

Файлы в Turbo Pascal классифицируются по двум признакам:

  1. по типу (логической структуре);

  2. по методу доступа к элементам файла.

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

Стандартные процедуры работы с файлами

2.1. Общие процедуры

Для работы с каким - либо физическим файлом, находящимся на ЖМД или ГМД, необходимо первоначально связать его с файловой переменной (логическим файлом), с помощью которой будет осуществляться доступ к этому физическому файлу.

Связывание логического и физического файлов выполняется процедурой

Assign (F, Name),

которая может использоваться только для закрытия файла.

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

Например:

Assign (F, ‘Rez.Dat’)

В приведенном примере выполняется связывание логического файла F с физическим файлом Rez.Dat, при условии, что он находится в текущем каталоге активного диска Ms Dos. Если же требуется, чтобы действие процедуры Assign не зависело от текущих устройств Ms Dos, то записывается полное имя файла с указанием диска, пути каталогов и имени файла, например:

Name: =‘d:\Rab\Rez.Dat’;

Assign (F, Name);

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

Открытие файлов выполняется процедурами

Reset (F) и Rewrite (F),

а закрытие – процедурой

Close (F).

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

Образное представление выполнения данной процедуры имеет вид:

f1...fk - компоненты файла F.

окно

- указатель текущей позиции файла

Если физический файл с указанным именем отсутствует, то возникает ошибка времени исполнения, которую можно подавить выключением директива компилятора {$ I-}. При такой установке директивы можно проанализировать результат завершения операции открытия файла с помощью функции IOResult, которая возвращает значение 0, если операция завершилась успешно, и ненулевой код ошибки в противном случае.

Процедура Rewrite создает новый физический файл, имя которого связано с файловой переменной F. Если такой физический файл уже существует, то он удаляется, и на его месте создается новый пустой файл. Образное представление выполнения этой процедуры имеет вид:

Функцией, позволяющей определить конец файла, является функция Eof(f). Она возвращает значение True, если указатель текущей позиции в файле f находится за последним элементом файла, или, если файл пуст. В противном случае она возвращает значение False.

Процедура ChDir (Path) устанавливает новый текущий каталог, путь к которому (включая и имя устройства) находится в параметре Path. Параметр Path по своим характеристикам аналогичен параметру Name в процедуре Assign, но в него не должно входить имя файла и он может быть только типа string (или совместимого для присваивания с ним типа).

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

Процедура GetDir (N, S) выдает информацию о текущем каталоге накопителя. В переменную S типа string записывается текущий каталог накопителя, номер которого указан параметром N. Параметр N имеет следующие значения: 0 - текущий накопитель, 1 - накопитель А:, 2 - накопитель В: и т.д.

Процедура MkDir (Path) создает новый каталог, путь до которого указан параметром Path. Параметр Path должен иметь тип string.

Процедура Rename (f, NewName) присваивает внешнему файлу, с которым связана файловая переменная f, новое имя, заданное параметром NewName. Параметр NewName аналогичен параметру Name в процедуре Assign.

2.2. Стандартные процедуры и функции для типизированных файлов

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

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

Read (F, <список переменных>).

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

При считывании в каждую переменную из списка процедуры Read, указатель текущей позиции в файле перемещается на следующий элемент. Если указатель текущей позиции файла находится за последним элементом, т.е. в конце файла (Eof (f) = True), то выполнение процедуры Read приводит к ошибке времени выполнения.

Запись в типизированные файлы осуществляется процедурой

Write (F, <список выражений.

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

Выполняя запись в файл следует помнить, что при записи каждой переменной указатель текущей позиции в файле, так же как и при чтении перемещается на следующий элемент. Если указатель текущей позиции файла находится за последним элементом, т.е. в конце файла (Eof (f) = True), то при выполнении процедуры Write файл расширяется.

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

Процедура Seek (F, Num) осуществляет настройку на требуемую компоненту файла, с которым связана файловая переменная. Компонента файла определяется номером Num, причем нумерация компонент начинается с нуля.

Процедура Truncate (F) удаляет часть файла, начиная с текущей позиции и до его конца.

Функция FilePos (F) возвращает номер текущей компоненты файла.

Функция FileSire (F) возвращает текущий размер файла, с которым связана файловая переменная f, в компонентах этого файла.

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

program Summa;

var f: file of Real;

X, Sum: Real;

begin

{$I-} {отключения контроля ошибки времени исполнения}

Assign (f, ‘Rez.Dat’);

Reset (f);

{$I+}

if IOResult< >0 then

begin

Writeln (‘Ошибки открытия файла’);

Halt (1); {прекращение выполнения программы}

end; {выход в операционную систему}

{вычисление суммы}

Sum: = 0;

While not Eof (f) do

begin

Read (f, X);

Sum: = Sum + X;

end;

Writeln (‘Сумма элементов файла равна ’, Sum:4:3);

Close (f);

end.

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

Особый вид файлов представляют собой текстовые файлы, которые в Turbo Pascal являются разновидностью файлов типа file of Char.

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

Пример объявления текстового файла имеет вид

var TextFile: Text;

Особенностью работы с текстовыми файлами является то, что параметры, значение которых вводятся и выводятся с помощью процедур Read и Write, могут быть не обязательно типа Char или String, а и других простых типов (целых, вещественных типов при вводе, целых, вещественных типов, типа Boolean - при выводе).

В текстовых файлах помимо признака файла Eof используется еще и признак строки EoLn (End of Line). Признак EoLn представляет собой последовательность из двух символов кода ASCII - символа с кодом 13 (“возврат каретки”) и символа с кодом 10 (“перевод строки”).

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

код символа

код символа

...

код символа

EoLn

код символа

код символа

...

код символа

код символа

EoLn

код символа

код символа

...

код символа

Eof

Отличие текстового файла от file of Char заключается в том, что: текстовые файлы не имеют прямого доступа.

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

Имеются признаки конца строки.

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

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

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

Процедура ReadLn (f, <список ввода>) осуществляет те же действия, что Read , но прочитанная часть строки, включая признак конца строки, пропускается.

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

Процедура WriteLn (f,<список вывода>) производит запись в файл аналогично процедуре Write, но выводимая информация завершается признаком конца строки.

Процедура Append (f) производит открытие файла для добавления в его конец информации.

Процедура SetTextBuf (f, Buf[, size]) для файла, с которым связана файловая переменная f, назначает буфер ввода - вывода в виде переменной Buf (любого типа). Необязательный параметр Size задает размер буфера в байтах. Если этот параметр не указан, в качестве буфера используется вся переменная Buf. Если эта процедура не используется, для организации ввода - вывода берется стандартный буфер ввода - вывода размером в 128 байтов.

Процедура Flush (f) осуществляет освобождение буфера вывода путем записи информации из буфера в файл.

Функция Eoln(f) (конец строки файла) принимает значение True, если текущей компонентой файла является признак конца строки или если функция Eoln(f) принимает значение True. В остальных случаях функция принимает значение False.

Функция SeenEof(f) (конец файла) отличается от Eof(f) тем, что стоящие в конце файла символы пробела и табуляции пропускаются.

Функция SeenEoln(f) (конец строки файла) отличается от Eoln(f) тем, что стоящие в конце строки символы пробела и табуляции пропускаются.

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

program Example;

var

F, Fp: Text;

S, Filename: String;

begin

Write (‘Введите имя файла:’);

ReadLn (Filename);

{$I-} {включение внутренней проверки правильности операции с файлами}

Assign (F, Filename);

Reset (F);

if I0Result <>0 then

WriteLn (‘Ошибка чтения файла’)

else

begin

Assign (Fp, ‘Prn’);

Rewrite (Fp),

if I0Result<>0 then

WriteLn (‘Принтер не готов’)

else

begin

while not Seeneof (F) do

begin

ReadLn (F,S);

WriteLn (Fp, S)

end;

Close (Fp);

end;

close (F);

end;

end.

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

Нетипизированные файловые переменные предназначены для низкоуровневой работы с файлами. При объявлении нетипизированного файла указывается только ключевое слово file.

Например:

var F: file;

С их помощью можно обратиться к файлу любого типа и логической структуры, аналогично тому, как выполнялось обращение к символьному файлу посредством файловой переменной типа Bufe. Отличие же состоит в том, что нетипизированный файл не имеет жестко установленной единицы чтения/записи, как типизированные файлы. В нетипизированных файлах за одно обращение считывается, записывается число байт, равное величине буфера, размер которого определяется вторым параметром в процедурах Reset или Rewrite. По умолчанию размер блока равен 128 байтам.

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

BlockRead (F, Buf, N[, Result]),

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

BlockWrite (F, Buf, N[, Result]),

осуществляющая запись в файл компонент.

Эти процедуры осуществляют чтение/запись из файла, с которым связана файловая переменная F, N или менее (если при чтении/записи будет достигнут конец файла) компонент.

Эти компоненты размещаются в буфере Buf. После выполнения процедуры указатель текущей компоненты файла перемещается на соответствующее количество прочитанных/записанных компонент. Необязательный параметр Result возвращает фактическое количество прочитанных/записанных компонент.

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