Frage Wie funktioniert es mit TFileStream?


Hallo vor kurzem ich ersetze TextFile mit TFileStream. Ich benutze es nie, also habe ich kleines Problem damit.

  • Wie kann ich etwas zu meiner Datei hinzufügen, nachdem ich sie der Variablen zugewiesen habe?
  • Wie kann ich diese Datei lesen?

Ich brauche eine definierte Zeilenform für diese Datei, also habe ich so etwas gemacht:

var linia_klienta:array[0..30] of string;
AssignFile(tempPlik,'klienci.txt');
Reset(tempPlik);
i:=0;
While Not Eof(tempPlik) do
  begin
    Readln(tempPlik,linia_klient[i]);
    inc(i);
  end;
CloseFile(tempPlik);

Dann, wenn die zweite Zeile benötigt wird, ich einfach

edit1.text = linia_klienta[1];

6
2017-12-12 15:54


Ursprung


Antworten:


Wenn Sie eine Textdatei lesen und auf jede Zeile zugreifen müssen, versuchen Sie stattdessen mit a TStringList Klasse mit dieser Klasse können Sie eine Datei laden, lesen Sie die Daten (Zugriff auf jede Zeile mit einem Index) und speichern Sie die Daten zurück.

etwas wie das

FText  : TStringList;
i : integer;
begin
 FText := TStringList.Create;
 try
  FText.LoadFromFile('C:\Foo\Foo.txt');

    //read the lines
    for i:=0 to FText.Count-1 do    
     ProcessLine(FText[i]);  //do something   

  //Add additional lines
  FText.Add('Adding a new line to the end');
  FText.Add('Adding a new line to the end');    

  //Save the data back
  FText.SaveToFile('C:\Foo\Foo.txt');

 finally
  FText.Free;
 end;

end;

end;

13
2017-12-12 16:04



I neuere Versionen von Delphi können Sie verwenden TStreamReader / TStreamWriter Hier ist ein Beispiel für die Verwendung von TStreamReader ... Dies ist nur für die Manipulation von Textdateien

var
  SR : TStreamReader;
  line : String;
begin
  SR := TStreamReader.Create('D:\test.txt');
  while not (SR.EndOfStream) do
  begin
    line := SR.ReadLine;
    ShowMessage(line);
  end;
  SR.Free;
 end;

6
2017-12-12 16:52



TStream und seine unmittelbaren Nachkommen sind meist Low-Level-Access-Klasse. Sie beschäftigen sich hauptsächlich mit generischen Puffern. Es gibt einige speziellere Klassen, die von einem Stream abstammen oder einen Stream verwenden, um Aufgaben auf höherer Ebene auszuführen.

Da Delphi 1 TReader und TWriter verwendet werden können, um Delphi-Typen direkt zu lesen und zu schreiben (einschließlich Strings), wurden sie jedoch nicht für "linienorientierte" Dateien entwickelt (unglücklicherweise wurden sie zu sehr mit Komponenteneigenschaften entworfen, nicht als ein Rahmen für allgemeine Zwecke).

Turbo Power SysTools hat eine nette TStAnsiTextStream-Klasse, die den zeilenorientierten Zugriff auf Textdateien ähnlich wie TextFile implementiert. Seit Delphi 2009 neue Klassen (siehe opc0de-Antwort) implementieren die gleiche Art von Zugriff ohne die Notwendigkeit von Bibliotheken von Drittanbietern (außerdem unterstützen sie verschiedene Codierungen dank Delphi 2009 erweitern Codepage-Unterstützung, einschließlich Unicode).


1
2017-12-12 19:59



Je nachdem, was Sie tun möchten, ist es die Stream-Klasse, die Sie benötigen.

Möchten Sie mit Textdaten (Zeichen mit Bruch- und Endzeilen) arbeiten?

ODER, möchten Sie mit binären Daten arbeiten?

Ich sehe, dass Sie stattdessen ein Array von Zeichen einer Zeichenfolge verwenden. Möchten Sie die Zeichendaten wirklich so verwenden, als wären sie binär? Manchmal erfordern einige Anwendungen diesen Fall.


0
2017-12-12 16:52