Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OZO_KURSOVAYa_RABOTA_5_semestr.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
219 Кб
Скачать
☆

Обработка ошибок при работе с файлами

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

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

Директивы заключаются в фигурные скобки {}, внутри ставится обозначение соответствующей директивы и “+” или “-”:

{<обозначение директивы><>}

{I-} – отключает контроль ошибок ввода/вывода;

{I+} – включает контроль ошибок I/O.

Если делается попытка чтения несуществующего файла или логического устройства, то возникает ошибка времени выполнения, тип ошибки можно определить с помощью встроенной функции IOResult:word. Эта функция возвращает результат последней операции ввода/вывода. Если операция прошла успешно, функция возвращает 0, иначе возвращает код ошибки ввода/вывода. Для использования этой функции необходимо отключить контроль ошибок I/O.

Procedure TForm1.Button1Click(Sender: TObject);

v ar f1: textfile;

s: string;

Begin

assignfile(f1, Edit1.text);

{I-}

reset(f1); Открываем для чтения

if IOResult<>0 then

begin

ShowMessage(‘Неверное имя файла!’);

Exit;

End;

{I+}

while not eof(f1) do

begin

readln(f1, s); Считываем из файла

Memo1.Lines.Add(s);

end;

End;

Использование объектов tOpenDialog и tSaveDialog

В Delphi существуют объекты для работы с файлами, в частности: TOpenDialog, TSaveDialog.

Эти объекты позволяют открывать и использовать стандартные диалоговые окна открытия, сохранения файла. Вызов диалогового окна осуществляется с помощью метода Execute: boolean, который возвращает истину, если окно отрылось успешно, и ложь в противном случае.

Пример.

If OpenDialog1.Execute then

begin

assignfile(f, OpenDialog1.filename);

reset(f);

…

end;

или

Procedure TForm1.Button1Click(Sender:TObject);

var fName: string;

begin

if OpenDialog1.Execute then

begin

fName:=OpenDialog1.FileName;

Panel1.Caption:=fName;

end;

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

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

Переменные в списках ввода/вывода процедур read, write должны иметь тот же тип, что и компоненты файла (работает правило приведения типов). Если переменных в списках I/O несколько, то указатель будет смещаться после каждой операции обмена данными между переменными и файлом.

Пример объявления типизированного файла.

Var

f: file of integer;

t: file of string[20];

a: integer;

b: byte;

i: int64;

x: string[20];

Procedure TForm1.Button1Click (Sender: TObject);

Begin

assignfile(f, ‘c:\FEI\int.dat’);

assignfile(t, ‘c:\FEI\string.dat’);

rewrite(f); //Файл открыт для записи

rewrite(t); //Файл открыт для записи

write(f, a, b); //Запись в файл

write(t, x, ‘abcdef’); //Запись в файл

reset(f); //Файл открыт для записи и чтения

reset(t); //Файл открыт для записи и чтения

read(f, c); //Читаем из файла

read(t, x);

write(t, ‘stuwn’); //Запись в файл

End;

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

Seek(<ф.п.>,<N записи>); – процедура смещает указатель файла к требуемой записи.

Здесь <ф.п.> - дескриптор файла, <N записи> – выражение типа int64, указывающее номер записи файла. Первая запись имеет номер 0.

seek(f, 5);

read(f, x);

FileSize(<ф.п.>):int64; – функция возвращает количество записей в файле.

SizeOf(<экземпляр структуры>); – возвращает занимаемый размер в байтах.

Var

z: word;

…

SizeOf(z); //2

FilePos(<ф.п.>):int64; – функция возвращает порядковый номер записи файла, которая будет обработана следующей операцией ввода/вывода.

0

1

→

2

FilePos вернет 2

3

4

Пример.

Создадим базу данных, содержащей информацию о погоде. База данных состоит из одной таблицы:

Поле

Месяц

День

t0C

V ветра

Направление ветра

Тип

byte

byte

real

real

string[3]

Type

pogoda = record

m: byte;

d: byte;

t: real;

sv: real;

nv: string[3];

end;

Var

f: file of pogoda;

a,b: pogoda;

i: int64;

Procedure TForm1.Button1Click (Sender: TObject);

{Заполнение файла}

begin

assignfile(f, ‘c:\FEI\pogoda.dat’);

rewrite(f);

a.m:=2;

a.d:=20;

a.t:=-4;

a.sv:=3.5;

a.nv:=’СЗ’;

write(f, a);

end;

Procedure TForm1.Button2Click (Sender: TObject);

{просмотр файла}

begin

reset(f);

i:=0;

while not eof(f) do

begin

read(f,b);

i:=i+1;

with StringGrid1 do

begin

Cells[1,i]:= inttostr(b.m);

Cells[2,i]:= inttostr(b.d);

…

end;

end;

end;

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