Pascal

Тема в разделе "Delphi - Базы данных", создана пользователем Anti, 5 июн 2010.

Статус темы:
Закрыта.
  1. Anti

    Anti Гость

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

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

    Код (Delphi):
    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.
     
  2. Dock1100

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    Как помне ошібка тут:
    Код (Text):
     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;
    Попробуйте сделать так:
    Код (Text):
     
    i:=-1;
    while not EOF(f) do
    begin
    i:=i+1;
    readln(f,s);
    if i<>k then writeln(g,s);
    end;
     
  3. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Код (Delphi):
    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;
     
  4. OasisInDesert

    OasisInDesert Гость

    Привет народ! Вот мой альтернативный вариант.
    Код (Delphi):
    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;
     
  5. Snuper

    Snuper Гость

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

    Snuper Гость

    Код (Text):
    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. Поэтому "почти"
     
  7. OasisInDesert

    OasisInDesert Гость

    :mellow: Да конечно, извиняюсь.
     
  8. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    sax_ol
    кста, а чего? :mellow:
     
  9. Dock1100

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    тоесть первая строка будет не 1, а 0

    Код (Text):
     
    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

    Вы насчет чего? (паскаль такое потдерживает).
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей