Форум «Всё о Паскале» _ Задачи _ Изменение части текстового файла
Автор: Анжелика 30.05.2006 15:53
Привет все меще раз. Ребят, подскажите, что не так? Модуль выполняет(должен выполнять) перезапись строки текстового файла, но он этого не происходит. Как это исправить?
Код
unit ex_spr; interface uses crt; procedure exchange2; implementation var sp,temp:text; naz,name,pole,str1:string; i,k,nomst,nompl:byte; procedure exchange2; begin clrscr; writeln('Vvedite imya spravochnika'); readln(name); assign(sp,name); {ASSIGN(temp,'temp.txt');} reset(sp);{rewrite(temp);} k:=0; writeln('Vvedite nomer izmenyaemoi stroki:'); while not eof(sp) do begin inc(k); str(k,str1); naz:=str1+'. '; for i:=1 to 5 do begin readln(sp,name); naz:=naz+name+' '; end; writeln(naz);NAZ:=''; end; readln(nomst); writeln('Vvedite nomer izmenyaemogo polya'); writeln('1-Nazvanie'); writeln('2-Institut'); writeln('3-Specialnost'); writeln('4-God nabora'); writeln('5-Kol-vo studentov v gruppe'); readln(nompl); writeln('Vvedite novoe znacheniee, vibrannogo poly'); readln(pole); while not eof(sp) do begin inc(k); IF K<> nomst*5+nompl THEN {begin } READLN(SP,NAME) {writeln(temp,name); writeln(name);} { end } ELSE { begin} WRITELN(SP,POLE); {writeln(pole) end; } end; {close(sp);close(temp); rewrite(sp); reset(temp); while not eof(temp) do begin readln(temp,name); writeln(sp,name) end; close(temp); {erase(temp); } close(sp); WRITELN('Операция завершена. Нажмите Enter для продолжения'); readkey; end; end.
Автор: RaV 30.05.2006 16:06
Добавь изменение и проверь
readln(pole); k:=0; {<-----попробуй обнулить k, иначе оно у тебя становиться больше кол-ва строк в файле} while not eof(sp) do begin inc(k); IF K<> nomst*5+nompl THEN {begin } READLN(SP,NAME) {writeln(temp,name); writeln(name);} { end } ELSE { begin} WRITELN(SP,POLE); {writeln(pole) end; } end; end;
Автор: Анжелика 30.05.2006 16:47
Попробовала, но ниче не получается. Может есть вообще другой принципиальный подход к выполнению данной задачи?
Автор: Бродяжник 30.05.2006 18:15
А вот здесь, поскольку файл текстовый, а не типизированный, надо действовать приблизительно так:
{== пишем во временный файл строки до редактируемой ==}
for i:=1 to n-1 do begin readln(f1,s); writeln(f2,s); end;
readln(f1,s);
{== редактируем строку ==}
...
{== пишем ее в файл ==}
writeln(f2, s);
{== пишем во временный файл строки после редактируемой ==}
while not EoF(f1) do begin readln(f1,s); writeln(f2,s); end;
{== тут надо удалить основной файл и переименовать временный в основной ==}
...
Но это вообще кривой подход и годится только в качестве задач для студентов. Представить себе, чтобы так работал MS Word...
Автор: Анжелика 30.05.2006 20:05
О, Великие Умы Современности, помогите мне!!! Я не знала, что такую простейшую задачу так сложно осуществить в Pascal-е!!! Мне нужно сделать следующую ерунду: Модуль, создающий текстовый файл:
Код
unit cr_spr; interface uses crt; procedure creatiff; implementation var sp:text; name:string; procedure creatiff; begin clrscr; writeln('Vvedite imya spravochnika'); readln(name); assign(sp,name); rewrite(sp); writeln('File sozdan. Dlya prodolzheniya nazhmite Enter'); readkey; end; end.
Модуль, изменяющий одну из записей, позиция которой вводится(самый проблемный!!!!!!)
Код
unit ex_spr; interface uses crt; procedure exchange2; implementation var sp,temp:text; naz,name,pole,str1:string; i,k,nomst,nompl:integer; procedure exchange2; begin clrscr; writeln('Vvedite imya spravochnika'); readln(str1); assign(sp,str1); ASSIGN(temp,'temp.txt'); reset(sp);rewrite(temp); k:=0; writeln('Vvedite nomer izmenyaemoi stroki:'); while not eof(sp) do begin inc(k); for i:=1 to 5 do begin readln(sp,name); naz:=naz+name+' '; end; writeln(k,'. ',naz); end; readln(nomst); writeln('Vvedite nomer izmenyaemogo polya'); readln(nompl); writeln('Vvedite novoe znacheniee, vibrannogo polya'); readln(pole); while k <= (nomst*5+nompl)-1 do begin READLN(sp,name); writeln(temp,name); inc(k); end; readln(sp,name); writeln(temp,pole); while not EoF(sp) do begin readln(sp,name); writeln(temp,name) end; close(sp);close(temp);erase(sp); rename(temp,str1); WRITELN(‘Нажмите Enter‘); readkey; end; end.
Но все это «чудо» выдает глупость: после выполнения последнего модуля, в исходном файле оказывается лишь значение, введеное с клавиатуры в качестве нового на место заменяемого. Что еще придумать я не знаю! Помогите мне, пожалуйста! Заранее благодарю!
Автор: Бродяжник 30.05.2006 21:06
и вовсе незачем так кричать
... k:=0;
writeln('Vvedite nomer izmenyaemoi stroki:'); while not eof(sp) do begin naz:=''; inc(k); for i:=1 to 5 do begin readln(sp,name); naz:=naz+name+' '; end; writeln(k,'. ',naz);