Delphi程式設計:用流來讀取TXT檔案中的資料

terryisme發表於2009-05-10
TXT文字檔案是一種以ACSII嗎儲存資料的檔案。在TXT檔案中只能夠儲存一些字元資料,所以這種檔案的移植性和通用性很強,較高的易用性,並且被廣泛應用,所以Delphi對該型別檔案提供了較好的支援。在Internet上最為的XML檔案也是一種文字檔案。TXT文字檔案的操作非常,具體操作過程如下:

  1.首先要宣告一個TextFile型別的的檔案指標。如:var MyFile:TEXTFile。

  2.然後使用AssignFile方法將宣告的檔案指標與外部TXT檔案相關聯。AssignFile (FileName ) ;FileName 既可以是全路徑名,也可以僅是檔名。對於後者系統將在當前目錄下查詢。

  3.初始化讀寫有三種方式: Reset為讀開啟檔案並把檔案指標移動到檔案首;Rewrite為寫建立一個新檔案;Append為寫開啟存在的檔案並把檔案指標定位在檔案尾。

  4.讀取或寫入文字。Readln方法能夠讀取一行文字,writeln方法能向檔案寫入一行文字。

  5.最後用Closefile方法關閉已開啟的檔案。

  在這裡我們要介紹的就是如何用流來讀取TXT檔案中的資料,並且在指定顯示區域顯示出來。首先讓我們透過一個簡單範例來了解ReadBuffer方法,讓我們來讀取指定TXT檔案的前10個字元。

   procedure TForm1.Button1Click(Sender: TObject);

   var

   MyFile:TMemoryStream;

   Filebuf: array[1..10] of char; //這裡宣告的是靜態陣列

   a:string;

  Begin

   If opendialog1.Execute then

   begin

   MyFile:=TMemoryStream.Create;//建立流

   MyFile.LoadFromFile(opendialog1.FileName);

   MyFile.ReadBuffer(Filebuf,10);//讀取TXT檔案前10個字元

   a:= strpas(Filebuf) //將陣列轉化字串

   Form1.canvas.Textout(0,0,a); //在顯示區域上顯示字串

   FreeAndNil(MyFile);//釋放流

   end;

  end;

   以上範例在窗體Form1上顯示的字串就是開啟TXT文字的前10個字元,但是如何得到文字的所有資料呢?這裡就需要用到動態陣列。動態陣列在流中的 應用是個難點,因為Delphi中的靜態陣列是在執行前就已經將記憶體空間分配好,所以它的變數地址就是陣列的第一維地址,即沒有描述部份,故它的 sizeof為1個位元組,而動態陣列是在執行期間動態分配一個記憶體塊,所以它的變數地址部分需要一個描述部分,故它的sizeof為四個位元組,用於存放描 述表,所以在用 Readbuffer方法時,需要採用陣列的第一維地址為起始地址,才不會導致記憶體溢位。下面這個範例就是用流來讀取TXT檔案中的全部 資料。

  procedure TForm1.Button1Click(Sender: TObject);

   var

   MyFile:TMemoryStream;

   Filebuf: array of pchar; //這裡宣告的是動態陣列

   iLen:Int64;

  Begin

   If opendialog1.Execute then

   begin

   iLen:=0;

   MyFile:=TMemoryStream.Create;

   MyFile.LoadFromFile(opendialog1.FileName);

   iLen:=MyFile.Size;//獲得指定TXT檔案的大小

   SetLength(FileBuf,iLen);//設定動態陣列的長度為TXT檔案的大小

   MyFile.ReadBuffer(FileBuf[0],iLen);//讀取TXT檔案全部資料

   Form1.canvas.Textout(0,0,string(FileBuf)); //在顯示區域上顯示字串;

   FreeAndNil(MyFile);

   end;

  end;

  以上的範例可在窗體Form1上顯示指定TXT檔案的全部資料。

  現在讓我們來研究一下如何從TXT文字中的指定位置讀取一定量的資料,這裡用到的函式就是seek(offset:integer,origin:word)integer; 它的引數所代表的意義: offset是偏移量;

  而origin是計算方式 ,下面三個就是origin的值,soFromBeginning是從檔案頭開始計算,soFromCurrent是從當前位置開始計算,而soFromEnd Offset是從最後位置開始計算。

  下面這個範例就是從TXT文字中的指定位置取一定量的資料

   procedure TForm1.Button1Click(Sender: TObject);

   var

   MyFile:TMemoryStream;

   Filebuf: array of pchar; //這裡宣告的是動態陣列

   iLen:Int64;

  Begin

   If opendialog1.Execute then

   begin

   iLen:=0;

   MyFile:=TMemoryStream.Create;

   MyFile.LoadFromFile(opendialog1.FileName);

   iLen:=MyFile.Size;

  SetLength(FileBuf,1024);//設定動態陣列的長度;

  Myfile.Seek(1024, soFromBeginning);//從檔案頭開始計算到1024個位元組處

   MyFile.ReadBuffer(FileBuf[0],1024);//從seek設定的當前位置往後讀取1024位元組

   Form1.canvas.Textout(0,0,string(FileBuf)); //在窗體上顯示;

   FreeAndNil(MyFile);

   end;

  end;[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/93029/viewspace-1021922/,如需轉載,請註明出處,否則將追究法律責任。

相關文章