Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Просьба помочь разобраться с открытием файла на чтение.

Автор: Виталий_Сигов 26.10.2009 19:13

Здравствуйте, уважаемые форумчане.
Задача у меня связана с файлом записей.
Программа запрашивает у пользователя, где создать файл -> создает этот файл и наполняет его данными.
Также программа запрашивает у пользователя, какой файл открыть на чтение, и если такой файл существует - то его содержимое выводится на экран.
По созданию файла мне все понятно. А вот с открытем файла на чтение - нет.
Что получается. За 1-й прогон программы создается файл, наполняется данными и его можно считать.
А за 2-й прогон программы если выбрать сразу операцию чтения из файла и указав физический файл на диске - он почему-то не выводится на экран.


type
tovar=record
naimenovanie:string[30];
strana_exporter:string[30];
data_postavki:string[10];
kolichestvo_tovara:byte;
end;
var
tov:array[1..100] of tovar;
f:file of tovar;
date,str:string;
k,l,n:integer;
i:byte;
ch:char;
begin
10:clrscr;
textcolor(white);
writeln(' МЕНЮ ');
writeln(' 1: Создание файла ');
writeln(' 2: Чтение файла ');
writeln(' 3: Добавление записи в файл ');
writeln(' 4: Выборка записей из файла ');
writeln(' 5: Выход ');
{readln(k);}
repeat
ch:=readkey;
until ch in ['1'..'5'];
k:=ord(ch)-ord('0');
{readln(k);}
case k of
1:goto 6;
2:goto 20;
3:goto 30;
4:goto 40;
5:goto 12;
end;


6:clrscr;
writeln('Введите полный адрес и имя типизированного файла');readln(str);
{$I-}
assign(f,str);
rewrite(f);
{$I+}
if IoResult<>0 then begin
writeln('Повтори ввод полного пути и имени типизированного файла');
writeln('');
delay(500);
goto 6;
end
else
{$I-}
8:writeln('Введите количество записей');readln(n);
{$I+}
if (IoResult<>0) or (n<=0) then begin
writeln('Повтори ввод количества записей !!!');
delay(500);
goto 8;
end
else
writeln('Введите наименование товара, страну - экспортер, срок поставки и количество товара');
for i:=1 to n do begin
writeln('Введите данные ',i,' - й записи');
with tov[i] do begin
write('Введите наименование товара : '); readln(naimenovanie);
write('Введите страну - экспортер : '); readln(strana_exporter);
write('Введите дату поставки : '); readln(data_postavki);
{$I-}
9:write('Введите количество товара : '); readln(kolichestvo_tovara);
{$i+}
if (IoResult<>0) or (kolichestvo_tovara<=0) or(kolichestvo_tovara>1000) then begin
writeln('Повтори ввод количества товара !!!');
delay(500);
goto 9;
end
else
writeln;
writeln('Нажмите Enter');readln;
end;
write(f,tov[i]);
end;
close(f);
str:='';
goto 10;

20:clrscr;
writeln('Введите полный адрес и имя типизированного файла');readln(str);
{$I-}
assign(f,str);
reset(f);
{$I+}
if IoResult<>0 then begin
writeln('Повтори ввод полного пути и имени типизированного файла');
writeln('');
delay(5000);
goto 20;
end
else
while not eof(f) do begin
read(f,tov[i]);
writeln(tov[i].naimenovanie);
writeln(tov[i].strana_exporter);
writeln(tov[i].data_postavki);
writeln(tov[i].kolichestvo_tovara);
end;
close(f);
readln;
goto 10;



Большая просьба помочь разобраться

Автор: volvo 26.10.2009 19:38

У тебя программа вообще вылетать должна, а не что-то там показывать/не показывать. Потому как при попытке read(f, tov[ i ]); когда i = 0 (а i у тебя равно именно 0, ничем другим эта переменная не инициализируется) будет вылет за границу массива и аварийное завершение программы (при включенной соответствующей опции компилятора). Кстати, надеяться что после окончания цикла For в переменной i будет N (на что ты надеешься) - тоже нельзя, там может быть любое значение, это написано в документации Борланда.

Диагноз: срочно переписывать программу, пока ты еще можешь контролировать ее. Добавишь еще десяток функций - она станет "лапшеобразной".