Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с файлами
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
sergey_baltazavr
Ребят, подскажите почему падает?
program file_operation_TWO;
uses crt;

{----------------opisanie peremennux--------------------------------}
type
tovar = record {opredelyem strukturu dannyx TOVARA}
name : string;
cost : real;
num : integer;
end;

var
F1: file of tovar;
s : array[0..100] of tovar;
s1 : tovar;
c : char;
mas:array[0..100] of real;
ch : integer;
n : integer;
{-------------------------------------------------------------------}




{------------------1-procedura vvoda s klaviatury i zapis v massiv-------------------------}
procedure out_mas;

begin
ch:=0;
writeln('1) Vvod c klaviatury veshestvennyx chisel i zapis v file->>>');
writeln('');
repeat
write('Input name: ');
readln(s[ch].name);

write('Input cost: ');
read(s[ch].cost);

write('Input number: ');
readln(s[ch].num);

writeln('');
{ writeln(s[ch].cost);
writeln(s[ch].name);
writeln(s[ch].num);
} ch:=ch+1;
write('Okonchit vvod? y/n: ');
readln©;
until c = 'y';
n:=ch;
writeln('N=',n);

end;
{---------------------------------------------------------------------}

{-----------------2-procedura zapisi massiva v file-------------------------}
procedure out_fil;
var
file_name : string;
begin
file_name:='o123';
ch:=0;
assign(F1, file_name);
rewrite(f1);
reset(F1);
writeln('2) Zapis massiva v file->>>');
writeln('');
repeat
write(F1,s[ch]);
ch:=ch+1;

until ch<n;
end;
{---------------------------------------------------------------------}


{-------------------3-procedura dopolneniy file--------------------------}
procedure dop_fil;
var
file_name : string;
dstr : string;

i,code:integer;
begin
writeln('');
writeln('3) Dopolnenie file->>>');
ch:=0;
code:=0;
file_name:='o123';
assign(F1, file_name);
reset(F1);
writeln('Vvedite dannye dly dopolneniy v file: ');
{---}
write('Input name: ');
readln(s1.name);

write('Input cost: ');
readln(s1.cost);

write('Input number: ');
readln(s1.num);
{---}
write(F1,s1);
close(F1)
end;
{---------------------------------------------------------------------}



{-------------------4-procedura chteniy iz file i vyvod na ekran------}
procedure in_fil;
var
file_name : string;

i,code:integer;
begin
writeln('');
writeln('4) Chtenie iz file i vyvod na ekran->>>');
ch:=0;
code:=0;

file_name:='o123';
assign(F1,file_name);
writeln('qqqqqqqq'); readkey;
{-----ERRORS!--------}

{---------------------}
repeat
read(F1,s1); {padaeettttt!!!!!!}
readkey;
writeln('Name: ',s1.name);
writeln('Cost: ',s1.cost);
writeln('Number: ',s1.num);

until Eof(F1);
close(F1)
end;
{---------------------------------------------------------------------}



{------------------------ocnovnay programma-----------------------------}
begin
{sohranenie dannyx}
clrscr;

out_mas;
readkey;

out_fil;
readkey;

dop_fil;
readkey;

in_fil;
writeln('');
writeln('Press any key...');
readkey;

end.

Krjuger
Ну и где здесь " Практика продвинутого программирования".
Вопрос. Вторая процедура,где закрытие файла?.
Затем,Reset открывает файл и устанавливает указатель в начало файла.В итоге каждый раз ты будет добавляя новую строку затирать первую.
Зачем делать Rewrite и следом тут же Reset???(2 процедура)
А падает она у тебя в 4 процедуре потому что assign есть,а где Reset?????Я бы на твоем месте нафиг избавился от всех этих процедур. Твои коментарии не соответствуют дейстительности.Циклы я бы все таки использовал на твоем месте либо For либо while, в зависимости от потребностей.
sergey_baltazavr
Это лаба такая, подскажи ещё как сделать чтобы нормально данные в файл заносились, т.е. без затирания строчки.
IUnknown
sergey_baltazavr

1. У тебя out_fil не корректно написана, условие в until должно быть другим. Если ты введешь один элемент массива - программа просто вылетит, потому что Ch < n не выполнится никогда (изначально Ch = 0, но внутри цикла она увеличивается, и становится равной 1-це. И n = 1 тоже. И как ты хочешь выйти из цикла? Программа занесет в файл все пустые записи из массива S, и когда Ch станет больше чем 100 - просто вылетит). Если же введешь больше одного элемента - то программа запишет в файл ровно одну структуру, увеличит значение ch, и цикл благополучно завершится, так как (1 < 2) - истина... Возможно, ты просто не разобрался в том, как работает repeat/until? Выполнение этого цикла завершается тогда, когда условие становится истинным, а не как у While (выполнять, пока условие истинное, как только стало ложным - выходить из цикла)

Так что, придется записать условие в виде until Ch = N, тогда в файл будет записано ровно столько записей, сколько было введено пользователем

2. С перезаписью файла. Создал файл через Rewrite - сразу, безо всяких Reset-ов пиши в него данные. Записал - закрывай файл обязательно. Только тогда все данные действительно в нем сохранятся.

3. Добавление к существующему файлу: открыл файл, но (перед записью в него) надо еще переместиться в самый конец, чтоб действительно дописывать, а не перезаписывать существующие записи:

Reset(F1);
Seek(F1, FileSize(F1)); { <--- Теперь записываться данные будут после последнего элемента }
...
. Assign не обязателен. Если где-то в программе имя файла уже было связано с файловой переменной, то остальные Assign-ы можно убрать.
sergey_baltazavr
Всем спасибо за решение вопроса smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.