Błażej
Błażej

Reputation: 3635

How operate on TFileStream

Hello recently I replace TextFile with TFileStream. I never use it so I have small problem with it.

I need defined line form that file so I was doing something like that:

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);

Then when line two is needed I simply

edit1.text = linia_klienta[1];

Upvotes: 6

Views: 11641

Answers (4)

opc0de
opc0de

Reputation: 11767

I newer versions of Delphi you can use TStreamReader / TStreamWriter here is an example of using TStreamReader ... this is only for manipulating text files

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;

Upvotes: 6

user160694
user160694

Reputation:

TStream and its immediate descendants are mostly low-level access class. They mostly deal with generic buffers. There are some more specialized classes that descend from or use a stream to perform higher level tasks.

Since Delphi 1 TReader and TWriter could be used to read and write Delphi types directly (inlcuding strings), but they were not designed to handle "line-oriented" files (unluckily they were designed too much with component properties streaming in mind, not as a general purpose framework).

Turbo Power SysTools has a nice TStAnsiTextStream class that implements line-oriented access to text files in a way similar to that of TextFile. Since Delphi 2009 new classes (see opc0de answer) implement the same kind of access without the need of third party libraries (moreover they support different encodings thanks to Delphi 2009 extend codepage support, including Unicode).

Upvotes: 1

umlcat
umlcat

Reputation: 4143

Depending with what you want to do, its the stream class you need.

Do you want to work with text (characters with break-lines and end-of-line characters) data ?

OR, do you want to work with binary data ?

I see you are using an array of char, instead, of a string. Do you really want to use character data as if it was binary ? Sometimes, some applications require that case.

Upvotes: 0

RRUZ
RRUZ

Reputation: 136391

If you need to read a text file and access each line, try instead using a TStringList class with this class you can load a file, read the data (accesing each line using a index) and save the data back.

something like this

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;

Upvotes: 13

Related Questions