Kiểu file trong pascal

D liu kiu File
1.Khái niệm về tệp
Tệp hay tệp dữ liệu là một tập hợp các dữ liệu có liên quan với nhau và có
cùng kiểu đợc nhóm lại với nhau tạo thành một dãy. Chúng thờng đợc chứa trong
một thiết bị nhớ ngoài của máy tính (đĩa mềm, đĩa cứng...)
Tệp dữ liệu theo nghĩa rộng : có thể đó là chơng trình, có thể là số liệu, có
thể là các dữ liệu khác nh kí tự, văn bản...
Tệp đợc lu trữ trong bộ nhớ ngoài nh đĩa cứng, đĩa mềm...Điều đó có nghĩa
là tệp đợc lu trữ để dùng nhiều lần và tồn tại ngay cả khi chơng trình kết thúc hoặc
mất điện. Vì vậy nhng dữ liệu nào cần lu giữ thì chúng ta bắt buộc phải dùng đến
tệp.
Tệp là một kiểu dữ liệu có cấu trúc. Định nghĩa tệp có phần nào giống mảng
ở chỗ chúng đều là tập hợp của các phần tử dữ liệu cùng kiểu. Song mảng đợc khai
báo trong chơng trình với số phần tử đã xác định, còn số phần tử của tệp không
xác định khi định nghĩa
2. Cách định nghĩa tệp trong Pascal
Cách 1
TYPE
Kiểu_tệp = FILE OF kiểu_phần_tử;
Sau đó ta khai báo
VAR Biến_Tệp : Kiểu_tệp;
Cách 2 : khai báo trực tiếp
VAR
Biến_tệp : FILE OF Kiểu_phần_tử;
VD :
TYPE
FileInteger = FILE OF integer;
FileReal = FILE OF real;
FileBoolean = FILE OF Boolean;
Nhan_su = RECORD
Ten : String[30];
Tuoi : Byte;
Luong : Real;
END;
VAR
F1,F2 : FileInteger;
F3 : FileReal;
FNS : FILE OF Nhan_su;
F5 : FILE OF Char;
3.Mở tệp mới để cất dữ liệu
a. Mở tệp để ghi
Pascal dùng 2 thủ tục đi liền nhau theo thứ tự
ASSIGN (Biến_Tệp, Tên_tệp); Gán tên_tệp cho biến_tệp;
REWRITE (Biến_Tệp);
VD : ASSIGN(F1,'NGUYENTO.DAT');
REWRITE(F1);
1
Sau khi mở tệp xong, tệp sẽ rỗng vì cha có phần tử nào, cửa sổ tệp sẽ không có
giá trị xác định vì nó trỏ vào cuối tệp (EOF). Ly ý, nếu trên đĩa có tập tin trùng với
tên của tệp mở thì nó sẽ bị xoá đi.
b.Ghi các giá trị vào tệp với thủ tục WRITE
Cách viết
Write (Biến_tệp, Item1, Item2, ... , ItemN);
Trong đó Item1, Item2,...ItemN là các hằng, biến, các biểu thức và phải có giá trị
cùng với kiểu phần tử của tệp
VD : Với I,J,K là các biến INTEGER, ta có thể viết :
Write (F1, 3, I+2*J, K, 5);
Bớc cuối cùng của việc đặt dữ liệu vào tệp là đóng tệp bằng thủ tục
CLOSE (Biến_Tệp)
VD : CLOSE(F1);
4. Đọc dữ liệu từ một tệp đã có
a. Mở tệp để đọc
Pascal dùng 2 thủ tục đi liền nhau theo thứ tự
ASSIGN (Biến_Tệp, Tên_tệp); Gán tên_tệp cho biến_tệp;
RESET (Biến_Tệp);
VD : ASSIGN(F1,'NGUYENTO.DAT');
RESET(F1);
Sau khi mở tệp xong, nếu tệp không rỗng thì cửa sổ bao giờ cũng trỏ vào phần tử
đầu tiên của tệp
b.Đọc dữ liệu từ tệp
Cách viết
Read (Biến_tệp, Var1, Var2, ... , VarN);
Trong đó Var1, Var2,...VarN chỉ có thể là các biến có giá trị cùng với kiểu phần
tử của tệp
Việc đọc một phần tử của tệp còn cần có điều kiện : phải xem tệp có còn phần tử
không, tức là cửa sổ tệp cha trỏ đến EOF. Hàm EOF(Biến_tệp)=TRUE nếu cửa sổ
tệp trỏ vào cuối tệp và EOF(Biến_tệp)=FALSE nếu cửa sổ vẫn trỏ vào phần tử của
tệp
VD : Muốn đọc tất cả các phần tử của tệp
WHILE not EOF(Biến_Tệp) DO
BEGIN
Read(Biến_Tệp, X);
..................
END;
c.Bớc cuối cùng của việc đọc dữ liệu từ tệp là đóng tệp bằng thủ tục
CLOSE (Biến_Tệp)
VD : CLOSE(F1);
5.Tệp truy nhập trực tiếp
Vì độ dài của các phần tử trong tệp là nh nhau nên ta có thể truy nhập trực tiếp
vào vị trí của một phần tử nào đó trong tệp bằng cách dùng SEEK
Cách viết
SEEK (Biến_Tệp, No) No là số thứ tự của phần tử trong tệp
2
Theo thủ tục này máy sẽ đặt cửa sổ tệp vào phần tử thứ No. Sau đó ta chỉ cần
dùng các thủ tục READ để đọc nó ra hoặc WRITE để đặt giá trị mới vào
6.Các thủ tục và hàm xử lí tệp của Pascal
FILESIZE (F) : cho số phần tử của tệp F
FILEPOS (F) : cho vị trí tức thời của con trỏ
ERASE (F) : xoá FILE trên đĩa có tên đã gán vào F
RENAME (F, St) : đổi tên tệp thành St (kiểu String)
7.Tệp văn bản (TEXT FILE)
a. Cách khai báo
VAR Biến_tệp : TEXT;
VD :
VAR F1,F2 : TEXT
Các phần tự của tệp kiểu TEXT là các kí tự (chữ viết) song TEXT khác với FILE
OF Char ở chỗ TEXT đợc tổ chức thành từng dòng với độ dài mỗi dòng khác nhau
nhờ có thêm các dấu hết dòng. Đó là cặp kí tự điều khiển :
- CR (Carriage Return) : nhảy về đầu dòng, mã số ASCII=13
- LF (Line Feed) : nhảy xuống dòng tiếp theo, mã số ASCII=10
Chúng đợc nhận dạng để ngăn cách giữa 2 dãy kí tự tơng ứng với 2 dòng khác
nhau
VD : Đoạn văn bản sau
VI DU
1234
HET
Máy sẽ chứa trong tệp văn bản thành một dãy nh sau :
VI DU CR LF 1234 CR LF HET EOF
b.Ghi vào tệp văn bản
Có 3 thủ tục
Write(Biến_Tệp, Item1, Item2,...ItemN);
Writeln(Biến_Tệp, Item1, Item2,...ItemN);
Writeln(Biến_Tệp);
Trong đó Item1, Item2,...ItemN là các hằng, biến, biểu thức có kiểu đơn giản nh
Integer, real, Boolean, String.
Cách viết vào tệp văn bản cũng nh cách viết ra màn hình nhng khác với màn hình
chỉ hạn chế có 80 dòng x 25 cột. Còn tệp văn bản có số dòng, cột không giới hạn
(xem lại Chơng 3 : Thủ tục vào ra dữ liệu)
c.Đọc dữ liệu từ tệp văn bản
Chúng ta có thể đọc không những kí tự từ tệp văn bản mà còn có thể đọc các số
nguyên số thực, boolean từ tệp văn bản thông qua các thủ tục
Read(Biến_Tệp, Var1, Var2,...VarN); (1)
Readln(Biến_Tệp, Var1, Var2,...VarN); (2)
Readln(Biến_Tệp); (3)
Trong đó Var1, Var2,...VarN là các biến kiểu Char, Integer, String, Real,
Boolean.
Thủ tục (2) đọc xong sẽ đa cửa sổ tệp sang đầu dòng tiếp theo
Thủ tục (3) không đọc gì cả chỉ đa cửa sổ tệp sang đầu dòng tiếp theo
8. Kiểm tra tệp khi mở
3
Xét đoạn chơng trình sau sẽ kiểm tra xem tệp F có trên đĩa hay không
VAR st:string;
F:TEXT;
BEGIN
Write('Nhập tên tệp : ');readln(st);
assign(f,st);{$I-} reset(f);
if ioresult=0 then write('Tệp ',St,' có trên đĩa')
else write('Tệp ',St,' không có trên đĩa')
END;
9. Tệp không định kiểu
Tệp không định kiểu là một kiểu file đặc biệt. Đó là tệp khi định nghĩa hay khai
báo ra, ta không nói rõ nó chứa gì, không nói rõ bản chất các dữ liệu ghi trong đó.
Vì vậy việc chuyển dữ liệu từ đĩa vào cấu trúc dữ liệu sẽ đợc thực hiện ngay lập
tức. Đó là lí do vì sao tệp không định kiểu đợc dùng rộng rãi trong các ứng dụng
đòi hỏi tốc độ cao.
Cách khai báo
VAR Biến_tệp : FILE;
Việc ghi và đọc dữ liệu đối với tệp không định kiểu thờng xuyên dùng đến 2 thủ
tục
BLOCKREAD và BLOCKWRITE
{ Nhập N. Sau đó nhập N số nguyên từ bàn phím Ghi các số đó vào file
'bai1.dat'. Sau đó mở lại file đó đọc N số đó và tính tổng của chúng (file kiểu
byte)}
uses crt;
var
i,a,n:byte;{i,a,n kiểu byte}
f:file of byte;{biến f kiểu tệp (byte)}
tong:integer;{tong kiểu integer}
begin
clrscr;{Xoá màn hình}
assign(f,'bai1.dat');rewrite(f);{Mở file bai1.dat để ghi}
write('N = ');readln(n);{Đọc N}
for i:=1 to n do{Cho i chạy từ 1 đến N}
begin
write('Nhap so thu ',i,' : ');readln(a);{Đọc số thứ i vào a}
write(f,a);{Ghi a vào f}
end;
close(f);{Đóng tệp F}
tong:=0;{Gán tong bằng 0}
assign(f,'bai1.dat');reset(f);{Mở file bai1.dat để đọc}
for i:=1 to n do{Cho i chạy từ 1 đến N}
begin
read(f,a);{Đọc từ f biến a}
inc(tong,a);{Cộng a vào tổng}
end;
writeln('Tong = ',tong);{Xuất tổng}
4
readln;
end.
{ Viết thủ tục taofile(s:string;n:integer) tạo ra n số nguyên ngẫu nhiên từ
1..10000 rồi sau đó ghi và file (kiểu integer)có tên là s
Sau đó thử tạo ra file 'bai21.dat' có 10 phần tử, 'bai22.dat' có 20 phần tử}
uses crt;
var
f:file of integer;{f kiểu tệp integer}
procedure taofile(s:string;n:integer);
var i,a:integer;{Khai báo i,a kiểu integer}
begin
assign(f,s);rewrite(f);{Mởi file s để ghi}
for i:=1 to n do{Cho i chạy từ 1 đến n}
begin
a:=random(10000)+1;{Gán a bằng số ngẫu nhiên từ 1..10000}
write(f,a);{Ghi a vào f}
end;
close(f);{Đóng tệp f}
end;
begin
randomize;
taofile('bai21.dat',10);
taofile('bai22.dat',20);
end.
{ Viết chơng trình tơng tự nh bài tập 2 nhng lần này tạo ra n kí tự ngẫu nhiên
trong khoảng từ 'A'..'Z' và ghi vào tệp 'bai3.dat'. Sau đó mở lại file đếm xem
có bao nhiêu kí tự 'A', bao nhiêu 'B'....}
uses crt;
var
dem:array['A'..'Z']of byte;{Mảng dem['A'..'Z'] kiểu byte}
f:file of char;{f kiểu tệp kí tự}
ch:char;{ch kiểu kí tự}
i,n:byte;{i,n kiểu byte}
procedure taofile(s:string;n:integer);
var i:byte;{Khai báo i kiểu byte}
begin
assign(f,s);rewrite(f);{Mở file s để ghi}
for i:=1 to n do{Cho i chạy từ 1 đến N}
begin
ch:=chr(random(26)+65);{Gán ch bằng kí tự ngẫu nhiên từ 'A'..'Z'}
write(f,ch);{Ghi ch vào f}
end;
close(f);{Đóng tệp f}
end;
begin
clrscr;{Xoá màn hình}
5