- •Лабораторная работа №2(7) Работа с файлами
- •1. Ввод и отладка простейшей программы работы с файлами
- •2. Разработка программ типовых алгоритмов работы с файлами
- •3. Работа с файлами с произвольным доступом
- •1. Краткие теоретические сведения по работе с файлами в языке си при вводе/выводе.
- •1.Дополнение (материал по работе с файламими на языке Pascal)
- •Стандартные процедуры работы с файлами
- •Внешние устройства, используемые в качестве файлов
1.Дополнение (материал по работе с файламими на языке Pascal)
Справочная информация
Файлы в Turbo Pascal классифицируются по двум признакам:
-
по типу (логической структуре);
-
по методу доступа к элементам файла.
Типизированными файлами называются файлы, содержащие элементы одного типа. Типизированные файлы могут быть любого типа, кроме файлового и опирающегося на файловый тип. Типизированные файлы допускают как последовательный, так и прямой доступ. Работая с прямым доступом, следует напомнить, что элементы типизированных файлов всегда нумеруются, начиная с нуля.
Стандартные процедуры работы с файлами
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 возвращает фактическое количество прочитанных/записанных компонент.