Ошибка 103 для write(f,...)

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ошибка 103 для write(f,...)

Сообщение flak » 27.05.2012 12:56:49

Здравствуйте. Простите, что занимаю ваше время, но у меня с базой данных забавная ситуация. Вчера я ее компилил и абсолютно все функции работали, причем работали отлично. Сегодня я скомпилил ее в последний раз для того, чтобы приступить к отчету по курсовой и провести тесты появилась ошибка 103 (файл не открыт), при том, что я связываю файловую переменную с именем файла на диске assign'ом, а затем готовлю файл к перезаписи rewrite'ом.
Как ни странно при проверке процедуры soz(отвечает за создание базы данных) с директивой {$I-} вплоть до write(f,zap) у меня ioresult=0. Помогите, пожалуйста, я уже четвертый час не могу исправить эту "чудесную" ошибку. Компилировал прогу с помощью Borland 7.0, Borland 7.1 и FPC 2.6.0 - результат один и тот же. Скриншот прилагается.
Собственно, код:
Код: Выделить всё
program kursa4;

uses crt;
const    imf='baza.dat';
         rf=20;
         rs=16;
         rfio=20;
         rb=4;
         rk=13;

type    z=record
            fak:string[rf];
            stud:integer;
            fiodek:string[rfio];
            ball:string[rb];
            kaf:integer;
         end;

var      f:file of z;
         o:char;
         otv,ot,i:integer;
         zap:z;
         pr:boolean;
         slov:string[rf];
{______________________________________________________________________}
function prov:boolean; {проверяет наличие файла и его состояние}

   begin prov:=false;
      assign (f,imf);
      {$I-} reset(f);{$I+}
         if ioresult<>0 then
            writeln ('Файл с базой не найден')
         else
         if filesize(f)=0 then
            writeln('Файл с базой пуст')
         else
         prov:=true;
         close(f);
   end;
{______________________________________________________________________}
function prunik(pole:string):boolean; {проверяет уникальность записи}
   var    prsovp:boolean;
         lokzap:z;

   begin
      prunik:=false; prsovp:=false;
      assign(f,imf); reset(f);
         while not eof(f) and not prsovp do
            begin
               read(f,lokzap);
               if lokzap.fak=pole then prsovp:=true;
               if lokzap.fiodek=pole then prsovp:=true;
            end;
               if prsovp=false then prunik:=true;
      close(f);         
   end;
{______________________________________________________________________}
procedure vivod; {табличку в ASCII рисует}

   begin
      if prov then         
                  writeln('┌────────────────────┬────────────────┬────────────────────┬────┬─────────────┐');
                  writeln('│Название факультета │Кол-во студентов│     ФИО декана     │Балл│Кол-во кафедр│');
                  writeln('├────────────────────┼────────────────┼────────────────────┼────┼─────────────┤');
         assign(f,imf);
         reset(f);
         while not eof(f) do
         begin
            read(f,zap);
            with zap do
                  writeln('│',fak:rf,'│',stud:rs,'│',fiodek:rfio,'│',ball:rb,'│',kaf:rk,'│');
         end;
                  writeln('└────────────────────┴────────────────┴────────────────────┴────┴─────────────┘');
         close(f);         
   end;
{______________________________________________________________________}
procedure soz; {создает базу данных}

   begin
      assign(f,imf);
      rewrite(f);
         repeat
            write('Введите название факультета: ');
               readln(zap.fak);
            write('Введите ФИО декана: ');
               readln(zap.fiodek);
               if prunik(zap.fak) and prunik(zap.fiodek) then
                  begin
                     write('Введите количество студентов: ');
                     readln(zap.stud);
                     write('Введите проходной балл: ');
                     readln(zap.ball);
                     write('Введите количество кафедр: ');
                     readln(zap.kaf);
            write(f,zap);
                  end
               else
                  begin
                     writeln('В базе уже есть запись с таким же деканом/факультетом!');
                  end;
            write('Добавить еще одну запись? Y/N= ');
            readln(o);
         until (o='n') or (o='N');
      close(f);
      writeln('Созданная база имеет вид: ');
      vivod;
   end;
{_____________________________________________________________________}
BEGIN
   repeat
   begin
      writeln;
      writeln('База данных "Институт"');
      writeln('Главное меню: ');      
      writeln('1: Создание БД (Внимание! Старая БД будет удалена!)');
      writeln;
      writeln('2: Вывод базы данных на экран.');
      writeln;
      writeln('9: Выход из программы');
         repeat
            write('Выберите пункт: ');
            readln(ot);
         until (ot>=1) and (ot<=9);
            
            case ot of
               1:soz;
               2:vivod;
               9:exit;
            end;

      write('Продолжить работу? Y/N= ');
      readln(o);
   end;
   until (o='n') or (o='N');
END.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
flak
незнакомец
 
Сообщения: 2
Зарегистрирован: 27.05.2012 12:35:27

Re: Ошибка 103 для write(f,...)

Сообщение Максим » 27.05.2012 17:43:22

В предъявленном вами коде вы в функции prunik пытаетесь открыть уже открытый в функции soz файл. Из-за этого возникает ошибка 5. Если это убрать, всё будет работать.
Аватара пользователя
Максим
энтузиаст
 
Сообщения: 598
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Re: Ошибка 103 для write(f,...)

Сообщение flak » 27.05.2012 21:48:28

Спасибо огромное =) Завтра будем еще разок тестировать.
flak
незнакомец
 
Сообщения: 2
Зарегистрирован: 27.05.2012 12:35:27


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12

Рейтинг@Mail.ru