函数的意义 |
答題得分者是:kan0515
|
wqw
一般會員 發表:5 回覆:0 積分:1 註冊:2003-01-17 發送簡訊給我 |
|
kan0515
中階會員 發表:56 回覆:120 積分:50 註冊:2002-06-24 發送簡訊給我 |
assignfile
-->指定開啟的檔案
ex.
pwdstr:='aaa.cfg';
AssignFile(pwdfile,pwdstr); rest(pwdfile);
-->您指的是reset嗎?
如果是的話,那是指將pwdfile唯讀的方式開啟
readln(pwdfile,pwdstr);
-->將pwdfile的內容以行為單位讀出來
將資料放在pwdstr中
ex.
var tmp:string;
while not eof(pwdfile) do
begin
readln(pwdfile,pwdstr);
tmp:=tmp pwdstr chr(13);
end; closefile(pwdfile);
--->關閉assignfile所開啟的檔案
|
banson1716
高階會員 發表:55 回覆:182 積分:167 註冊:2002-04-14 發送簡訊給我 |
忘了在那下載 慢慢品嘗吧
========================
文件管理 文件是同一類型元素的有序集合,是內存與外設間傳輸數據的渠道。一些外設如顯示
器、鍵盤、打印機等都可以看作文件,但最常用的還是磁盤文件,這也是本章我們主要討
論的對像。
Delphi繼承了Object Pascal的文件管理功能,並有很大的發展,其中最主要的是提
供了用於文件管理的標準控件,同時也提供了更多的文件管理函數。利用Delphi的強大功
能,開發一個自己的文件管理繫統就成為很容易的事。
本章首先介紹Delphi文件管理的基本概念和標準過程/函數,並提供了一個記錄文件
的應用實例,這是從我們實際課題開發中提取出來的。而後介紹Delphi提供的文件控件的
使用方法。最後提供的一個綜合例程MDI文件管理器則是對Delphi文件管理功能的綜合應
用。
---- 文件類型和標準過程 Delphi同Object Pascal一樣支持三種文件類型,即:文本文件、記錄文件、無類型
文件。 ----文本文件 文本文件類型的變量用如下方法聲明: var
TextFileVar: Text ; 文本文件是以行為單位進行讀、寫操作的。由於每一行長度不一定相同,不能計算出
給定行在文件中的確切位置,因而隻能順序地讀寫。而且文本文件隻能單獨為讀或寫而打
開,在一個打開的文本文件上同時進行讀、寫操作是不允許的。 ---- 文本文件的打開、關閉 文本文件的打開需要兩個步驟:(1). 文件變量與文件名關聯;(2). 初始化讀寫。
關聯文件變量與文件名調用AssignFile標準過程: AssignFile ( TextFileVar , FileName ) ; FileName 既可以是全路徑名,也可以僅是文件名。對於後者繫統將在當前目錄下查找。
AssignFile是Delphi新提供的一個函數,其功能等價於Object Pascal中的Assign。
而Assign在Delphi中更多地被用作一個方法名。
初始化讀寫有三種方式:
1. Reset : 為讀打開文件並把文件指針移動到文件首;
2. Rewrite : 為寫創建一個新文件;
3. Append : 為寫打開存在的文件並把文件指針定位在文件尾。
當使用Reset或Append過程而文件不存在時將會引發一個I/O異常。有關I/O異常的
處理請參看本章例程和第十二章中的介紹。
文件的關閉很簡單,隻須調用CloseFile過程即可。
雖然Delphi應用程序在退出時會自動關閉所有打開的文件,但自己動手關閉文件可以
確保釋放文件句柄,並使程序的可移植性增強。
為保持兼容,Delphi也允許用戶用Assign建立關聯,Close關閉文件。 ---- 文本文件的讀寫 從文本文件中讀取信息用Read、Readln兩個標準過程。
當讀入數值時,Read、Readln假定數值是用一個或多個空格分開的,而不是逗號、分
號或其它字符。對如下一條語句: Read ( TextFileVar , Num1 , Num2 , Num3 ) ; 如果文件中的數值是:
100 200 300
則能夠成功讀入,而若文件中的數值是
100 200, 300
則Read讀入“200,”並試圖把它轉化成一個數值時會引發一個異常。
當讀入字符是字符串時,Read、Readln過程總是讀取盡可能多的字符填充到字符串變
量中或一直讀到行結束符為止。因此從文本文件中讀取格式化的字符串數據,必須聲明與
其長度相匹配的字符串變量。如果要從文件中讀取單詞,必須先把文件中的每一行讀入字
符串,然後再從字符串中逐個分析出單詞。或者一次隻從文本文件中讀入一個字符並測試
每個字符後是否是單詞斷開處。
格式化字符串之間的分隔符應讀入到一個臨時變量中,而字符串與數值、數值與數值
間的分隔符讀入時會自動識別剔除。對如下一行數據:
Mon 12:10 40 50
定義 var
Day: string[3] ;
Time: string[5] ;
Num1, Num2: Integer ;
則須用如下的read 語句讀入: read ( TextFileVar , Day , c , Time , Num1 , Num2 ) ; C為一個臨時字符變量。 ---- 文本文件的編輯 在Delphi中實現對一個文本文件的編輯,隻須讓其與一個Tmemo控件建立關聯即可: Memo1.Lines.LoadFromFile ( TextFileName ) ; 這樣在TMemo上所做的一切修改當調用Memo部件的SaveToFile方法後都會反映到文
件中去。 ---- 記錄文件 記錄文件是一種操作更為靈活的文件類型。它允許同時為讀和寫打開,而且由於記錄
文件中每條記錄的長度固定,所以可隨機存取。
記錄文件的類型變量可如下聲明: var
RecordFileVar: file of RecordType; RecordType是一個自定義的記錄類型。
有關記錄文件的操作我們將在下一節中結合例程進行討論。 ---- 無類型文件 無類型文件提供了底層的I/O通道,可用於存取可變長度記錄的文件。經常用於文件
的復制操作中。由於Delphi提供了更好的方法(見第四節),所以無類型文件很少使用。有
興趣的讀者可參看BlockRead、BlockWrite兩個聯機幫助主題。 ----- Delphi的文件管理標準過程 根據功能我們把標準過程劃分為十一類進行介紹。 ---- 文件的打開與關閉 AssignFile : 把一個外部文件名和一個文件變量相關聯
Reset :打開一個存在的文件
Rewrite :創建並打開一個新文件(或覆蓋原有文件)
Append : 以添加方式打開一個文件(隻適用於文本文件)
CloseFile : 關閉一個打開的文件
FileOpen :打開一個特定的文件並返回文件句柄
FileCreate :創建一個給定文件名的文件並返回文件句柄
FileClose : 關閉一個特定句柄的文件 後邊三個文件主要供繫統內部使用,在文件復制的編程中也往往會用到。它們操作的
對像是文件句柄而不是文件變量。 ---- 文件定位 Seek : 把文件當前位置移到指定部分
FilePos : 返回文件的當前位置
Eoln : 返回行結束標志
EOF : 返回文件結束標志
FileSeek : 改變當前文件指針的位置
Seek與FileSeek的區別是:1. Seek僅用於記錄文件;2. FileSeek的參數是文件句
柄、偏移量、起始位置。其中起始位置有文件首、當前位置、文件尾三種選擇。Seek的參
數是文件變量、偏移量,偏移量是從文件首開始定位的。3. FileSeek的偏移量以字節數
來計算,而Seek是根據記錄號進行移動。
Seek、FilePos僅用於記錄文件。但任何文件都可以看作是基於字節的記錄文件。下
面一段程序表示了它們的用法。
{ 該例子的設計界面為一個包含TOpenDialog部件的窗體。} uses Dialogs;
var
f: file of Byte;
size: Longint;
S: String;
y: Integer;
begin
if OpenDialog1.Execute then
begin
AssignFile(f, OpenDialog1.FileName);
Reset(f);
size := FileSize(f);
S := 'File size in bytes: ' IntToStr(size);
y := 10;
Canvas.TextOut(5, y, S);
y := y Canvas.TextHeight(S) 5;
S := 'Seeking halfway into file...';
Canvas.TextOut(5, y, S);
y := y Canvas.TextHeight(S) 5;
Seek(f,size div 2);
S := 'Position is now ' IntToStr(FilePos(f));
Canvas.TextOut(5, y, S);
CloseFile(f);
end;
end. ---- 文件刪除與截斷 Erase : 刪除一個存在的文件
DeleteFile : 刪除一個文件
Truncate : 從文件當前位置將文件截斷 Erase與DeleteFile的區別是:Erase以文件變量為參數,當文件不能刪除時引起一
個異常;DeleteFile以文件名為參數,當文件不存在或不能刪除時返回False,而並不引
起一個異常。 ---- 文件名操作 Rename :文件更名,以文件變量為操作對像
RenameFile :文件更名,參數為文件的原名和新名
ChangeFileExt :改變文件擴展名
ExpandFileName :返回文件全路徑名
ExtractFileExt :返回文件擴展名
ExtractFileName :從全路徑名中返回文件名
ExtractFilePath :返回特定文件的路徑 ---- 文件屬性 FileGetAttr :返回文件屬性
FileSetAttr :設置文件屬性 ---- 文件狀態 FileSize :返回文件對像大小
IOResult :返回上一次I/O操作的狀態
FileExists :檢測文件是否存在 ---- 文件日期 DateTimeToFileDate :把Delphi日期格式轉換為DOS日期格式
FileDateToDateTime :把DOS日期格式轉換為Delphi日期格式
FileGetDate :返回文件的DOS日期時間戳
FileSetDate :設置文件的DOS日期時間戳 ---- 文件讀寫 Read,Readln :從文本或記錄文件中讀取變量
Write :將指定變量寫入文本或記錄文件
Writeln :將指定變量寫入文本文件並寫入一個行結束標志
FileRead :從一個指定文件中讀取變量
FileWrite :向指定文件寫入數據 FileRead和FileWrite都是以文件句柄為操作對像,主要供繫統內部使用。 ---- 目錄操作 MkDir :創建當前目錄的子目錄
ChDir :改變當前目錄
GetDir :返回特定磁盤的當前目錄
RmDir :刪除一個空子目錄 ---- 磁盤操作 DiskFree :返回磁盤自由空間
DiskSize :返回特定磁盤的大小 ---- 文件查找 FileSearch :查找目錄中是否存在某一特定文件
FindFirst :在目錄中查找與給定文件名(可以包含匹配符)及屬性集相
匹配 的第一個文件
FindNext :返回符合條件的下一個文件
FindClose :中止一個FindFirst / FindNext序列 有關文件管理標準過程/函數的更詳細資料,請查閱Delphi相關的Help主題。以上的
大部分過程在後面都有應用實例,讀者可以從中體會其用法。
在Delphi的聯機幫助Help繫統中把有關文件的過程/函數分為兩個主題:I/O Routine
和File _Management Routine。前者大部分以文件變量為操作對像,而後者大部分以文件
名或文件句柄為操作對像。這裡為了方便讀者的使用,我們按功能重新進行了分類。在下
一節中主要應用I/O Routine主題下的過程,而在第四節的綜合舉例中主要應用
File_Management Routine主題下的過程。
另外,Windows提供了許多有關文件管理的API函數。雖然在一般情況下,利用Delphi
提供的函數已足夠解決問題,但有時候仍然需要使用Windows API。在(6.4.4.2)中我們就
用到了Windows API函數GetDriveType。有關Windows API函數的情況,請讀者參閱相關
的資料,這裡不再進行介紹。
---- 記錄文件的應用 ---- 任務介紹 在這一節,我們開發一個繫統安全性綜合評估方法管理繫統。繫統安全性在復雜項目
開發中十分重要,但由於牽涉面廣因而很難獲得客觀、全面的評估值。鋻於此我們提出多
角度、多側面評估而後定量集成的思路,並在此基礎上提出了多種安全性綜合評估方法。
每種方法由不同部門進行評估而後把結果彙總、綜合。
為此我們定義如下的記錄類型: type
TNature = (Micro,Macro);
{方法性質,分為微觀和宏觀兩類} TMethod = Record
Name: string[20]; {方法名}
Condition: string[40]; {方法適用條件}
Nature: TNature; {方法性質}
Result: Real; {方法評估值}
end; 用來記錄不同方法的信息。
由於不同方法的條件、性質不同,因而對工程開發的不同階段適用方法集也不同。因
此需要根據實際情況對方法集進行管理。我們把每一方法作為一條記錄,每一方法集作為
一個記錄文件。下面討論繫統的實現方法。 ---- 設計基本思路 本繫統要實現的基本功能是文件的打開、創建、關閉、顯示,記錄的增加、修改、刪
除以及結果的綜合和顯示。為此我們使用了兩組按鈕分別用於文件和記錄的操作, 使用一
個StringGrid控件來顯示文件內容,使用一個隻讀編輯框顯示結果的綜合。
如圖是設計主窗口界面。
綜合評估方法管理繫統主窗口界面 其中各部件的名稱、功能如下表所示: 主窗口部件的設計
══════════════════════════════════════
部件名稱 主要屬性 備注
──────────────────────────────────────
RecFileForm BorderStyle=bsDialog 文件打開後把文件名附到窗口標題後
Position=poScreenCenter
StringGrid1 大小行數動態確定
HazAttr(編輯框) ReadOnly=True 顯示綜合結果
OpenButton TabOrder=0 打開一個記錄文件,若文件不存在則創建
NewButton Caption='打開' 創建一個記錄文件,若文件存在則打開
CloseButton Caption='關閉' 關閉一個已打開的文件
AddButton Caption='增加' 增加一條記錄
ModifyButton Caption='修改' 修改一條記錄
DeleteButton Caption='刪除' 刪除一條記錄
CalcuButton Caption='計算' 計算最終結果並顯示
ExitButton Caption='退出' 繫統終止。若當前有打開的文件則先關
閉
OpenDialog1 Filter= 選擇或輸入欲打開的文件
'Record File(*.Rec)|.Rec
|Any File(*.*)|*.*'
══════════════════════════════════════ 另外,StringGrid1、HazAttr的標題用兩個標簽框(Label)來顯示。
另外我們還需要一個編輯對話框。其中四個編輯框Name、Condition、Nature、 Result
分別對應TMethod記錄的四個域。
編輯對話框 為協調程序運行,我們定義了一組全局變量。各變量的類型、作用如下表。 全局變量及其作用
═════════════════════════════════
變量名 類型 作用
─────────────────────────────────
MethodFile MethodFileType 與當前打開文件相關聯的文件變量
FileName string[70] 當前打開文件的文件名
Count Count 當前打開文件的記錄總數
CurrentRec Integer 當前處理記錄號
FileOpened Boolean 當前是否有文件打開
═════════════════════════════════ 記錄文件類型MethodFileType的定義為 type
MethodFileType = file of TMethod; 布爾變量FileOpened用於控制文件按鈕的使能、變灰,記錄按鈕的反應以及繫統結束
時是否需要首先關閉文件。 ---- 記錄文件的打開和創建 記錄文件的打開和創建同文本文件一樣也需要關聯和初始化兩個步驟。同文本文件唯
一的不同是不能使用Append過程。
記錄文件缺省情況下以讀寫方式打開,如果想以隻讀或隻寫方式打開,則需要修改
System單元中定義的變量FileMode的值。
FileMode的取值和意義如下表。 FileMode的取值和意義
══════════════
取值 意義
──────────────
0 隻讀
1 隻寫
2 讀寫
══════════════ FileMode是一個全局變量,對它的每次修改都將影響所有Reset的操作,因此在打開
自己的文件後應還原它的值。
在本繫統中,當用戶按下“打開”按鈕時,首先彈出一個標準文件打開對話框,要求
用戶輸入或選擇文件名。確認後如果該文件名的文件存在,則用Reset打開,若不存在則
創建。程序清單如下。 procedure TRecFileForm.OpenButtonClick(Sender: TObject);
begin
if OpenDialog1.Execute then
FileName := OpenDialog1.FileName
else
exit;
AssignFile(MethodFile,Filename);
try
Reset(MethodFile);
FileOpened := True;
except
On EInOutError do
begin
try
if FileExists(FileName) = False then
begin
ReWrite(MethodFile);
FileOpened := True;
end
else
begin
FileOpened := False;
MessageDlg('文件不能打開',mtWarning,[mbOK],0);
end;
except
On EInOutError do
begin
FileOpened := False;
MessageDlg('文件不能創建',mtWarning,[mbOK],0);
end;
end;
end;
end;
if FileOpened = False then exit;
Count := FileSize(MethodFile);
if Count>0 then
ChangeGrid;
RecFileForm.Caption := FormCaption ' -- ' FileName;
NewButton.Enabled := False;
OpenButton.Enabled := False;
CloseButton.Enabled := True;
end;
首先繫統試圖用Reset打開一個文件,並置FileOpened為True。如果文件不能打開,
則引發一個I/O異常。在異常處理過程中,首先檢測文件是否存在。若不存在則創建這個
文件。否則是其它原因引發的異常,則把FileOpend重置為False, 並顯示信息“文件不
能打開”。在文件創建過程中仍可能引發異常,因而在一個嵌套的異常處理中把FileOpened
重置為False,並提示信息“文件不能創建”。
有關異常處理的內容請讀者參看第十二章。這段程序說明:異常處理機制不僅能使我
們的程序更健壯,而且為編程提供了靈活性。
當用戶按下“創建”按鈕時,繫統首先彈出一個標準輸入框,要求用戶輸入文件名,
確認後繫統首先檢測文件是否存在。若存在則直接打開,否則創建一個新文件。打開或創
建過程導致異常,則重置FileName和FileOpened兩個全局變量。 procedure TRecFileForm.NewButtonClick(Sender: TObject);
begin
FileName := InputBox('輸入框','請輸入文件名','');
if FileName = '' then Exit;
try
AssignFile(MethodFile,FileName);
if FileExists(FileName) then
begin
Reset(MethodFile);
Count := FileSize(MethodFile);
if Count>0 then
ChangeGrid;
end
else
begin
Rewrite(MethodFile);
count := 0;
end;
FileOpened := true;
Except
on EInOutError do
begin
FileName := '';
FileOpened := False;
end;
end;
if FileOpened then
begin
NewButton.Enabled := False;
OpenButton.Enabled := False;
CloseButton.Enabled := True;
RecFileForm.Caption := FormCaption ' -- ' FileName;
end;
end; 當文件打開或創建後,所要做的工作有:
● 若文件非空,則計算文件長度,並用文件內容填充StringGrid1
● “創建”、“打開”按鈕變灰,“關閉”按鈕使能
● 把文件名附到窗口標題後
---- 記錄文件的讀入和顯示 定義一個全局變量Count用來保存文件中的記錄個數。當文件裝入時: Count := FileSize(MethodFile);
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |