2011-12-12 49 views
6

您好最近我用TFileStream替换TextFile。我从来没有使用它,所以我有一个小问题。如何操作TFileStream

  • 如何在我将它分配给变量后添加someting到我的文件?
  • 如何阅读该文件的某些形式?

我需要的文件,所以我在做类似的东西定义线形态:

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

然后当线两条,需要我只是

edit1.text = linia_klienta[1]; 

回答

13

如果你需要阅读文本文件并访问每一行,请尝试使用此类的TStringList类来加载文件,读取数据(使用索引访问每行)并将数据保存回来。

像这样

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; 
+0

这看起来不错...等待它。我可以创建新文件吗? –

+2

使用TStrings存储效率非常低。 – OnTheFly

+0

@Dudi,是的,只是摆脱'loadfromfile'行,然后添加新行。 – RRUZ

6

我新德尔福的版本,你可以使用TStreamReader/TStreamWriter这里是使用TStreamReader的例子......这仅仅是处理文本文件的

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

根据用你想要做的,它需要的流类。

你想处理文本(带有折线和结尾字符的字符)数据吗?

或者,你想使用二进制数据吗?

我看到你正在使用一个char数组,而不是一个字符串。 你真的想像使用二进制字符一样使用字符数据吗?有时,一些应用程序需要这种情况。

+0

快速解决这个问题我正在使用字符串数组。 我需要从文件创建新文件/加载,将新内容添加到文件。 –

+0

我也建议使用TStringList类来管理几行而不是普通数组。这里的问题是如何用文本/编辑/备忘录控件读取/写入所有这些行。以前的TStringList示例已经显示。 – umlcat

1

TStream及其直系后代大都是低级访问类。他们主要处理通用缓冲区。还有一些更专门化的类从一个流中下来或使用一个流来执行更高级别的任务。

由于Delphi 1的TReader和TWriter可以直接用于读写Delphi类型(包括字符串),但它们并不是用来处理“面向行的”文件的(不幸的是,它们被设计得太多了,介意,而不是作为通用框架)。

Turbo Power SysTools有一个不错的TStAnsiTextStream类,它以类似于TextFile的方式实现了对文本文件的面向行的访问。由于Delphi 2009新类(请参阅opc0de答案)实现相同类型的访问,而不需要第三方库(此外,由于Delphi 2009扩展代码页支持,包括Unicode,它们支持不同的编码)。