1. 程式人生 > >Delphi 檔案處理(4)

Delphi 檔案處理(4)

9.3.1檔案型別

1.檔案型別概念

Delphi使用檔案型別來讀寫儲存在外部儲存介質上的檔案。一個檔案變數能夠與任意種類的外部裝置建立通訊,包括磁碟、印表機、鍵盤、繪圖儀、調變解調器等。

  例如,程式執行時可以從磁碟檔案中讀取資料,向磁碟檔案寫入資料;程式執行結束後,資料仍儲存在磁碟檔案中,不會丟失。

2.檔案型別分類

根據檔案中資料元素的資料型別,可將檔案型別分為文字檔案、型別檔案和無型別檔案。

1)文字檔案。

元素型別是字元char,每個元素佔用一個位元組,以回車換行符表示每行結束。Delphi定義的標準文字檔案型別是texttextfile,兩個識別符號同義。

2)型別檔案。

元素型別可以是整數、實數或記錄等除檔案以外的資料型別。每個元素所佔的位元組數由元素型別決定。

3)無型別檔案。

以位元組byte為單位對檔案中的二進位制資料元素進行操作,而不管每個位元組表示什麼型別的資料元素。

3.檔案與陣列的區別

檔案的定義與陣列很像,都是由相同資料型別的資料元素組成的序列。但檔案不同於陣列,區別如下:

·陣列是由固定多個元素組成,而檔案的長度是不定的,隨機的。

·陣列元素總是存放在記憶體,而檔案則往往與外部介質相聯絡。

·陣列元素以“陣列名[下標]”的形式訪問,而檔案則需通過檔案變數來訪問。

9.3.2型別檔案操作

1.型別檔案定義與變數宣告

型別檔案的型別定義格式如下:

type型別檔案=file of資料型別;

其中,fileof是關鍵字,“資料型別”是檔案的元素型別。例如:

type

  intFile=file of integer;//整型檔案型別

var

  f:file of integer;//f是整型檔案變數

檔案的元素型別必須是固定長度的資料型別,不能是檔案、動態陣列、長字串、指標或包含不固定長度域的記錄型別。例如:

fx:file of intFile;//編譯錯,檔案的元素型別不能是檔案

Delphi中的字串型別string,由於要支援長字串,其大小是不固定的,因此不能作為檔案的資料型別,但可以使用短字串型別ShortString,因為它具有

256位元組的固定長度。當遇到string帶長度時,Delphi會自動將string轉換為ShortString型別,此時亦可作為檔案的元素型別。例如:

var f1:file of ShortString;//ShortString型別為256個位元組

f2:file of string[20];//string[20]20個位元組

f3:file of string;//編譯錯,記錄長度不確定

固定長度的記錄型別可以作為檔案的元素型別,但包含不固定長度域的記錄型別則不可以。例如,以下定義的記錄型別phoneEntry可以作為檔案的元素型別:

type

phoneEntry = record

name: string[20];

phoneNumber: string[20];

address: string[100];

end;

phoneList = file of phoneEntry;

2.為檔案變數指定相應檔案

在使用檔案變數進行檔案操作之前,必須呼叫AssignFile過程建立檔案變數與待操作檔案之間的聯絡

AssignFile過程宣告如下:

procedure AssignFile(var f; filename:string);

其中,f為檔案變數名,f宣告為無型別的變數引數,宣告為無型別引數是為了與所有檔案型別相容;FileName為檔名字串,是包括檔名的全路徑名。例如:

AssignFile(f,'D:\Output.dat');

指定了檔案變數f與磁碟檔案'D:\Output.dat'相關聯,其後對變數f的操作都是針對指定檔案的。

3.開啟檔案

指定檔名後,對檔案操作之前,應先開啟檔案。有以下兩種開啟檔案方式:

1Reset方式。

呼叫Reset過程開啟一個已存在檔案,然後可從檔案中讀取資料,也可向檔案寫入資料Reset過程宣告如下:

procedure Reset(var f [: File; RecSize: Word]);

開啟檔案變數f所指定的檔案,檔案變數指向檔案開頭的第一個元素。當指定檔案不存在時,產生I/O異常EInOutError

2Rewrite方式。

Rewrite過程宣告如下:

procedure Rewrite(var f:File[; Recsize: Word]);

呼叫Rewrite過程,系統以f指定的檔名,在磁碟上建立一個空檔案並準備寫入資料。如果f指定檔案已存在,則該檔案將被覆蓋,原有內容丟失。

4.讀入檔案

呼叫Reset開啟檔案後,可使用Read過程讀取檔案內容。過程宣告如下:

procedure Read(var f, v1{, v2});

其中f為檔案變數,v1v2為待輸入的變數名,v1等變數的資料型別是檔案的元素型別。

當讀取整型和實型資料時,檔案中的資料元素用空格分隔,且必須符合資料格式,否則將產生I/O錯誤。

5.判斷檔案是否結束

在讀取檔案之前,必須判斷檔案是否結束。只有未到檔案結束點,才能讀取資料。Eof函式宣告如下

function Eof(var f):Boolean;

當檔案變數f指向檔案尾部,讀入檔案結束標記時,表示檔案結束,Eof函式返回True,否則返回False

6.向檔案寫入資料

呼叫Rewrite開啟檔案後,使用Write過程向檔案中寫入資料。過程宣告如下:

procedure Write(var f, v1{, v2});

向檔案f中寫入若干個檔案元素型變數v1v2的值。

7.關閉檔案

無論是以ResetRewrite方式開啟檔案,在對檔案操作完畢後,都必須使用CloseFile過程關閉檔案,宣告如下:

procedure CloseFile(var f);

關閉檔案後,系統釋放檔案使用的資源。

Rewrite方式開啟檔案,呼叫Write過程時,資料先寫入記憶體緩衝區,只有緩衝區滿或關閉檔案時,才把資料真正寫入磁碟中,並寫入檔案結束標記。如果寫完資料後不關閉檔案,可能造成資料的丟失。

9.3.3文字檔案操作

1.文字檔案變數說明

Delphi定義了TextFile型別表示文字檔案,它與Pascal語言中的Text型別完全相同。例如:

var f:TextFile;//宣告文字檔案變數f

2.檔案型別共同的操作

與型別檔案一樣,對文字檔案進行操作也需要以下幾個步驟:

1)宣告檔案變數f

2)呼叫AssignFile過程為檔案變數f指定相關檔案。

3)呼叫ResetRewrite過程開啟檔案f

4Reset開啟檔案,當未到檔案尾,即Eof(f )返回false時,呼叫Read(f,i)過程,讀入檔案f的一個元素值存放在變數中。

5Rewrite開啟檔案時,呼叫Write(f,i)過程,將變數i的值寫入檔案f中。

6)關閉指定檔案CloseFile(f )

3.僅用於文字檔案的操作

1)與型別檔案定義不同的過程與函式。

對於文字檔案,讀、寫等過程和函式的定義與型別檔案定義有所不同,宣告如下:

procedure Read([var f: Text;]v1{, v2));

function Eof[(var f:Text)]: boolean;

procedure Write([var f: Text;]p1{, p2});

2Append新增方式開啟檔案。

Append過程宣告如下:

procedure Append(var f: Text);

呼叫Append過程開啟檔案,檔案變數指向檔案尾部,此後寫入的資料新增在檔案原有資料之後。如果檔案不存在,則產生I/O異常。

3Readln按行讀取字串。

Readln過程宣告如下:

procedure Readln([var f: Text;] v1{, v2});

Readln讀取以回車換行符結束的一行字串,之後跳過回車換行符,再讀下一行。

4)判斷行是否結束。

對於文字檔案,也可以呼叫Read(f,c)過程逐個地讀取字元,此時可以使用Eoln函式判斷行是否結束。Eoln函式宣告如下:

function Eoln [(var f: Text) ]: boolean;

當檔案變數f讀取回車換行符時,表示一行結束,Eoln函式返回True,否則返回False

對於文字檔案,既可以呼叫Readln過程按行讀取字串,也可以呼叫Read過程逐個讀取字元。需注意讀入回車換行符時的操作,例如,Readln讀完一行資料後,再使用Read讀取字串將得到空串。

以上所述AppendWritelnReadlnEoln例程只對文字檔案有效,對型別檔案無效。

