File not open - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Есть код
program project1;
 
type info=record
  surname, NameManufactory:string;
  salary:integer;
  a,b,c:word;
end;
const
  Sa = 237;
  Sb = 412;
  Sc = 196;
var t:info;
  digit:byte;
  n:string;
  f:text;
  inform:info;
 
procedure Create;
var c:char;
begin
  write('Введите название файла: ');
  readln(n);
  assign(f,n);
  rewrite(f);
  repeat
    writeln ('Введите фамилию работника: ');
    readln  (inform.surname);
    writeln (f,inform.surname);
    writeln ('Введите наименование цеха: ');
    readln  (inform.NameManufactory);
    writeln (f,inform.NameManufactory);
    writeln ('Введите количество изделий А');
    readln  (inform.a);
    writeln (f,inform.a);
    writeln ('Введите количество изделий B');
    readln  (inform.b);
    writeln (f,inform.b);
    writeln ('Введите количество изделий С');
    readln  (inform.c);
    writeln (f,inform.c);
    repeat
      writeln ('Вводить следующего работника (y/n)?: ');
      readln (c);
      if (c<>'y') and (c<>'n') then Writeln('Ошибка ввода');
    until (c='y') or (c='n');
  until c='n';
    close (f);
end;
 
procedure View;
begin
  write('Введите название файла: ');
  readln(n);
  assign(f,n);
  {$I-}
  reset(f);
  {$I+}
  while not eof(f) do begin
    readln(f,inform.surname);
    readln(f,inform.NameManufactory);
    readln(f,inform.a);
    readln(f,inform.b);
    readln(f,inform.c);
    inform.salary:=Sa*inform.a+Sb*inform.b+Sc*inform.c;
    writeln (inform.surname,' ':(15-Length(inform.surname)),inform.NameManufactory,' ':(23-Length(inform.NameManufactory)),inform.A:3,' ',inform.B:3,' ',inform.C:3,' ',inform.salary:3);
    writeln;
  end;
  close(f);
end;
 
procedure check;
begin
  while ioresult<>0 do
  begin
    writeln('Указанный файл не найден!');
    write('Введите название файла: ');
    readln(n);
    assign(f,n);
    reset(f);
    close(f);
  end;
end;
 
procedure FindWorkerManufName;
var s:string;
begin
  write('Введите название файла: ');
  readln(n);
  assign(f,n);
  {$I-}
  check;
  reset(f);
  {$I+}
  while not eof(f) do
  begin
    readln(f,inform.surname);
    readln(f,inform.NameManufactory);
    readln(f,inform.a);
    readln(f,inform.b);
    readln(f,inform.c);
//    write('Введите название цеха: ');
//    readln(s);
//    if (s<>'') then
//    begin
//      writeln('Success');
//    end;
//    else
//    writeln('Ошибка!Введите корректное название цеха');
    reset(f);
    close(f);
  end;
end;
 
procedure FindWorkerIncome;
begin
  write('Введите название файла: ');
  readln(n);
  assign(f,n);
  {$I-}
  reset(f);
  check;
  {$I+}
end;
 
procedure FindWorkerSurname;
begin
  write('Введите название файла: ');
  readln(n);
  assign(f,n);
  {$I-}
  reset(f);
  check;
  {$I+}
  close(f);
{  while not eof(f) do begin
    readln(f,inform.surname);
    readln(f,inform.NameManufactory);
    readln(f,inform.a);
    readln(f,inform.b);
    readln(f,inform.c);
  end;}
end;
 
begin
 
  while digit<>6 do
  begin
    writeln('Нажмите 1 для создания файла');
    writeln('Нажмите 2 для просмотра файла');
    writeln('Нажмите 3 для поиска работников по наименованию цеха');
    writeln('Нажмите 4 для поиска работников по заработку');
    writeln('Нажмите 5 для поиска работников по фамилии');
    writeln('Нажмите 6 для выхода из программы');
    write('Выберите пункт меню меню: ');
    readln(digit);
    case digit of
      1:Create;
      2:View;
      3:FindWorkerManufName;
      4:FindWorkerIncome;
      5:FindWorkerSurname;
      6:exit;
    else
      writeln('Ошибка ввода');
    end;
  end;
end.
 
end.
в котором ошибку выдаёт на строке 113:

exitcode=103

close(f);
а в других компиляторах пишет

file not open

помогите, уже не один час сижу над этой проблемой.. в самом начале исполнения я ввожу цифру 3, затем название файла, а затем всё крашится.

Решение задачи: «File not open»

textual
Листинг программы
type info=record
  surname, NameManufactory:string;
  salary:integer;
  a,b,c:word;
end;
const
  Sa = 237;
  Sb = 412;
  Sc = 196;
var t:info;
  digit:byte;
  n:string;
  f:text;
  inform:info;
 
 
 
procedure FindWorkerManufName;
var s:string;
begin
  write('Введите название файла: ');  readln(n);
  assign(f,n);
  {$I-}
  while ioresult<>0 do
  begin
    writeln('Указанный файл не найден!');
    write('Введите название файла: ');
    readln(n);
    assign(f,n);
    reset(f);
    close(f);
  end;
  reset(f);
  {$I+}
  while not eof(f) do
  begin
    readln(f,inform.surname);
    readln(f,inform.NameManufactory);
    readln(f,inform.a);
    readln(f,inform.b);
    readln(f,inform.c);
{    reset(f);
    close(f);}
  end;
  close(f);
end;
 
begin
FindWorkerManufName;
writeln(inform.surname);
writeln(inform.NameManufactory);
readln;
end.

Объяснение кода листинга программы

  1. Объявление типа данных info для записи информации о работнике.
  2. Объявление констант Sa, Sb и Sc для хранения значений цветов.
  3. Объявление переменных t, digit, n и f для работы с файлом и ввода данных.
  4. Объявление переменной inform типа info для хранения информации о работнике.
  5. Вывод сообщения с просьбой ввести название файла для чтения данных.
  6. Ввод названия файла и сохранение его в переменную n.
  7. Открытие файла с указанным названием для чтения данных.
  8. Проверка наличия файла и закрытие его при отсутствии.
  9. Повторное открытие файла после его закрытия из-за отсутствия.
  10. Чтение информации о работнике из файла и сохранение ее в переменную inform.
  11. Закрытие файла после чтения всех данных.
  12. Вывод информации о работнике на экран.
  13. Завершение работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.714 из 5
Похожие ответы