File not open - Free Pascal
Формулировка задачи:
Есть код
в котором ошибку выдаёт на строке 113:а в других компиляторах пишет
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.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.
Объяснение кода листинга программы
- Объявление типа данных
infoдля записи информации о работнике. - Объявление констант
Sa,SbиScдля хранения значений цветов. - Объявление переменных
t,digit,nиfдля работы с файлом и ввода данных. - Объявление переменной
informтипаinfoдля хранения информации о работнике. - Вывод сообщения с просьбой ввести название файла для чтения данных.
- Ввод названия файла и сохранение его в переменную
n. - Открытие файла с указанным названием для чтения данных.
- Проверка наличия файла и закрытие его при отсутствии.
- Повторное открытие файла после его закрытия из-за отсутствия.
- Чтение информации о работнике из файла и сохранение ее в переменную
inform. - Закрытие файла после чтения всех данных.
- Вывод информации о работнике на экран.
- Завершение работы программы.