Autor Beitrag
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 28

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: So 18.12.05 17:17 
Hallo, ich wollte gerade einer Datei eine Zeile hinzufügen, mit diesem code gehts:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure SaveStringToFile(aStr, Filename: String);
var
  F: File;
begin
  aStr := #13#10 + aStr;
  AssignFile(F, Filename);
  Reset(F, 1);
  Seek(F, FileSize(F));
  BlockWrite(F, aStr[1], length(aStr));
  CloseFile(f);
end;

Nur möchte ich vorher prüfen, ob es nicht schon dort steht, dann soll nichts geschrieben werden, außerdem
soll auch nur eine neue zeile angelegt werden, wenn dies nicht schon der fall ist.

wenn die datei so aussieht:
ausblenden Quelltext
1:
2:
TEXT
                                                                               |

dann soll in die leere zeile geschrieben werden, wenn die datei so aussieht:
ausblenden Quelltext
1:
TEXT					

dann wird eine neue Zeile angefügt

Und wenn der zu schreibende String schon an dieser Stelle steht, dann soll eben nichts passieren.

(ne möglichkeit wäre, die leere zeile zu löschen, falls vorhanden, nur wie ?)

Ich möchte nicht gerne mit StringListen arbeiten, ich musste gerade notgedrungen eine einbauen, wodurch mein programm 2x so langsam wurde (ok die effizienz hat sich erhöht, aber das spielt kein röllchen). außerdem möchte ich nicht, dass das programm in massigem speicherbedarf ausartet.

was ich also generell brauche:

-Prüfen ob am ende ein #13#10 ist, dann kein #13#10 vor astr packen
-Prüfen, ob am ende schon astr steht, dann nichts schreiben

Danke schonmal ;)
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Mo 19.12.05 11:25 
Hallo,

Zuerst statt
ausblenden Delphi-Quelltext
1:
aStr := #13#10 + aStr;					

lieber
ausblenden Delphi-Quelltext
1:
aStr := aStr+#13#10;					

Damit es eine richtige Textdatei wird, die nicht mit einer Leerzeile beginnt, was sicher auch nicht Deine Absicht ist.

Wenn du schon so genau beschreibst was Du machen willst hast Du auch schon die Loesung.

Du brauchst einen Puffer (z.B.: array of char oder byte) fuer die Laenge des neuen Strings und ein bisschen Platz fuer Leerzeilen am Ende,( jetzt hoffe ich nicht, Du hast ?zig Leerzeilen )
PufferLaenge = len(astr)+ (2+?zig)*2{#13#10});
setlength(Puffer,PufferLaenge);
PufferLaenge Bytes vom Ende der Datei in den Puffer einlesen.
Jetzt rueckwaerts suchen .
wiederhole
..erst #13 suchen -> Pos13 = yy.
..dann #10 suchen -> Pos10 =xx.
bis yy-xx > 1 UND xx> 00
Falls die Laenge yy-xx = length(astr({ohne #13#10}) dann erst vergleichen
Um einen String daraus zu machen, habe ich aus der gefundenen #13 ein #0 gemacht.
Puffer[Pos13] := #00 oder Puffer[Pos13] := 00
also #13#10BlabLabLa#13#10
wird #13#10BlabLabLa#00#10
nun einen pCHar-Zeiger auf das Zeichen nach dem vorderen #10 hier 'B'
pString : pchar;
pstring := @Puffer[Pos10 +1];
und schon kannst Du mit strcomp einen Vergleich mit dem neuen astr machen

(gelesen - xx) gibt Dir die Anzahl der Bytes an , die Du jetzt deine Datei abschneiden musst. Mit
seek(F,fileSize(F)-(gelesen-xx));
trunc(F);
aStr := astr+#13+#10;
BlockWrite(F, aStr[1], length(aStr));
closefile(f);
ist es dann vollbracht.

Vielleicht funktioniert es :-)

Gruss Horst
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 28

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mo 19.12.05 14:18 
user profile iconHorst_H hat folgendes geschrieben:
Hallo,

Zuerst statt
ausblenden Delphi-Quelltext
1:
aStr := #13#10 + aStr;					

lieber
ausblenden Delphi-Quelltext
1:
aStr := aStr+#13#10;					

Damit es eine richtige Textdatei wird, die nicht mit einer Leerzeile beginnt, was sicher auch nicht Deine Absicht ist.

Wenn du schon so genau beschreibst was Du machen willst hast Du auch schon die Loesung.

Du brauchst einen Puffer (z.B.: array of char oder byte) fuer die Laenge des neuen Strings und ein bisschen Platz fuer Leerzeilen am Ende,( jetzt hoffe ich nicht, Du hast ?zig Leerzeilen )
PufferLaenge = len(astr)+ (2+?zig)*2{#13#10});
setlength(Puffer,PufferLaenge);
PufferLaenge Bytes vom Ende der Datei in den Puffer einlesen.
Jetzt rueckwaerts suchen .
wiederhole
..erst #13 suchen -> Pos13 = yy.
..dann #10 suchen -> Pos10 =xx.
bis yy-xx > 1 UND xx> 00
Falls die Laenge yy-xx = length(astr({ohne #13#10}) dann erst vergleichen
Um einen String daraus zu machen, habe ich aus der gefundenen #13 ein #0 gemacht.
Puffer[Pos13] := #00 oder Puffer[Pos13] := 00
also #13#10BlabLabLa#13#10
wird #13#10BlabLabLa#00#10
nun einen pCHar-Zeiger auf das Zeichen nach dem vorderen #10 hier 'B'
pString : pchar;
pstring := @Puffer[Pos10 +1];
und schon kannst Du mit strcomp einen Vergleich mit dem neuen astr machen

(gelesen - xx) gibt Dir die Anzahl der Bytes an , die Du jetzt deine Datei abschneiden musst. Mit
seek(F,fileSize(F)-(gelesen-xx));
trunc(F);
aStr := astr+#13+#10;
BlockWrite(F, aStr[1], length(aStr));
closefile(f);
ist es dann vollbracht.

Vielleicht funktioniert es :-)

Gruss Horst

in der datei steht schon zu 100% etwas drinnen, deshalb #13#10 + astr ;)
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Mo 19.12.05 14:20 
Hallo,

dann sollte die Datei auch auf #13#10 enden!

Gruss Horst
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 28

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mo 19.12.05 14:21 
tut sie aber nicht :wink:
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Mo 19.12.05 14:23 
Hallo,

funktioniert der Ansatz trotzdem?
Jetzt eben rueckwaerts das erste #13 finden.

Gruss Horst
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 28

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mo 19.12.05 14:25 
muss ich noch testen, aber ich glaube da nehm ich doch lieber ne stringlist, weil die dateien, die ich lese nicht alzu groß sind, und für meine zwecke ist das glaube ich sogar besser ;)