2011-12-12 66 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,它們支持不同的編碼)。