Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Изменение части текстового файла

Автор: Анжелика 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

А вот здесь, поскольку файл текстовый, а не типизированный, надо действовать приблизительно так:

write('enter number of line: ');
readln(n);

reset(f1);
rewrite(f2); {== f2 - временный файл ==}

{== пишем во временный файл строки до редактируемой ==}

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 add_end_;
interface
uses crt;
procedure add_spr;
implementation
var sp:text;
    name,naz:string;
procedure add_spr;
begin
     clrscr;
     writeln('Vvedite imya spravochnika');
     readln(name);
     assign(sp,name);
     append(sp);
     repeat
           writeln('Vvedite nazvanie gruppi');
           readln(naz);
           writeln(sp,naz);
           writeln('Vvedite nazvanie kafedri');
           readln(naz);
           writeln(sp,naz);
           writeln('Vvedite nazvanie spechialnosti');
           readln(naz);
           writeln(sp,naz);
           writeln('Vvedite god nabora');
           readln(naz);
           writeln(sp,naz);
           writeln('Vvedite kolichestvo studentov v gruppe');
           readln(naz);
           writeln(sp,naz);
           writeln('Zakonchit vvod dannih?(Y/N)');
           readln(naz);
     until (naz = 'y')or(naz = 'Y');
     close(sp);
     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);

end;

readln(nomst);
writeln('Vvedite nomer izmenyaemogo polya');
readln(nompl);
writeln('Vvedite novoe znacheniee, vibrannogo polya');
readln(pole);

reset(sp);
k:=0;

while k < (nomst-1)*5+nompl-1 do
begin
READLN(sp,name);
writeln(temp,name);
inc(k);
end;
...


по-моему, так