IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Работа с файлами
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 3
Пол: Мужской

Репутация: -  0  +


Ребят, подскажите почему падает?
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.



Сообщение отредактировано: sergey_baltazavr -


--------------------
Коперник — знакомая фамилия. Что он сделал?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


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





Группа: Пользователи
Сообщений: 3
Пол: Мужской

Репутация: -  0  +


Это лаба такая, подскажи ещё как сделать чтобы нормально данные в файл заносились, т.е. без затирания строчки.


--------------------
Коперник — знакомая фамилия. Что он сделал?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


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-ы можно убрать.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5





Группа: Пользователи
Сообщений: 3
Пол: Мужской

Репутация: -  0  +


Всем спасибо за решение вопроса smile.gif


--------------------
Коперник — знакомая фамилия. Что он сделал?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 12.05.2024 8:21
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name