資料既可以儲存在型別檔案中,也可以儲存在文字檔案中。兩種方式各有所長,存於型別檔案中,資料隱蔽性較強,但讀取不方便,必須根據要求特別編寫讀入程式;存於文字檔案中,可使用記事本等多種工具開啟文字檔案,不必特別編寫讀入程式,但資料是公開的,無法隱藏。實際應用時,可根據需求有所選擇。

4.標準輸入輸出

由於鍵盤和顯示器是作業系統預設的標準輸入/輸出裝置,作業系統對裝置的訪問也是基於檔案進行的,並且標準輸入/輸出檔案都是以字元為基本元素的文字檔案。

為此,Delphi定義了兩個預設的文字檔案變數InputOutput,用於處理標準的輸入與輸出操作。

Input代表標準輸入文字檔案,即鍵盤;Output代表標準輸出文字檔案,即顯示器。

平時我們所說的讀和寫語句,實際上是從Input檔案中讀入變數值,或向Output檔案寫入指定變數的值,其中省略了預設變數InputOutput的形式。例如,下列兩條語句等價:

Read(i, j);//Input檔案中讀入變數值,省略Input

Read(input, i, j);//Input檔案中讀入變數值

雖然Input是文字檔案,但從Input檔案中可以讀入非字元的整數型別等變數值,系統已經自動進行了資料型別的轉換,這一功能是普通文字檔案所沒有的。

下列語句兩兩等價:

Readln(i,j);Readln(input, i,j);

Readln();Readln(input);

Write(i,j);Write(output,i,j);

Writeln(i,j);Writeln(output, i,j);

Writeln();Writeln(output);

9.3.4無型別檔案操作

僅以file宣告的檔案變數稱為無型別檔案變數。例如:

var f: file;

無型別檔案變數f代表二進位制位元組檔案,而不管每個位元組表示什麼型別的資料元素。

對無型別檔案的讀/寫操作由BlockReadBlockWrite過程實現,它們以二進位制資料塊為單位,通常一個數據塊為128個位元組,一次可讀或寫若干資料塊。

9.3.5檔案的隨機操作

除了順序存取,檔案還有隨機存取方式,即按記錄位置的編號進行讀/寫操作,通常對記錄式檔案採用隨機存取方式,而對文字檔案這種字元流式檔案則不採用隨機存取方式。

有關隨機存取的操作如下,這些操作僅用於型別檔案和無型別檔案,不能用於文字檔案。

function FileSize(var f: file): Int64;//返回檔案長度,即記錄總數

function FilePos(var f: file): Int64;//返回檔案當前記錄編號

procedure Seek(var f: file, n: integer);//跳過n個記錄位置

procedure Truncate(var f: file);//截斷檔案

記錄編號通常從0開始計數。給定一個記錄編號,呼叫Seek(f,n)過程,檔案的讀/寫指標將從當前記錄位置處跳過n個記錄,定位在所需的記錄位置處,進行讀/寫操作。呼叫Truncate(f ) 過程將檔案從當前記錄處截斷,從當前記錄至檔案尾的若干記錄則被刪除。

採用順序存取方式,通常將讀檔案和寫檔案的操作分開進行,以Reset( )方式開啟檔案準備讀,以Rewrite( )方式開啟新檔案準備寫,讀和寫操作分別進行。

實際上,對於可讀寫的型別檔案和無型別檔案,以Reset( )Rewrite( )兩種方式開啟檔案,既可以讀取資料也可以寫入資料,同時支援隨機存取方式。

Reset( )方式開啟檔案時,檔案的原有內容仍保留,系統設定的檔案指標定位於第一個記錄,記錄號為0。此時,如果寫資料,則將原第一個記錄內容覆蓋。例如:

Reset(f);//當前記錄號為0

Write(f,p);//覆蓋當前記錄內容

如果將檔案指標定位於檔案尾,則可在原檔案之後增加新內容。例如:

Reset(f);

Seek(f,FileSize(f));//定位到檔案尾

Write(f,p);//追加記錄

Rewrite( )方式開啟檔案時,檔案原有內容不保留,檔案指標定位於第一個記錄,記

錄號0,這是要寫入的記錄位置。寫入若干記錄後,可以改變檔案指標,再讀記錄,例如:

Rewrite(f);

Write(f ,p);

Write(f ,p);

Seek(f,0);

