- •Алгоритмические языки и программирование работа с файлами
- •Брянск 2007
- •1. Цель работы
- •2. Теоретическая часть
- •2.1. Типизированные файлы
- •2.1.1. Объявление файловой переменной
- •2.1.2. Связывание файловой переменной
- •2.1.3. Открытие файла
- •2.1.4. Операции ввода/вывода
- •2.1.5. Дополнительные операции (применяемые только
- •2.1.6. Закрытие файла
- •2.2. Текстовые файлы
- •2.3. Нетипизированные файлы
- •2.4. Дополнительные подпрограммы для работы с файлами
- •2.4.1. Переименование и удаление
- •2.4.2. Обработка ошибок ввода/вывода
- •2.4.3. Операции с каталогами
- •2.4.4. Дополнительные операции
- •2.5. Примеры
- •2.5.1. Работа с типизированными файлами
- •2.5.2. Работа с текстовыми файлами
- •2.5.3. Работа с нетипизированными файлами
- •3. Порядок выполнения работы
- •4. Список заданий
- •4.1. Работа с типизированными файлами
- •4.2. Работа с текстовыми файлами
- •5. Контрольные вопросы
- •6. Список рекомендуемой литературы
2.4.2. Обработка ошибок ввода/вывода
Целочисленная функция IOResult возвращает целое число, которое является кодом завершения предшествующей операции ввода-вывода. Если код завершения равен нулю, то команда завершилась успешно. Опросить функцию IOResult можно только один раз после каждой операции ввода/вывода, так как она обнуляется при каждом вызове. Наличие этой функции позволяет организовать пользовательскую обработку ошибок при работе с файлами. Например, рассмотрим функцию логического типа FileExists(имя_файла), возвращающую значение true, если файл, заданный в качестве параметра имя_файла, существует, и false - в противном случае:
Function FileExists(Name_of_File: String): Boolean;
Var F: File;
Begin
{Связь файловой переменной с файлом}
Assign(F, Name_of_File);
{Отключение стандартной обработки операции ввода-вывода}
{$I-}
Reset(F); {Открытие файла}
{Включение стандартной обработки операции ввода-вывода}
{$I+}
{Проверка кода завершения после выполнения Reset}
If IOResult=0 then
{Если файл был успешно открыт, т.е. существует}
FileExists:=True
Else
FileExists:=False; {Если файла нет}
Close(F) {Закрытие файла}
End;
2.4.3. Операции с каталогами
Процедура ChDir изменяет текущий каталог. Формат обращения:
ChDir (путь);
где путь – строковое выражение, содержащее путь к устанавливаемому по умолчанию каталогу.
Процедура GetDir позволяет определить имя текущего каталога (каталога по умолчанию). Формат обращения:
GetDir (устройство, каталог);
где устройство – выражение типа Word, содержащее номер устройства: 0 – устройство по умолчанию, 1 – диск А, 2 – диск В и т.д. В переменной каталог возвращается путь к текущему каталогу.
Процедура MkDir создает новый каталог на указанном логическом диске. Формат обращения:
MkDir(каталог);
где каталог – выражение типа String, задающее путь к каталогу. Последним именем в пути, т.е. именем вновь создаваемого каталога, не может быть имя уже существующего каталога.
Процедура RmDir удаляет каталог. Формат обращения:
RmDir(каталог);
Удаляемый каталог должен быть пустым, т.е. не содержать файлов или имен каталогов нижнего уровня.
2.4.4. Дополнительные операции
Сохранение информации из буфера в файл выполняется процедурой Flush. Формат обращения:
Flush(имя_файловой_переменной);
Процедура применяется к открытым выходным файлам. Она принудительно записывает данные из буфера в файл независимо от степени его заполнения. Процедура игнорируется, если файл был инициирован для чтения процедурой Reset.
2.5. Примеры
2.5.1. Работа с типизированными файлами
Сортировка целых чисел, хранящихся в файле.
Program Sorting;
Uses Crt;
Var
F: File of Integer;
i, j: LongInt;
Mas: Array[1..500] of Integer;
FSize, Tmp: LongInt;
S: String;
BEGIN
ClrScr;
Write('Enter filename: ');
Readln(S);
{открытие файла}
Assign(F, S);
{$I-}
Reset(F);
{$I+}
if IOResult <> 0 then begin
Write('Произошла ошибка при открытии файла!');
Halt; {выход из программы}
end;
{пока не достигнут конец файла, читаем данные из файла и записываем их в массив}
i:=0;
While (not Eof(F)) Do Begin
Read(F, Mas[i]); {читаем данные из файла в массив}
Write(Mas[i], ' '); {выводим на экран состояние массива}
End;
FSize:=FileSize(F);
{сортируем массив по возрастанию}
For i := 1 To FSize Do
For j := 1 To FSize-1 Do
if Mas[j] > Mas[j+1] then begin
Tmp:= Mas[j];
Mas[j]:= Mas[j+1];
Mas[j+1]:=Tmp;
end;
Writeln; Writeln('=======================');
{перезаписываем файл}
ReWrite(F);
For i := 1 To FSize Do Begin
Write(Mas[i], ' '); {выводим данные массива на экран}
Write(F, Mas[i]); {записываем данные в файл}
End;
Writeln; Write('Количество элементов в файле: ', FSize);
Close(F);
Readln;
END.