Announcement

Collapse
No announcement yet.

Nur die erste Zeile aus einer Textdatei löschen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Nur die erste Zeile aus einer Textdatei löschen

    Hi,
    ich habe eine etwa 1MB große Textdatei.
    Aus dieser Text Datei muss ich jetzt die erste Zeile löschen und die Datei unter dem selben Namen wieder speichern.<br>
    Es soll dabei keine neue Datei angelegt werden, sondern wirklich nur die erste Zeile soll gelöscht werden.<br>
    In eine Stringlist kann ich die Datei nicht einlesen, ad eine Stringlist nicht mit 1MB grossen Dateien umgehen kann.<br><br>

    Gbt es irgend eine geschickte Lösung dafür?
    Ich werde es auf alle Fälle weiter probieren, wäre aber sehr dankbar für Vorschläge.<br><Br>

    Danke euch allen
    <br><br>
    Tyrael

  • #2
    Hallo,<br>
    So müßte es eigentlich klappen:<br>
    <pre>
    procedure UpdateTextFile(fileName:string);
    var TS1,TS2:TStringStream; s:string;
    begin
    TS1:=TStringStream.Create('');
    TS1.LoadFromFile(fileName);
    s:=TS.DataString;
    pos1:=pos(#13#10,s);
    TS1.Position:=pos1+1;
    TS2:=TStringStream.Create('');
    TS2.CopyFrom(TS1,TS1.Size-pos1);
    TS2.SaveToFile(fileName);
    TS2.Free;
    TS1.Free;
    end;
    </pre>
    <br>
    Ich habe das jetzt nicht getestet, sondern direkt hier gecodet, bin mir aber ziemlich sicher, daß das funktioniert.<br>
    <br>
    Gruß<br>
    Patric

    Comment


    • #3
      Hallo Patrick,<br>
      danke schön für deinen Hilfeversuch, aber TStringStream hat keine methode LoadFromFile, wenn es keine Umstände mach, könntest du bitte nochmal nachschauen wie es denn gehn soll.<br><br>

      Danke dir

      Gruß<br><br>

      Tyrae

      Comment


      • #4
        Ich habe es bisher auf diese Art gelöst,...<br><br>

        var<br>
        s: String;<br>
        InF, OutF: Textfile;<br>
        begin <br>
        Assignfile(InF, InFile); <br>
        reset(InF); <br>
        AssignFile(OutF, OutFile);<br>
        rewrite(OutF, OutFile); <br>
        readline(InF, s); <br>
        while not EOF(InF) do <br>
        begin <br>
        readlne(InF, s);<br>
        writeln(OutF, s); <br>
        end; <br>
        CloseFile(InF);<br>
        CloseFile(OutF); <br>
        end; <br>

        <br><br>... aber ich würde gerne ohne eine zweite Datei benutzen zu müssen das von mir erwünschte Ergebnis erreichen.<br><br>Gibt es denn wirklich keine geschicktere Lösung?<br><br>

        Grüße<br>Tyrae

        Comment


        • #5
          Hallo Tyrael,<br>
          Stimmt, TStringStream hat keine Methode LoadFromFile; kann man aber sehr einfach umgehen, indem man den Code leicht modifiziert. Korrekt müßte er dann so aussehen
          <pre>
          procedure UpdateTextFile(fileName:string);
          var
          TS:TStringStream;
          TM:TMemoryStream;
          s:string;
          begin
          TS1:=TStringStream.Create('');
          TM:=TMemoryStream.Create;
          TM.LoadFromFile(fileName);
          TS1.CopyFrom(TM,0);
          TM.Free;
          s:=TS.DataString;
          pos1:=pos(#13#10,s);
          TS1.Position:=pos1+1;
          TM:=TMemoryStream.Create;
          TM.CopyFrom(TS1,TS1.Size-pos1);
          TM.SaveToFile(fileName);
          TM.Free;
          TS1.Free;
          end;
          </pre&gt

          Comment


          • #6
            Hallo Patrick,<br>
            danke,daß du noch mal nachgeschaut hast.<br>
            Der Weg, den du hier vorschlägst ist genau, was ich gesucht habe, . <br>
            In den Speciher einlesen und von dort aus schreiben ist viel eleganter als mit zwei Dateien zu hantieren finde ich. <br><br>
            Vielen Dank nochmal für deine Bemühungen<br>
            LG Tyrae

            Comment


            • #7
              Hi zusammen,

              bei mir funktioniert TStringList mit 4 MB großen Dateien problemlos...

              Joche

              Comment

              Working...
              X