Delphi TextFile讀取文本文件


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  p rivate
    { P rivate declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
//{$APPTYPE CONSOLE}

procedure TForm1.Button1Click(Sender: TObject);
var
  txt:TextFile;
  s:string;
  path:string;
begin
  path:=ExtractFilePath(Application.ExeName);
  AssignFile(txt,path+'\test.txt');
  //Writeln(path+'\test.txt');
  Reset(txt);   //讀打開文件,文件指針移到首
  Memo1.Clear;
  while not Eof(txt) do
  begin
    Readln(txt,s);
    Memo1.Lines.Add(s);
  end;
  CloseFile(txt);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  txt:TextFile;
  s:string;
  path:string;
begin
  path:=ExtractFilePath(Application.ExeName);
  Memo1.Clear;
  AssignFile(txt,path+'\test.txt');
  Append(txt);  //寫打開文件,指針到尾
  Writeln(txt,'這是豬悟能寫入的文本');  //寫入一行帶行結束標志
  CloseFile(txt);

end;

procedure TForm1.Button3Click(Sender: TObject);
var
  txt:TextFile;
  s,path:string;
begin
  path:=ExtractFilePath(Application.ExeName);
  Memo1.Clear;
  AssignFile(txt,path+'\test.txt');
  Reset(txt);

  Readln(txt,s);
  //Memo1.Lines.Add(IntToStr(FileSize(txt)));
  Memo1.Lines.Add(s);
  CloseFile(txt);
end;

end.

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM