Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Auf den letzten char in einer Datei zugreifen (https://www.delphipraxis.net/203448-auf-den-letzten-char-einer-datei-zugreifen.html)

Dennis07 18. Feb 2020 10:58

AW: Auf den letzten char in einer Datei zugreifen
 
Zitat:

Zitat von kagi3624 (Beitrag 1457746)
Hallo, unfreiwilliger Delphi 6 User hier

Wieso das? Es gibt doch mittlerweile die Community Edition...

Zitat:

Zitat von kagi3624 (Beitrag 1457746)
wie kann ich auf den letzten Char in der Textdatei zugreifen um den eventuell zu löschen? Hintergrund: Ich schreibe in eine CSV Einträge und möchte das letzte Komma einfach löschen, ohne dass es in den EOF zugreift oder mir sonstwie um die Ohren fliegt.

Entweder über eine TStringList, oder über einen TFileStream, oder über die (veralteten) TextFile-Routinen.

himitsu 18. Feb 2020 11:08

AW: Auf den letzten char in einer Datei zugreifen
 
Bei der StringListe aufpassen, dass es nicht knallt, sollte die Datei leer sein und einfach so ohne Prüfung auf Count-1 zugegriffen werden,
bzw. das letzte Char, wenn es nichts in der Zeile gibt.

PS: TStringList hängt beim Speichern einen Zeilenumbruch hinter jede Zeile, selbst wenn es beim Einlesen hinter der letzten Zeile keinen Zeilenumbruch gab.


CreateFile, SetFilePointer, ReadFile, MSDN-Library durchsuchenSetEndOfFile, CloseHandle
oder
Delphi-Quellcode:
S := TFileStream.Create(...);
//S.Position := S.Size - 1;
//if AnsiChar(S.Read(..., 1)) = ',' then
S.Size := S.Size - 1;
S.Free;
CreateFile/TFileStream knallt nichts, außer du willst es.
Ein Read/SetPosition hinter das Ende wird auf das Ende zurückgesetzt, bzw. stoppt dort.
Einige Read-Methoden (die ohne Result), werfen eine Exception, wenn sie nicht genug lesen/schreiben konnten und die mit Result sagen dir wieviel sie wirklich gemacht hatten (wenn du nicht vergisst die Results auszuwerten).
Read/Write vs. ReadBuffer/WriteBuffer

kagi3624 18. Feb 2020 12:35

AW: Auf den letzten char in einer Datei zugreifen
 
Zitat:

Zitat von Moombas (Beitrag 1457755)
Zitat:

Zitat von Luckie (Beitrag 1457753)
@Moombas: Und warum nicht Delete?

War mir jetzt zu einfach ^^ ... klar kann man auch

Delphi-Quellcode:
Delete(sl.Strings[Liste.Count-1], length(sl.Strings[Liste.Count-1]) - 1, 1);

nehmen^^

Was ist denn 'Liste.count'..wo kommt das her?

Bbommel 18. Feb 2020 12:49

AW: Auf den letzten char in einer Datei zugreifen
 
Zitat:

Was ist denn 'Liste.count'..wo kommt das her?
Das soll wohl
Delphi-Quellcode:
sl.Count
heißen. Also die Anzahl der Elemente (=Anzahl der Zeilen) in der Stringliste sl. Die Anweisung soll in der letzten Zeile das letzte Zeichen löschen.


Zitat:

Delphi (6?) behandelt ja auch nicht initialisierte Objekte als schon vorhandene Objekte und reicht die dann auch feucht fröhlich an andere Funktionen usw weiter.
Ist zwar etwas von der eigentlichen Frage weg, aber dennoch kurz der Hiwneis, damit aus deinem Frust nicht komplette Abneigung wird: eigentlich gibt es bei Delphi Compiler-Warnungen, wenn du auf Variablen (Objekte oder sonst etwas) lesend zugreifst, bevor sie initailisiert wurden. Wenn das nicht der Fall ist, dann ist ggf. im Code noch etwas anderes nicht in Ordnung oder die Warnungen sind ausgeschaltet. Kannst ja bei Interesse mal einen neuen Thread zu dem Thema aufmachen, wenn du Hilfe brauchst herauszufinden, warum es keine Warnung gab.

Moombas 18. Feb 2020 12:58

AW: Auf den letzten char in einer Datei zugreifen
 
Sorry, Bbommel hat recht, das war ein Copy/Paste Fehler.

So wäre es richtig bzw. Luckie hat ja auch schon die Anwendung von Delete gepostet.
Delphi-Quellcode:
Delete(sl.Strings[sl.Count-1], length(sl.Strings[sl.Count-1]) - 1, 1);

kagi3624 18. Feb 2020 13:05

AW: Auf den letzten char in einer Datei zugreifen
 
Zitat:

Zitat von Moombas (Beitrag 1457786)
Sorry, Bbommel hat recht, das war ein Copy/Paste Fehler.

So wäre es richtig bzw. Luckie hat ja auch schon die Anwendung von Delete gepostet.
Delphi-Quellcode:
Delete(sl.Strings[sl.Count-1], length(sl.Strings[sl.Count-1]) - 1, 1);

Ich bekomme aber folgenden Fehler bei dieser Zeile...

Delphi-Quellcode:
[Fehler] FRMMAIN.pas(3782): Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden

Luckie 18. Feb 2020 13:24

AW: Auf den letzten char in einer Datei zugreifen
 
Delphi-Quellcode:
var
  sl: TStringList;
  s: String;
Beginn
  // ...;
  s := sl.Text;
  Delete(s, 0, length(s)-1);
  sl.Text := s;
  sl.SaveToFile;

DasWolf 18. Feb 2020 13:27

AW: Auf den letzten char in einer Datei zugreifen
 
Zitat:

Zitat von kagi3624 (Beitrag 1457788)
Zitat:

Zitat von Moombas (Beitrag 1457786)
Sorry, Bbommel hat recht, das war ein Copy/Paste Fehler.

So wäre es richtig bzw. Luckie hat ja auch schon die Anwendung von Delete gepostet.
Delphi-Quellcode:
Delete(sl.Strings[sl.Count-1], length(sl.Strings[sl.Count-1]) - 1, 1);

Ich bekomme aber folgenden Fehler bei dieser Zeile...

Delphi-Quellcode:
[Fehler] FRMMAIN.pas(3782): Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden

Einfach den Zwischenschritt über eine Variable gehen.

Delphi-Quellcode:
var
  s: string;
begin
  s := sl.Strings[sl.Count-1];
  s := Trim(s);
  Delete(s, length(s), 1);
  sl.Strings[sl.Count-1] := s;
end;

Luckie 18. Feb 2020 13:39

AW: Auf den letzten char in einer Datei zugreifen
 
Das trim ist eine gute Idee.

kagi3624 18. Feb 2020 13:54

AW: Auf den letzten char in einer Datei zugreifen
 
Habe das jetzt über TFileStream gelöst. Ich kann meinen Kopf nicht über die Tatsache wickeln warum bei dem String der Index mit 1 und nicht 0, so wie sonst, anfängt.

Code:
procedure exportToCSV(Eintrag : string);
var
  strm : TFileStream;
  n : longint;
begin
  strm := TFileStream.Create('file.csv',fmCreate);
  n := Length(Eintrag);
  try
    strm.Position := 0;
    strm.Write(Eintrag[1], n);
    strm.Size := strm.Size - 1;
  finally
    strm.Free();
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 Uhr.
Seite 2 von 4     12 34      

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-2025 by Thomas Breitkreuz