Delphi中默認(rèn)有input和output兩個(gè)文件變量,使用可以不用定義,直接使用. 但: input:只讀、output:只寫。用時(shí)注意以免引起異常.
文件是由文件名標(biāo)識(shí)的一組數(shù)據(jù)的集合,文件通常存放在磁盤上。源程序、學(xué)生檔案記錄、圖形、音樂等均可以作為文件存儲(chǔ)在磁盤上。操作系統(tǒng)是以文件為單位對(duì)數(shù)據(jù)進(jìn)行管理的,也就是說,如果想讀取外存介質(zhì)上的數(shù)據(jù),必須先按文件名找到所指定的文件,然后再從該文件中讀取數(shù)據(jù)。要向外存介質(zhì)上存儲(chǔ)數(shù)據(jù),也必須先建立一個(gè)文件(以文件名標(biāo)識(shí)),才能向它輸出數(shù)據(jù)。 在程序運(yùn)行時(shí),常常需要將一些數(shù)據(jù)(運(yùn)行的最終結(jié)果或中間數(shù)據(jù))輸出到磁盤上,以后需要時(shí)再從磁盤中輸入到計(jì)算機(jī)內(nèi)存。這就要用到磁盤文件。 1.文件類型 file是一個(gè)文件類型說明符,通過file可以定義文件變量,也可以定義一些新的類型。在Delphi中支持下面3種類型的文件:即文本文件、類型文件和無類型文件(也稱二進(jìn)制文件)。下面依次介紹3種文件類型變量的定義及使用方法。 Delphi程序設(shè)計(jì)中,對(duì)任何一種文件的操作都可以歸納為:建立_打開_讀/寫_關(guān)閉。 2. 文本文件 (**** 轉(zhuǎn)載敬請(qǐng)注明-本文出處:南山古桃(nsgtao)的百度空間:http://hi.baidu.com/nsgtao/ ****) 2.1 文本文件的概念
在Delphi中定義了TextFile類型表示文本文件,由字符的ASCII碼組成,最小存取單位為字符。文本文件也稱為ASCII碼文件。利用常見的文字編輯器可以瀏覽支件內(nèi)容。 文本文件是以行為單位進(jìn)行讀、寫操作的。由于每一行長(zhǎng)度不一定相同,不能計(jì)算出給定行在文件中的確切位置,因而只能順序地讀寫。在一個(gè)打開的文本文件上同時(shí)進(jìn)行讀、寫操作是不允許的。
2.2 文本文件變量的定義 定義文件變量的語法格式如下: var <文件變量名>:TextFile; 例如,Var myTextFile : TextFile;就定義了一個(gè)文本文件變量myTextFile,下面就可以通過此變量引用一個(gè)文本文件。
2.3 文本文件的使用
(1)文件變量與文件關(guān)聯(lián) 在使用文件變量進(jìn)行文件操作之前,需要將文件變量與要操作的文件關(guān)聯(lián),即給文件變量名賦值。文件變量賦值可以使用過程AssignFile,過程的說明語法格式如下: procedure AssignFile(Var F;FileName:string); 其中,F(xiàn)為文件變量名,定義為無類型參數(shù)是為了和所有文件類型兼容;FileName是文件名字符串,是包括路徑的文件全稱名。例如,AssignFile (F,'e:\delphi\program\extl.txt’);就將文件變量F和指定的文件e:\delphi\program\extl.txt關(guān)聯(lián)起來。后面所有對(duì)變量f的操作都是對(duì)指定文件的操作。
(2)使用文件變量打開文件 使用不同的過程打開文件,有3種方式: procedure Rewrite(var F~File[;recsize:word]); 這個(gè)過程創(chuàng)建并打開文件,可以對(duì)文件進(jìn)行寫。這里的F是一個(gè)已經(jīng)和指定文件名關(guān)聯(lián)的文件變量。對(duì)于一個(gè)已存在的文件,此操作將覆蓋原文件;如果文件不存在,將建立一個(gè)新的空文件。若是類型文件(下一小節(jié)介紹),可用recsize指定大小?!?br>procedure Reset(var F:File[;RecSize:Word]); 使用Reset過程以讀的方式打開一個(gè)文件,此時(shí)只能從文件中讀取數(shù)據(jù)。f為文件變量,打開文件后,文件指針指向文件開頭。如果試圖用reset過程打開一個(gè)不存在的文件時(shí),將有I/O錯(cuò)誤產(chǎn)生。 procedure.Append(var F:’Fext); 使用Append過程向已存在的文件追加文本,這個(gè)過程僅用于文本文件。當(dāng)用append過程打開文件時(shí),文件指針指向文件的尾部,此后輸入的數(shù)據(jù)將添加在文件原有數(shù)據(jù)的后面。該過程打開的文件(即F關(guān)聯(lián)的文件)必須存在,否則也將出現(xiàn)I/O錯(cuò)誤。 (3)讀/寫文件 ①讀取文件內(nèi)容。在以讀的方式打開文件后,可以使用read和readln語句來讀取文件內(nèi)容,其聲明代碼格式分別為: procedure read([var F:’Fext;]V1[,V2,…,Vn]); procedure readln([var F:’text;]v1[,V2,···,Vn]); 其中,F(xiàn)為文件變量。v1、v2、…、vn等為需要輸入的變量,其類型可以為字符串、字符、整數(shù)和實(shí)數(shù)類型。read和readln的區(qū)別為后者在讀取數(shù)據(jù)后,將文件指針移至下一行,上次讀取的數(shù)據(jù)與回車符之間的數(shù)據(jù)被忽略。 當(dāng)讀取字符串時(shí),必須用readln過程,否則讀完一行數(shù)據(jù)后,再使用read讀取字符串將得到空串。當(dāng)讀取整型和實(shí)型數(shù)據(jù)時(shí),文件中的數(shù)據(jù)用空格分隔,且必須符合數(shù)據(jù)格式,否則將產(chǎn)生I/O錯(cuò)誤。 在讀取文件時(shí),還必須判斷文件指針是否已到文件尾部,此時(shí)可以用Eof函數(shù)進(jìn)行判斷,其聲明代碼如下: function Eof[(‘var F:’rext)]:Boolean; 當(dāng)文件指針指到尾部時(shí),該函數(shù)返回值為true。 ②向文件寫入數(shù)據(jù)。以寫的方式打開文件后,即可向其中寫入數(shù)據(jù),寫人數(shù)據(jù)使用write和writeln過程,其聲明代碼如下: procedure writeln([var F:’rext;]p 1[,p2,…,pn]); procedure write([var F:‘rext;]p 1[,p2,‘·‘,pn]); 與read相似,p 1、p2、…、pn等為需要輸出的變量,可以是字符串、字符、整數(shù)和實(shí)數(shù)類型。一writeln在寫入數(shù)據(jù)后還會(huì)附加上回車和換行符,而下次要寫入的數(shù)據(jù)將寫在新的一行。 寫人數(shù)據(jù)時(shí)系統(tǒng)自動(dòng)將數(shù)據(jù)轉(zhuǎn)化為字符串形式,1)~ASCII碼的形式保存在文件中。
(4)使用文件變量關(guān)閉文件 無論是輸入或輸出,在對(duì)文件操作完成后,都應(yīng)關(guān)閉文件。關(guān)閉文件使用CloseFile過程,其聲明代碼如下: procedure CloseFile(var F); 關(guān)閉文件后,系統(tǒng)釋放打開文件時(shí)使用的資源。特別是寫文件時(shí),在調(diào)用write和writeln過程時(shí),數(shù)據(jù)先寫入內(nèi)存緩沖區(qū),只有在緩沖區(qū)滿或關(guān)閉文件時(shí),才把數(shù)據(jù)真正寫入磁盤文件中,因此寫完數(shù)據(jù)后不關(guān)閉文件可能丟失數(shù)據(jù)。 例2.15 使用Rewrite()過程在程序運(yùn)行的當(dāng)前目錄下創(chuàng)建一個(gè)文本文件file.txt,并向文件中增加5行文本。
Var textf:TextFile; //定義文件變量textf S:String; i:Integer; begin AssignFile(textf,'file.txt'); //將文件變量textf與當(dāng)前目錄中的“file.txt"文件關(guān)聯(lián) Rewrite(textf); //創(chuàng)建文件或打開已存在的文件進(jìn)行覆蓋 for i:=1 to 5 do begin S := 'This is Line#'; writeln(textf,s,i); end; CloseFile(textf); //關(guān)閉已打開的文件textf end. 被創(chuàng)建的文件中包含5行文本,如第3行為:This is line#3。 若要向一個(gè)已存在的文件追加新文本,應(yīng)將其中的rewrite改為append。以上程序是向文件中寫入字符串和整數(shù)。其實(shí),Object Pascal對(duì)于所有的數(shù)據(jù)類型都可以這樣處理。下面的程序演示了從文本文件中讀取數(shù)據(jù)的方法。 寫入文件 Var F : Textfile; //申明變量 Begin AssignFile(F,'c:\ek.txt'); //讓變量F和C:\ek.txt關(guān)連 ReWrite(F); {Create a new file named ek.txt} Writeln(F,'你要寫入文本文件的內(nèi)容'); //寫入文件 Closefile(F); //釋放變量F End; 讀取文件 Var F : Textfile; str:String; Begin AssignFile(F, 'c:\ek.txt'); {Assigns the Filename} Reset(F); {Opens the file for reading} Readln(F, str); ShowMessage('1. line of textfile:' +str); Closefile(F); {Closes file F} End;
下面轉(zhuǎn)自http://blog.csdn.net/xwchen/archive/2007/07/26/1710410.aspx var f:text; ... AssignFile(f,'c:\1.txt'); ReWrite(f); Writeln(f,'This is a test'); CloseFile(f); ... 其中Rewrite是新建文件,若換成Reset則為打開文件 Writeln為行寫入并換行,Write為寫入不換行,Readln為讀一行并換行,Read為讀但不換行
delphi 讀寫文件方法有很多種: 我送你一貼: 程序設(shè)計(jì)當(dāng)中我們時(shí)常遇到需要處理文件、目錄及驅(qū)動(dòng)器的情況,本章將對(duì)如何處理不同類型的文件進(jìn)行講述。本章包括如何使用T F i l e S t r e a m 類封裝文件的輸入/輸出以及如何利用3 2 位Wi n d o w s 的主要特征—內(nèi)存映射文件。你將學(xué)習(xí)到如何創(chuàng)建一個(gè)封裝了內(nèi)存映射文件功能的T M e m o r y M a p p e d F i l e類,并用它在文本文件中進(jìn)行文本查詢。本章還提供了一些關(guān)于選擇驅(qū)動(dòng)器、在樹型目錄中查詢文件及獲取文件版本信息的方法。本章將使你對(duì)文件、目錄及驅(qū)動(dòng) 器有深入的認(rèn)識(shí)。 處理文件的輸入/輸出 你將要對(duì)三種文件進(jìn)行處理:文本文件、類型文件和二進(jìn)制文件。 以下幾節(jié)是關(guān)于文件輸入/輸出的講解。文本文件指可被任意文本編輯器讀取的A S C I I 文本。類型文件指包含由程序員定義的數(shù)據(jù)類型的文件。二進(jìn)制文件包含了其他所有的類型,它是對(duì)包含任意格式或無格式數(shù)據(jù)的文件的統(tǒng)稱。
文本文件的處理 本節(jié)講述使用內(nèi)建于Object Pascal 運(yùn)行時(shí)庫中的過程和函數(shù)處理文本文件的方法。在對(duì)文本文件進(jìn)行任何處理之前,首先要打開此文本文件。聲明變量:通過此變量可以來引用一個(gè)文本文件。 打 開一個(gè)文件需要兩步:首先是A s s i g n F i l e ( ) ,它可以將文件變量與一個(gè)文件關(guān)聯(lián)起來。例如:這時(shí),你可以進(jìn)行第二步:打開文件。有三種方式打開文件:使用R e w r i t e ( )過程創(chuàng)建并打開文件;對(duì)于一個(gè)已存在的文件,此操作將使文件被覆蓋;使用R e s e t ( )過程只讀地打開一個(gè)文件;使用Append() 過程向已存在的文件追加文本。 注意Reset()將以可讀寫方式打開類型文件和無類型文件??梢允褂肅 l o s e F i l e ( )來關(guān)閉一個(gè)已打開的文件。下例是各種調(diào)用的函數(shù)。
文件的打開與關(guān)閉 AssignFile :把一個(gè)外部文件名和一個(gè)文件變量相關(guān)聯(lián) Reset :打開一個(gè)存在的文件 Rewrite :創(chuàng)建并打開一個(gè)新文件(或覆蓋原有文件) Append :以添加方式打開一個(gè)文件(只適用于文本文件) CloseFile :關(guān)閉一個(gè)打開的文件 FileOpen :打開一個(gè)特定的文件并返回文件句柄 FileCreate :創(chuàng)建一個(gè)給定文件名的文件并返回文件句柄 FileClose :關(guān)閉一個(gè)特定句柄的文件 后邊三個(gè)文件主要供系統(tǒng)內(nèi)部使用,在文件復(fù)制的編程中也往往會(huì)用到。它們操作的對(duì)象是文件句柄而不是文件變量。
文件定位 Seek:把文件當(dāng)前位置移到指定部分 FilePos:返回文件的當(dāng)前位置 Eoln:返回行結(jié)束標(biāo)志 EOF:返回文件結(jié)束標(biāo)志 FileSeek: 改變當(dāng)前文件指針的位置
還有個(gè)問題,如何判斷文件已打開?要不要讀寫完之后就關(guān)閉文件,下次讀或者寫時(shí)再打開?
正常情況下是這樣
用TFileStream 對(duì)于通過Byte數(shù)組進(jìn)行文件操作的,在FTP中經(jīng)常會(huì)使用到,我也是在Delphi調(diào)用Web Service進(jìn)行文件的上傳和下載時(shí)找到這兩個(gè)函數(shù)的,挺好用的,推薦給大家。(申明:非本人所寫)
1. 將Byte數(shù)組生成文件
procedure ByteArrayToFile(const ByteArray : TByteDynArray; const FileName : string ); var Count: integer; F: FIle of Byte; pTemp: Pointer; begin AssignFile( F, FileName ); Rewrite(F); try Count := Length( ByteArray ); pTemp := @ByteArray[0]; BlockWrite(F, pTemp^, Count ); finally CloseFile( F ); end; end;
2. 將文件生成Byte數(shù)組
function FiIeToByteArray(const FileName:string ):TByteDynArray; const BLOCK_SIZE=1024; var BytesRead,BytesToWrite,Count:integer; F:File of Byte; pTemp:Pointer; begin AssignFile( F, FileName ); Reset(F); try Count := FileSize( F ); SetLength(Result, Count ); pTemp := @Result[0]; BytesRead := BLOCK_SIZE; while (BytesRead = BLOCK_SIZE ) do begin BytesToWrite := Min(Count, BLOCK_SIZE); BlockRead(F, pTemp^, BytesToWrite , BytesRead ); pTemp := Pointer(LongInt(pTemp) + BLOCK_SIZE); Count := Count-BytesRead; end; finally CloseFile( F ); end; end;
function Encrypt(mStr: string; mKey: string): string; var I, J: Integer; begin J := 1; Result := ''; for I := 1 to Length(mStr) do begin Result := Result + Char(Ord(mStr[I]) xor Ord(mKey[J])); if J + 1 <= Length(mKey) then Inc(J) else J := 1; end; {自己加步驟} end;
function Decrypt(mStr: string; mKey: string): string; var I, J: Integer; begin J := 1; Result := ''; {自己加步驟} for I := 1 to Length(mStr) do begin Result := Result + Char(Ord(mStr[I]) xor Ord(mKey[J])); if J + 1 <= Length(mKey) then Inc(J) else J := 1; end; end;
procedure TForm1.Button1Click(Sender: TObject); const cKey1 = '誰想試試怎么破'; cKey2 = '我可不愿意這樣玩(1)我可不愿意這樣玩(2)我可不愿意這樣玩(3)'; cKey3 = 'Memo2.Text := Decrypt(Encrypt(Memo1.Text, cKey), cKey);'; var S: string; //加密后的字符 begin S := Encrypt(Encrypt(Encrypt(Memo1.Text, cKey1), cKey2), cKey3); ShowMessage(S); Memo2.Text := Decrypt(Decrypt(Decrypt(S, cKey3), cKey2), cKey1); end;
http://blog.csdn.net/zisongjia/article/details/70173090
|