{----------------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);
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
9.11.2011 5:04
Ну и где здесь " Практика продвинутого программирования". Вопрос. Вторая процедура,где закрытие файла?. Затем,Reset открывает файл и устанавливает указатель в начало файла.В итоге каждый раз ты будет добавляя новую строку затирать первую. Зачем делать Rewrite и следом тут же Reset???(2 процедура) А падает она у тебя в 4 процедуре потому что assign есть,а где Reset?????Я бы на твоем месте нафиг избавился от всех этих процедур. Твои коментарии не соответствуют дейстительности.Циклы я бы все таки использовал на твоем месте либо For либо while, в зависимости от потребностей.
sergey_baltazavr
9.11.2011 21:37
Это лаба такая, подскажи ещё как сделать чтобы нормально данные в файл заносились, т.е. без затирания строчки.
IUnknown
9.11.2011 22:13
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
9.11.2011 23:47
Всем спасибо за решение вопроса
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.