在進(jìn)行win32開(kāi)發(fā)中對(duì)文件的讀寫(xiě)是最常用的操作之一,這編文章西西小編和大家一起來(lái)學(xué)習(xí)一下在Delphi中如何讀寫(xiě)文件的方法。
Delphi 支持三種文件類(lèi)型: 文本文件、記錄文件、無(wú)類(lèi)型文件。
文本文件的讀寫(xiě):
文本文件 是以行為單位進(jìn)行讀、寫(xiě)的。由于每一行的長(zhǎng)度不一定相同,不能計(jì)算出給定行在文件中的確切位置,因而只能順序地讀寫(xiě)。
文本文件只能單獨(dú)為讀或?qū)懚蜷_(kāi),在一個(gè)打開(kāi)的文本文件上同時(shí)進(jìn)行讀、寫(xiě)操作是不允許的。
文本文件 的打開(kāi)需要兩個(gè)步驟:1.文件變量與文件名關(guān)聯(lián);2.初始化讀寫(xiě)。
1.文件變量與文件名關(guān)聯(lián):
AssignFile(VarTxt, FileName);
FileName 如果省略路徑將默認(rèn)當(dāng)前目錄。
2.初始化讀寫(xiě)有三種方式:
(1) Reset: 只讀打開(kāi), 指針移到文件頭;
(2) Rewrite: 創(chuàng)建新文件并打開(kāi), 只寫(xiě);
(3) Append: 從尾部追加, 指針當(dāng)然在文件尾。
文件不存在時(shí)使用 Reset 或 Append 會(huì)引發(fā)一個(gè)I/O異常。
最后用 CloseFile 關(guān)閉文件。
為保持兼容,Delphi 也允許用戶(hù)用 Assign 建立關(guān)聯(lián), 用 Close 關(guān)閉文件。
第一種、直接用 memo 加載 txt文件
1. memo控件讀取txt
memo1.Lines.LoadFromFile('E:\*\*.txt');
要讀取一個(gè)txt文件的全部?jī)?nèi)容可以借用到 stringlist 來(lái)中轉(zhuǎn)。
建立一個(gè)stringlist,如:
var
sList: TStringlist;
begin
sList := TStringList.Create;
try
sList.LoadFromFile('C:\a.txt');
finally
sList.Free;
end;
end;
然后可以將TStringList 轉(zhuǎn)換為 string類(lèi)型 str=ts.GetText ; 來(lái)轉(zhuǎn)換
第二種、Delph內(nèi)建的函數(shù)讀寫(xiě)
示例代碼:
var
F: Text; //TextFile 和 Text 是一樣的
FileName: string = 'c:\temp\test.txt';
//寫(xiě)文件
procedure TForm1.Button1Click(Sender: TObject);
begin
AssignFile(F,FileName);
Rewrite(F); //會(huì)覆蓋已存在的文件
Writeln(F, '第一行');
Writeln(F, '第二行');
CloseFile(F);
end;
//讀文件(先執(zhí)行寫(xiě)文件)
procedure TForm1.Button2Click(Sender: TObject);
var
s: string;
begin
AssignFile(F,FileName);
Reset(F); //只讀打開(kāi)
Readln(F, s); //讀取
ShowMessage(s); //顯示: 第一行
Readln(F, s); //繼續(xù)讀取
ShowMessage(s); //顯示: 第二行
CloseFile(F);
end;
//追加
procedure TForm1.Button3Click(Sender: TObject);
begin
AssignFile(F,FileName);
Append(F); //打開(kāi)準(zhǔn)備追加
Writeln(F, '第三行');
Writeln(F, '第四行');
CloseFile(F);
end;
//讀取全部(需要Memo幫忙顯示)
procedure TForm1.Button4Click(Sender: TObject);
var
s: string;
begin
AssignFile(F,FileName);
Reset(F); //只讀打開(kāi)
Memo1.Clear;
while not Eof(F) do
begin
Readln(F, s);
Memo1.Lines.Add(s);
end;
CloseFile(F);
end;
第三種、Delphi 用流來(lái)讀取TXT文件
TXT文本文件是一種以ACSII嗎存儲(chǔ)數(shù)據(jù)的文件。在TXT文件中只能夠存儲(chǔ)一些字符數(shù)據(jù),所以這種文件的移植性和通用性很強(qiáng),具有較高的易用性,并且 被廣泛應(yīng)用,所以Delphi對(duì)該類(lèi)型文件提供了較好的支持。目前在Internet上最為流行的XML文件也是一種文本文件。TXT文本文件的操作非常 簡(jiǎn)單,具體操作過(guò)程如下:
1.首先要聲明一個(gè)TextFile類(lèi)型的的文件指針。如:var MyFile:TEXTFile。
2.然后使用AssignFile方法將聲明的文件指針與外部TXT文件相關(guān)聯(lián)。AssignFile (FileName ) ;FileName 既可以是全路徑名,也可以?xún)H是文件名。對(duì)于后者系統(tǒng)將在當(dāng)前目錄下查找。
3.初始化讀寫(xiě)有三種方式: Reset為讀打開(kāi)文件并把文件指針移動(dòng)到文件首;Rewrite為寫(xiě)創(chuàng)建一個(gè)新文件;Append為寫(xiě)打開(kāi)存在的文件并把文件指針定位在文件尾。
4.讀取或?qū)懭胛谋。Readln方法能夠讀取一行文本,writeln方法能向文件寫(xiě)入一行文本。
5.最后用Closefile方法關(guān)閉已打開(kāi)的文件。
在這里我們要介紹的就是如何用流來(lái)讀取TXT文件中的數(shù)據(jù),并且在指定顯示區(qū)域顯示出來(lái)。首先讓我們通過(guò)一個(gè)簡(jiǎn)單范例來(lái)了解ReadBuffer方法,讓我們來(lái)讀取指定TXT文件的前10個(gè)字符。
procedure TForm1.Button1Click(Sender: TObject);
var
MyFile:TMemoryStream;
Filebuf: array[1..10] of char; //這里聲明的是靜態(tài)數(shù)組
a:string;
Begin
If opendialog1.Execute then
begin
MyFile:=TMemoryStream.Create;//創(chuàng)建流
MyFile.LoadFromFile(opendialog1.FileName);
MyFile.ReadBuffer(Filebuf,10);//讀取TXT文件前10個(gè)字符
a:= strpas(Filebuf) //將數(shù)組轉(zhuǎn)化成為字符串
Form1.canvas.Textout(0,0,a); //在顯示區(qū)域上顯示字符串
FreeAndNil(MyFile);//釋放流
end;
end;
以上范例在窗體Form1上顯示的字符串就是打開(kāi)TXT文本的前10個(gè)字符,但是如何得到文本的所有數(shù)據(jù)呢?這里就需要用到動(dòng)態(tài)數(shù)組。動(dòng)態(tài)數(shù)組在流中 的應(yīng)用是個(gè)難點(diǎn),因?yàn)镈elphi中的靜態(tài)數(shù)組是在運(yùn)行前就已經(jīng)將內(nèi)存空間分配好,所以它的變量地址就是數(shù)組的第一維地址,即沒(méi)有描述部份,故它的 sizeof為1個(gè)字節(jié),而動(dòng)態(tài)數(shù)組是在運(yùn)行期間動(dòng)態(tài)分配一個(gè)內(nèi)存塊,所以它的變量地址部分需要一個(gè)描述部分,故它的sizeof為四個(gè)字節(jié),用于存放描 述表,所以在用 Readbuffer方法時(shí),需要采用數(shù)組的第一維地址為起始地址,才不會(huì)導(dǎo)致內(nèi)存溢出。下面這個(gè)范例就是用流來(lái)讀取TXT文件中的全部數(shù)據(jù)。
procedure TForm1.Button1Click(Sender: TObject);
var
MyFile:TMemoryStream;
Filebuf: array of pchar; //這里聲明的是動(dòng)態(tài)數(shù)組
iLen:Int64;
Begin
If opendialog1.Execute then
begin
iLen:=0;
MyFile:=TMemoryStream.Create;
MyFile.LoadFromFile(opendialog1.FileName);
iLen:=MyFile.Size;//獲得指定TXT文件的大小
SetLength(FileBuf,iLen);//設(shè)置動(dòng)態(tài)數(shù)組的長(zhǎng)度為T(mén)XT文件的大小
MyFile.ReadBuffer(FileBuf[0],iLen);//讀取TXT文件全部數(shù)據(jù)
Form1.canvas.Textout(0,0,string(FileBuf)); //在顯示區(qū)域上顯示字符串;
FreeAndNil(MyFile);
end;
end;
以上的范例可在窗體Form1上顯示指定TXT文件的全部數(shù)據(jù)。
現(xiàn)在讓我們來(lái)研究一下如何從TXT文本中的指定位置讀取一定量的數(shù)據(jù),這里用到的函數(shù)就是seek(offset:integer,origin:word)integer; 它的參數(shù)所代表的意義: offset是偏移量;
而origin是計(jì)算方式 ,下面三個(gè)就是origin的值,soFromBeginning是從文件頭開(kāi)始計(jì)算,soFromCurrent是從當(dāng)前位置開(kāi)始計(jì)算,而soFromEnd Offset是從最后位置開(kāi)始計(jì)算。
下面這個(gè)范例就是從TXT文本中的指定位置取一定量的數(shù)據(jù)
procedure TForm1.Button1Click(Sender: TObject);
var
MyFile:TMemoryStream;
Filebuf: array of pchar; //這里聲明的是動(dòng)態(tài)數(shù)組
iLen:Int64;
Begin
If opendialog1.Execute then
begin
iLen:=0;
MyFile:=TMemoryStream.Create;
MyFile.LoadFromFile(opendialog1.FileName);
iLen:=MyFile.Size;
SetLength(FileBuf,1024);//設(shè)置動(dòng)態(tài)數(shù)組的長(zhǎng)度;
Myfile.Seek(1024, soFromBeginning);//從文件頭開(kāi)始計(jì)算到1024個(gè)字節(jié)處
MyFile.ReadBuffer(FileBuf[0],1024);//從seek設(shè)置的當(dāng)前位置往后讀取1024字節(jié)
Form1.canvas.Textout(0,0,string(FileBuf)); //在窗體上顯示;
FreeAndNil(MyFile);
end;
end