1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code]. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
типизированный файл, косяк с корректировкой и удалением записей.
Здравствуйте. У меня тут некоторая проблемка с типизированным файлом. Прошу помощи. Итак, суть задачи: создать основную программу и модуль. В основной выводится меню и считывается номер пункта. В модуле расположены процедуры на пункты меню. Создается типизированный файл(справочник 2), куда вводятся данные о номенклатурном номере изделия, наименовании изделия и цене изделия. После создания файл можно распечатать и откорректировать(удалить запись, добавить запись или редактировать запись). Собственно все работает, кроме корректирови и удаления записи. выкладываю кусок модуля с процедурами на создание файла, корректировку и удаление записей.
unit modmenu4; interface uses crt; type tsprav2=record{собственно запись данных} nom_num:integer; name_izdel:string; price:integer end; ztsprav2=array[1..30] of tsprav2;{тип записи} var name2:string; n,m,i:integer; flag,fl:boolean; answer:char; zap_sprav2:ztsprav2; sprav2:file of tsprav2;
procedure vvod_sprav2;{ввод типизированного файла} var i:integer; name2,answer:string; begin i:=0; repeat writeln('vvedite imya faila-spravo4nika 2:'); readln(name2); assign(sprav2,name2); {$I-} reset (sprav2); {$I+} if ioresult=0 then begin writeln('imya faila *',name2,'* yje est'); close(sprav2); fl:=false; end else begin rewrite(sprav2); fl:=true; end; until fl; flag:=true;
while(flag=true) do begin inc(i); writeln('Zapis N',i); write('>Vvedite nom.nomer izdeliya:'); readln(zap_sprav2[i].nom_num); write('>vvedite naimenovanie izdeliya:'); readln(zap_sprav2[i].name_izdel); write('>vvedite cenu izdeliya:'); readln(zap_sprav2[i].price); write(sprav2,zap_sprav2[i]); writeln('prodoljat zapis? <y/n>'); readln(answer); if (answer='n') or (answer='N') then flag:=false;
end; close(sprav2); end;
процедура на удаление отдельных строк записи
procedure udal_zap_sprav2; var flag,flag1:boolean; j,i:integer; temp:file of tsprav2; namet:string; begin repeat writeln('vvedite imya faila-spravo4nika 2:'); readln(name2); assign(sprav2,name2); {$I-} reset (sprav2); {$I+} if ioresult<>0 then begin writeln('imya faila *',name2,'* net');
fl:=false; end else begin reset(sprav2); fl:=true; end; until fl; namet:='temp2'; assign(temp,namet); rewrite(temp); m:=filesize(sprav2);
writeln('N':3,'nom.nomer':10,'name izdeliya':16,'cena':8); writeln; for j:=1 to m do begin read(sprav2,zap_sprav2[j]); writeln('',j,'':3,zap_sprav2[j].nom_num:10,zap_sprav2[j].name_izdel:16,zap_sprav2[j].price:8); end; while flag=true do begin Write('Vvedite nomer redactiruemoy zapisi: ');{дальше этого момента прога не работает} readln(i); if (i<1) or (i>m) then begin WriteLn('Neverniy nomer!'); writeln; writeln('Prodoljat vvod nomera? <y,n>'); readln(answer); if (answer='n') or (answer='N') then flag:=false; close(sprav2); close(temp); erase(temp); end else flag:=false; end; for j:=1 to i do begin read(sprav2,zap_sprav2[j]); write(temp,zap_sprav2[j]); end; for j :=i to m-1 do begin zap_sprav2[j]:=zap_sprav2[j+1]; dec(m); end; seek(temp,filesize(temp)); for j:=i to m do write(temp,zap_sprav2[j]); close(sprav2); close(temp); erase(sprav2); rename(temp,name2) end;
процедура для корректировки отдельных строк записи
procedure corr_zap_sprav2; var i,j,m:integer; zap:ztsprav2; s:integer; s1,namet:string; fl:boolean; temp:file of tsprav2; begin repeat writeln('vvedite imya faila-spravo4nika 2:'); readln(name2); assign(sprav2,name2); {$I-} reset (sprav2); {$I+} if ioresult<>0 then begin writeln('imya faila *',name2,'* net'); fl:=false; end else begin reset(sprav2); fl:=true; end; until fl; namet:='temp3'; assign(temp,namet); rewrite(temp); writeln('Spravo4nik 2'); writeln('N':4,'nom.nomer':10,'name izdeliya':16,'cena':8); writeln; m:=filesize(sprav2); for j:=1 to m do begin read(sprav2,zap_sprav2[j]); write('',j,'':4,zap_sprav2[j].nom_num:10,zap_sprav2[j].name_izdel:16,zap_sprav2[j].price:8); writeln; end; fl:=true; repeat begin Writeln('--> Vvedite nomer redactiruemoy zapisi: ');{здесь тоже аналогично} readln(i); if (i<1) or (i>m) then begin WriteLn('Neverniy nomer!'); writeLn; end else fl:=false;
end; until fl=false; m:=filesize(sprav2); for j:=1 to i do read(sprav2,zap_sprav2[j]); write(temp,zap_sprav2[j]); Write('Vvedite novoe zna4enie i najmite *ENTER*'); with zap_sprav2[i] do begin Write('Nom.nomer izdeliya: ',nom_num,'--->'); ReadLn(s); nom_num:=s; Write('Naimenovanie izdeliya: ',name_izdel,'--->'); ReadLn(s1); name_izdel:=s1; Write('cena izdeliya: ',price,'--->'); ReadLn(s); price:=s; seek(temp,filesize(temp)); write(temp,zap_sprav2[i]); seek(temp,filesize(temp)); for j:=i+1 to m do read(sprav2, zap_sprav2[j]); write(temp, zap_sprav2[j]); end; close(sprav2); close(temp); erase(sprav2); rename(temp,name2); end; end.
. Помогите пожалуйста....уже замучалась....
Сообщение отредактировано: what is - 3.05.2007 17:58
удаление - переписываешь нужные записи во второй фаил, а первый потом удаляешь, а второй переименовываешь
С типизированным-то файлом? Ну-ну...
Вместо того, чтобы последнюю запись перенести на место удаляемой, и сделать Truncate по предпоследней записи (пример - в поиске по слову Truncate) ты будешь все записи переносить в другой файл?