Read(f,p);//讀出第一個記錄

9.3.6與檔案目錄相關的標準過程和函式

DelphiSystemSysUtils等單元中定義了與檔案和目錄操作有關的若干過程/函式。

1System單元中與目錄操作有關的過程/函式

procedure ChDir(const s: string);//改變當前目錄

procedure MkDir(const s: string);//建立一個新的子目錄S

procedure RmDir(const s: string);//刪除一個空的目錄S

function Flush(var t:Text): integer;//清空文字輸出緩衝區

function IOResult: integer;//返回I/O操作狀態。

procedure Move(const Source; var Dest; Count: Integer);

//將源資料塊以位元組形式拷貝至目的資料塊

2SysUtils單元中與檔案操作有關的過程/函式

function GetCurrentDir: string;//返回當前目錄路徑名

function SetCurrentDir(const Dir: string): Boolean;//設定當前目錄

function FileCreate(const FileName: string):Integer;//建立檔案

function FileExists(const FileName: string): Boolean;//判斷指定檔案是否存在

function CreateDir(const Dir: string): Boolean;//建立新目錄

function ExpandFileName(const FileName: string): string;

//從檔名返回完整的檔案路徑名

function ExtractFileDir(const FileName: string): string;

//從檔案路徑名中返回目錄路徑名

function ExtractFileName(const FileName: string): string;

//從檔案路徑名中返回檔名和副檔名

function ExtractFileExt(const FileName: string): string;

//從檔案路徑名中返回副檔名

function DeleteFile(const FileName: string): Boolean;//刪除指定檔案

function RenameFile(const OldName, NewName: string): Boolean;

//重新命名指定檔案

function FileGetAttr(const FileName:string):Integer;//返回指定檔案的屬性

function DiskSize(Drive: Byte): Int64;//返回指定驅動器的總容量

function DiskFree(Drive: Byte): Int64;//返回指定驅動器的剩餘磁碟空間

相關推薦

Delphi 檔案處理4

9.3.1檔案型別 1.檔案型別概念 Delphi使用檔案型別來讀寫儲存在外部儲存介質上的檔案。一個檔案變數能夠與任意種類的外部裝置建立通訊,包括磁碟、印表機、鍵盤、繪圖儀、調變解調器等。   例如,程式執行時可以從磁碟檔案中讀取資料,向磁碟檔案寫入資料;程式執行結束後

【ADNI】資料預處理4Get top k slices according to CNNs

ADNI Series 1、【ADNI】資料預處理(1)SPM,CAT12 2、【ADNI】資料預處理(2)獲取 subject slices 3、【ADNI】資料預處理(3)CNNs 4、【ADNI】資料預處理(4)Get top k slices according to CNN

JavaEE-SSM:007 Mybatis的配置檔案解析4

