有類型檔案的定義
有類型檔案中的元素可以是混合型的,並以二進制格式存貯,因此有類型檔案(除了字元類型檔案,因為它實質上是文本檔案)不象文本檔案那樣可以用編輯軟體等進行閱讀和處理。
格式
有類型檔案的類型說明的格式為:
類型標識符=File of 基類型;
其中基類型可以是除了檔案類型外的任何類型。例如:
file1=file of integer;
file2=file of array【1..10】 of string;
file3=file of set of char;
file4=file of real;
file5=file of record;
name:string;
course:array【1..10】 of real;
sum:real;
end;
等等,其中file2,file3,file5中的數組、集合、記錄等類型可以先說明再來定義檔案變數。
例如
varf1:file1;
f2,f3:file3;
f4:file5;
與前面所有類型說明和變數定義一樣,檔案類型說明和變數定義也可以合併在一起,例如:
var
f1:file of integer;
f2,f3:file of set of char;
file4=file of record;
name:string;
course:array【1..10】 of real;
sum:real;
end;
Free Pascal對有類型檔案的訪問既可以順序方式也可以用隨機方式。
二、有類型檔案的建立
有類型檔案的建立只能通過程式的方式進行,其操作步驟與文本檔案程式方式建立的步驟相仿,不同之處:(1)有類型檔案的定義與文本檔案的定義不同;(2)有類型檔案可以利用seek命令指定指針隨機寫入。
三、有類型檔案的訪問
有類型檔案訪問的操作步驟與文本檔案的程式訪問操作步驟相仿,區別之處:(1)有類型檔案的定義與文本檔案的定義不同;(2)有類型檔案可以利用seek命令訪問檔案記錄中的任一記錄與記錄中的任一元素。
對有類型檔案的寫操作步驟為:
assign(f,str);
rewrite(f);
write(f,var表);
close(f);
對有類型檔案的讀操作步驟為:
assign(f,str);
reset(f);
read(f,var表);
close(f);
四、例題分析
例11.5 設有一個整數檔案f,現要求將其中的偶數乘以2,奇數減1,形成一個偶數檔案。
分析:有兩種方法,一是另外生成一個偶數檔案g,一是將生成的偶數檔案仍然保存在原檔案f中,下面分別給出這兩種方法的程式。
program exp11_5_1(input,output); { 生成一個偶數檔案g }
var f,g : file of integer;
x:integer;
begin
assign(f,’input.txt’);
assign(g,’output.txt’);
reset(f);
rewrite(g);
while not eof(f) do
begin
read(f,x);
if odd(x) then x:=x-1
else x:=x+x;
write(g,x);
end;
close(f) ;close(g);
end.
program exp11_5_2(input,output); { 將生成的偶數檔案仍然保存在原檔案f中 }
var f : file of integer;
x,i:integer;
begin
assign(f,’input.txt’);
reset(f);
i:=1; { 人為設定一個寫指針 }
while not eof(f) do
begin
read(f,x); { 系統指針作為讀指針 }
if odd(x) then x:=x-1
else x:=x+x;
seek(f,i); { 將寫指針定位到目標位置 }
write(f,x);
i:=i+1;
end;
close(f);
end.
例11.6 設有兩個已經排好序(從小到大)的整數檔案t1和t2,請編程將t1和t2合併成一個檔案t,使得合併後的檔案也是有序的(從小到大)。
program exp11_6(input,output);
type intfile = file of integer;
var t1,t2,t:intfile;
procedure paixu(var f,g,h:intfile);
var m,x,y:integer;
begin
reset(f) ;reset(g) ;rewrite(h) ;
m:=0; { m為初始標誌 }
while (not eof(f) and not eof(g)) do
begin
if m=0 then begin read(f,x) ;read(g,y) ;m:=1; end;
if x<y then begin write(h,x);read(f,x); end
else begin write(h,y);read(g,y); end;
end;
while not eof(f) do begin read(f,x);write(h,x); end;
while not eof(g) do begin read(g,y);write(h,y); end;
close(f);close(g);close(h);
end;
begin
assign(t1,’input1.txt’);
assign(t2,’input2.txt’);
assign(t, ’output.txt’);
paixu(t1,t2,t);
end.
注意:類型檔案用寫字本或TYPE命令打開看,全是亂碼(二進制代碼)。