Pascal

  • Автор темы Anti
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A

Anti

Дано число k и текстовый файл. Удалить из файла строку с номером k (строки нумеруются от нуля). Если строки с таким номером нет, то оставить файл без изменений.

Программа с представленным кодом читает информацию из исходного файла и перезаписывает её во временный, но строку с номером k не удаляет (хотя должна по идее). Подскажите, в чём ошибка?

Код:
Uses crt;
Const
k=5; {номер строки}
n=250; {максимальная длина строки}
Var
f,g:text;
S: string;
i:integer;

BEGIN
Clrscr;
assign(f,'c:\1.txt');
reset(f);
assign(g,'c:\1~.tmp');
rewrite(g);
i:=0;
while not EOF(f) do
begin
while not EOLN(f) do begin
readln(f,s);
if i<>k then writeln(g,s);
inc(i);
end;
end;
close(f);
close(g);
END.
 
D

Dock1100

Как помне ошібка тут:
Код:
 while not EOF(f) do
begin
while not EOLN(f) do begin
readln(f,s);
if i<>k then writeln(g,s);
inc(i);
end;
end;

Попробуйте сделать так:
Код:
i:=-1; 
while not EOF(f) do
begin
i:=i+1;
readln(f,s);
if i<>k then writeln(g,s);
end;
 
S

sinkopa

Код:
function RemoveTextLine(FileName: string; lineNo:Integer): Boolean;
var
Text: TStringList;
begin
Result := False;
if (lineNo < 0) or (not FileExists(FileName)) then Exit;

Text := TStringList.Create;
Text.LoadFromFile(FileName);

Result := (lineNo < Text.Count);

if Result then
begin
Text.Delete(lineNo);
Text.SaveToFile(FileName);
end;
Text.Free;
end;
 
O

OasisInDesert

Привет народ! Вот мой альтернативный вариант.
Код:
procedure do_it_now (afile:string; anum:integer);
var
i:integer;
lnum:string;
lstg:TStringList;
begin
lnum:=IntToStr(anum);
lstg:=TStringList.Create;
try
lstg.LoadFromFile(afile);
i:=0;
while i<lstg.Count do
begin
if StartsStr(lnum,lstg[i]) then
begin
lstg.Delete(i);
break;
end;
end;
finally
lstg.Free;
end;
end;
 
S

Snuper

Ну вы гоните! Парень на паскале пишет, а вы ему Delphi. Самый, почти правильный, вариант написал Dock1100
 
S

Snuper

Код:
var
f: Text;

...

i := 0; 
while not EOF(f) do
begin
Readln(f, s);
if (i<>k)
then writeln(g, s);
Inc(i);
end;

Единственная разница между этими двумя вариантами - нет "волшебного числа" -1. Поэтому "почти"
 
D

Dock1100

Код:
var
f: Text;

...

i := 0; 
while not EOF(f) do
begin
Readln(f, s); 
if (i<>k)
then writeln(g, s);
Inc(i); 
end;

Единственная разница между этими двумя вариантами - нет "волшебного числа" -1. Поэтому "почти"

Дано число k и текстовый файл. Удалить из файла строку с номером k (строки нумеруются от нуля). Если строки с таким номером нет, то оставить файл без изменений.
тоесть первая строка будет не 1, а 0

Код:
i:=-1; //нулевая строка(несчитаная, несуществующая) = -1
while not EOF(f) do
begin
i:=i+1; //увеличели счетчик(считали первую строку и увеличели на один получится -1+1=0)
readln(f,s);
if i<>k then writeln(g,s);
end;

Результат будет одинаковым и у меня и у вас, просто вы делаете проверку до увеличения сщетчика, а я после, поэтому и -1 а не 0

За такое бьют. :mellow:
Вы насчет чего? (паскаль такое потдерживает).
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!