1.系統級別的typeHandler   2.自定義typeHandler   想要自己實現typeHandler,需要實現TypeHandler<T>介面,T就是你要轉換的Java型別 setParameter(PreparedSta

JAVA 檔案操作4

要求: 通過二進位制流的操作方式把程式調整為可以實現對任何型別檔案進行檔案移動(而不是呼叫windows命令列的外部命令move)。 主要方法: renameTo 官方說明: public boolean renameTo(File dest) Renam

JavaWeb學習HttpServletResponse基本應用——檔案下載4

檔案下載功能是web開發中經常使用到的功能,使用HttpServletResponse物件就可以實現檔案的下載 一、檔案下載功能的實現思路:   (1)獲取要下載的檔案的絕對路徑   (2)獲取要下載的檔名   (3)設定content-disposition響應頭控制瀏覽器以下載的

數字語音訊號處理學習筆記——語音訊號的同態處理4

版權宣告:本文為博主原創文章,未經博主允許不得轉載。    https://blog.csdn.net/u013538664/article/details/35989289 5.6 語音的倒譜應用 1.基音檢測     

Python檔案處理1

讀取檔案 解決方案: 最簡單的就是一次性讀取所有的內容放在一個大字串中  all_the_text=open('thefile.txt').read() all_the_data=open('abinfile','rb').read() 為了安全起見,最好將開啟的檔案物件

走進windows編程的世界-----消息處理函數4

rpo 擴展 hinstance adding 3.1 eof client cnblogs set 一 右鍵菜單 1 右鍵菜單 當在窗體點擊鼠標右鍵時,彈出的菜單。 2 右鍵菜單的使用 2.1 創建菜單 CreatePopupMenu 2

spring boot 1.5.4 統一異常處理

springboot springboot1.5.4 springboot整合springdatajpa springboot集成jdbctemplate springboot異常處理 上一篇:springboot 1.5.4 配置文件詳解(八) 1 Spring Boot統一異

JDBC入門4--- 批處理

集合 for mysql connect 通過 入門 code 這一 匹配 1、Statement批處理   當你有10條SQL語句要執行時,一次向服務器發送一條SQL語句,這樣做的效率上極差,處理的方案是使用批處理,即一次向服務發送多條SQL語句,然後由服務器一次性處理。

Delphi CxGrid 匯總4

grid param 刪除記錄 說明 idle proc 同步 def reserve 1. CxGrid匯總功能 ① OptionsView-Footer設置為True,顯示頁腳 ② CxGrid的Summary選項卡定義要匯總的列和字段名及匯總方式,Foot

perl學習4正則表達式處理文本

接收 沒有 per tdi 自動 int con class 開頭 一:  進行本章學習前的一些知識儲備 1:  Perl最喜歡用的默認變量:$_(摘於perl語言入門78頁)    假如在foreach循環開頭省略空置變量,Perl就會用它最喜歡的默認變量$_。

[Golang] 從零開始寫Socket Server4:將執行引數放入配置檔案XML/YAML

    為了將我們寫好的Server釋出到伺服器上,就要將我們的程式碼進行build打包,這樣如果以後想要修改一些程式碼的話,需要重新給程式碼進行編譯打包並上傳到伺服器上。     顯然,這麼做過於繁瑣。。。因此常見的做法都是將Server執行中

Linux學習筆記4磁碟分割槽與檔案系統命令

    df 檢查檔案系統的磁碟空間佔用情況,引數-a列出全部目錄,引數-h按KB,MB,GB顯示 du   檢車某個目錄或者檔案佔用的磁碟空間,引數-s顯示佔用總空間,引數-sh統計目錄大小 mo

影象處理基本概念筆記4

作者:cvvision 連結:http://www.cvvision.cn/8912.html 來源:CV視覺網 四、 42、1080p 1080p 是簡寫形式專業術語,表示一套 HDTV 裝置的特點是 1080 條水平線解析度和逐行掃描。 1080p 是簡寫形式專業術語,表示一套 HDTV

自然場景文字處理論文整理 4PixelLink

paper:https://arxiv.org/abs/1801.01315v1 github:https://github.com/ZJULearning/pixel_link 摘要 大多數最先進的場景文字檢測演算法是基於深度學習的方法,其依賴於邊界框迴歸並且執行至少兩種預測

java數字影象處理基礎使用imageio寫影象檔案示例轉載

一個BufferedImage的畫素資料儲存在Raster中,ColorModel裡面儲存顏色空間,型別等資訊,當前Java只支援一下三種影象格式- JPG,PNG,GIF,如何向讓Java支援其它格式,首先要 完成Java中的影象讀寫介面,然後打成jar,加上啟動引數- Xbootclasspat

Webpack 4.X webpack.config.js 檔案配置

通過上一篇文章,我們明白了webpack的兩個配置引數入口與出口,webpack會找到入口檔案的地址,進去後一頓蹂躪,再通過你給的輸出地址就把編譯後的檔案給你了。這篇文章接著去豐富webpack.config.js的內容,說一個引數叫plugins plugins plugins裡面放的是外掛,在webp

SpringMVC6 - 控制器4 - @RequestMapping3 - 非同步請求處理

參考:https://docs.spring.io/spring/docs/4.3.20.RELEASE/spring-framework-reference/htmlsingle/#mvc-ann-async   Spring MVC 3.2引入了基於Servlet 3的非同步請

JAVAWEB學習4處理請求資源路徑

Servlet 容器如何處理請求資源路徑 1. 什麼是請求資源路徑 在瀏覽器位址列輸入:http://ip:port/appName/xxx.html 其中 /appName/xxx.html 就是請求資源路徑 容器預設認為訪問的是一個servlet,所以,會檢視web.xm