Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi In TextFile eine Zeile ändern (https://www.delphipraxis.net/78334-textfile-eine-zeile-aendern.html)

kenuvis 3. Okt 2006 14:11


In TextFile eine Zeile ändern
 
Hallo,

ich habe ein TextFile dass so anfängt:
  • ;; TT File generated by YAWE Server.
    ;;
    IENTRYCOUNT = 1
    ;; Please do not remove the line above, it's for speed up purposes.
    ;; Removing it won't break DB loading, but it will slow it down.

und halt dann ewig weitergeht.

ich möchte jetzt die Zahl da hochzählen können und in die Datei schreiben.

Finden der Zeile und so mach ich wie folgt:

Delphi-Quellcode:
Assignfile(F, ExtractFilePath(Application.ExeName)+'saves\accounts.tt');
  Reset(F);
  Repeat
        ReadLn(F, temp);
  until pos('IENTRYCOUNT',temp) <> 0;
  IEntrycount := StrToInt(copy(temp,pos('=',temp)+1,length(temp)));
  closeFile(F);
(eigendlich sinnlos, dass ich das hier poste)

hoffentlich kann mir da einer helfen.

mfg kenu

Christian Seehase 3. Okt 2006 14:26

Re: In TextFile eine Zeile ändern
 
Moin Kenu,

Du kannst doch, parallel zum Lesen der eigentlichen Datei, noch eine neue, temporäre erzeugen, und einfach die Zeilen, die unverändert bleiben sollen wieder dorthin wegschreiben.
Die eine zu verändernde Zeile änderst Du hierbei entsprechend.
Ist der Inhalt umkopiert, löscht Du die Quelldatei, und benennst die Zieldatei auf den Namen der Quelldatei um.

Wenn das nur gelegentlich passiert, könntest Du die Datei auch einfach in eine TStringList laden, diese durchgehen, bis Du die gewünschte Zeile gefunden hast. Dann die Zeile ändern, und die Datei wieder wegschreiben.

kenuvis 3. Okt 2006 14:30

Re: In TextFile eine Zeile ändern
 
ja..... das mit so einer 2. datei hab ich bis jetzt auch immer gemacht.... find das aber nun nicht so schön. zumal die jetztige datei auch mal locker so mehrere mb groß werden kann.
ich dachte mir, da gibts irgendeine andere lösung.

_frank_ 3. Okt 2006 14:58

Re: In TextFile eine Zeile ändern
 
ich denke mal, mit einer TStringlist lässt sich das vorhaben leichter bewerkstelligen.

Pseudocode:

Delphi-Quellcode:
loadfromfile
for i:=0 to sl.count-1 do
  if isTheLine(sl.strings[i]) then
    sl.strings[i]:=...
sl.savetofile
HTH Frank

marabu 3. Okt 2006 16:10

Re: In TextFile eine Zeile ändern
 
Hallo kenu,

wenn du sicherstellen kannst, dass die fragliche Zahl immer den gleichen offset im file hat, dann kannst du die Zahl mit blanks auf eine definierte Länge bringen und den Zähler inplace patchen:

Delphi-Quellcode:
function IncCounter(fn: TFileName; dwOffset, dwLength: Cardinal): Cardinal;
var
  value: String;
begin
  with TFileStream.Create(fn, fmOpenReadWrite or fmShareDenyWrite) do
  begin
    Position := dwOffset;
    SetLength(value, dwLength);
    ReadBuffer(value[1], dwLength);
    Result := StrToIntDef(Trim(value), 0) + 1;
    value := IntToStr(Result);
    Position := dwOffset;
    WriteBuffer(value[1], dwLength);
    Free;
  end;
end;
Getippt und nicht getestet.

Grüße vom marabu

kenuvis 3. Okt 2006 16:47

Re: In TextFile eine Zeile ändern
 
kannst du das bitte für einem voll-delphi-idioten nochmals übersetzten. habe von deinem satz nicht viel verstanden.

marabu 3. Okt 2006 20:39

Re: In TextFile eine Zeile ändern
 
Hallo kenu,

nach deinem Beispiel im Beitrag #1 steht die Zahl (1) an der Stelle 56 (offset 55) - wenn ich mich nicht verzählt habe. Offset gibt an, wieviel Zeichen übersprungen werden sollen. Wenn du also den Wert hochzählen willst, dann kannst du das mit einer Routine machen, wie ich dir eine gegeben habe. Als dwOffset übergibst du dann 55 und als dwLength 1. Damit kannst du aber nur bis 9 hochzählen. Willst du mehr, dann musst du meine Routine geringfügig abändern oder nochmal nachfragen. Hast du denn schon versucht den Code zu verstehen?

Grüße, marabu

kenuvis 3. Okt 2006 22:01

Re: In TextFile eine Zeile ändern
 
ja... versucht schon.. ich konnte aber mit dem begriff offset nichts anfangen. dank dir.... ich weiß aber leider nicht, wo die zahl nun steht, kann variieren.
taj.. dann muss ich das wohl mit dem 2 datein machen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz