Материал: Мансуров. Основы программирования в среде Lazarus. 2010

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

3.6 Файлы

____________________________________________________________________

writeln(UTF8ToConsole('Ошибка чтения, код ошибки '), code_error);

writeln(UTF8ToConsole('Нажмите любую клавишу')); readkey;

Halt;

end;

end;

{========== процедура записи с контролем операции ============}

procedure Write_File(var f: fstud; var st: student); begin

{$I-} Write(f, st); {$I+}

code_error:= IOResult; if code_error <> 0 then begin

writeln(UTF8ToConsole('Ошибка записи в файл, код ошибки '), code_error);

writeln(UTF8ToConsole('Нажмите любую клавишу')); readkey;

Halt;

end;

end;

{ ============== корректировка записей в файле ============== } procedure find_data;

var r: student; begin

Reset_File(f); Assign(v,'s.dat'); Rewrite(v); ClrScr;

GoToXY(10, 9);

writeln(UTF8ToConsole('Укажите ключ (поле) для поиска')); GoToXY(10, 10); writeln(UTF8ToConsole('корректируемой записи - по:')); GoToXY(10, 11);

writeln(UTF8ToConsole(' группе

- 1'));

GoToXY(10, 12);

 

writeln(UTF8ToConsole(' фамилии

- 2'));

GoToXY(10, 13);

 

writeln(UTF8ToConsole(' предмету

- 3'));

GoToXY(10, 14);

 

writeln(UTF8ToConsole(' оценке

- 4'));

GoToXY(10, 15);

 

266

Глава 3 Более сложные элементы языка

____________________________________________________________________

writeln(UTF8ToConsole(' выход из режима - 5')); GoToXY(10, 16);

write(UTF8ToConsole(' выбор режима =')); readln(choice); ClrScr;

GoToXY(10, 9);

writeln(UTF8ToConsole(' Замена информации ')); case choice of { поиск записи }

1: begin

GoToXY(10, 10); write(UTF8ToConsole('группа=')); readln(gr);

input_data; end;

2: begin GoToXY(10, 10);

write(UTF8ToConsole('фамилия=')); readln(fam);

input_data; end;

3: begin GoToXY(10, 10);

write(UTF8ToConsole('предмет=')); readln(sub);

input_data; end;

4: begin GoToXY(10, 10);

write(UTF8ToConsole('оценка=')); readln(ocen);

input_data; end;

5: exit; { выход в основную программу } end; { end of case }

while not Eof(f) do begin

Read_File(f, r); case choice of

1: begin

if gr=r.gruppa then Write_File(v,new_student)

else Write_File(v,r)

end;

267

3.6 Файлы

____________________________________________________________________

2: begin

if fam=r.fio then Write_File(v,new_student)

else Write_File(v,r)

end; 3: begin

if sub=r.predmet then Write_File(v,new_student)

else Write_File(v,r)

end; 4: begin

if ocen=r.ocenka then Write_File(v,new_student)

else Write_File(v,r)

end;

end; { end of case } end; { end of while } restorefile;

end;

{ ============== основная программа ===================}

begin

writeln(UTF8ToConsole('Введите имя файла:')); readln(fname);

{$IFDEF WINDOWS} fname:=CP866ToUTF8(fname); fname:=UTF8ToAnsi(fname);

{$ENDIF}

full_fname:=fname + '.dat'; Assign(f,full_fname); repeat

ClrScr;

{ Формирование меню работы с основным файлом f } GoToXY(10, 7);

writeln(UTF8ToConsole('Выберите нужный режим работы :')); GoToXY(10, 8);

writeln(UTF8ToConsole('Создание файла

1'));

GoToXY(10, 9);

 

writeln(UTF8ToConsole('Вывод содержимого файла

2'));

GoToXY(10, 10);

 

writeln(UTF8ToConsole('Поиск по заданным полям

3'));

268

Глава 3 Более сложные элементы языка

____________________________________________________________________

GoToXY(10, 11);

 

writeln(UTF8ToConsole('Добавление записей в файл

4'));

GoToXY(10, 12);

 

writeln(UTF8ToConsole('Удаление записей из файла

5'));

GoToXY(10, 13);

 

writeln(UTF8ToConsole('Корректировка записей в файле

6'));

GoToXY(10, 14);

 

writeln(UTF8ToConsole('Выход из программы

7'));

readln(choose);

 

case choose of

 

{choose - значение для выбора режима работы с файлом f }

1:create_data;

2:out_to_screen;

3:select_data;

4:add_data;

5:delete_data;

6:find_data;

end; { end of case } until choose=7;

end.

В этой программе новым для нас является только опережающее объявле-

ние функций и процедур. В Паскале строго соблюдается правило – каждый объект перед использованием должен быть описан. Что касается функций и процедур, то здесь сделаны некоторые "поблажки". Пусть имеются две проце-

дуры, одна из которых вызывает другую.

procedure A (param: integer;)

begin

. . . . .

B(i);

. . . . .

end;

procedure B(param: integer);

begin

. . . . .

269

3.6 Файлы

____________________________________________________________________

end;

При таком расположении и таком описании процедур компилятор выдаст ошибку "Identifier not found "B"". Можно конечно переставить местами эти процедуры, но можно сделать так называемое опережающее описание про-

цедуры таким вот образом:

procedure B(param: integer); forward; procedure A (param: integer;)

begin

. . . . .

B(i);

. . . . .

end;

procedure B(param: integer); begin

. . . . .

end;

Как видим, опережающее описание заключается в том, что объявляется лишь заголовок процедуры В, а тело процедуры заменяется директивой forward. Теперь в процедуре А можно использовать обращение к процедуре

В, поскольку она уже описана, точнее, известны ее формальные параметры, и

компилятор может правильным образом организовать ее вызов.

Рассмотрим другую ситуацию. Предположим, что процедуры А и В вызы-

вают друг друга:

procedure A (param: integer;)

begin

. . . . .

270

Смотрите также:

11 Горм +
113
14
1433
1511
1632
199
204
2N4264RE
3773