chơng VII Dữ liệu kiểu bản ghi và kiểu tệp
II. Dữ liệu Kiểu tệp
8. Tệp văn bản (TEXT Files)
Trong Pascal có một kiểu tệp đã đợc định nghĩa với tên chuẩn TEXT.
Ví dụ. Khai báo các biến tệp F1,F2 có kiểu TEXT:
VAR
F1,F2: TEXT;
Thành phần cơ sở của tệp kiểu TEXT là kí tự. Tuy nhiên tệp văn bản đợc cấu trúc thành các dòng, mỗi dòng đợc kết thúc bởi dấu eoln (end of line), với Turbol Pascal đó là cặp kí tự điều khiển CR (Carriage Return: nhảy về đầu dòng, mã ASCII = 13) và LF (Line Feed: nhảy thẳng xuống dòng tiếp theo, mã ASCII =10). Nh vậy tệp văn bản khác với File Of Char. Với File of Char thì coi dấu hết dòng nh một kí tự bình thờng. Nh vậy muốn đọc và in ra từng dòng của tệp văn bản thì dùng dạng text, muốn đọc và in ra từng kí tự của tệp văn bản thì dùng File Of Char.
Tệp văn bản đợc kết thúc bởi dấu End-of-File, cụ thể với Turbol Pascal là Ctrl-Z(^Z), mã
ASCII = 26. Chẳng hạn, tệp các chơng trình nguồn của Pascal, Basic, công văn, bức th,... là một tệp văn bản.
Ví dụ. Đoạn văn bản:
BO MON TOAN Ma so 1221
sẽ chứa trong tệp văn bản thành một dãy nh sau:
BO MON TOAN CRLF Ma so 1221 EOF
Vì chiều dài của các dòng thờng là khác nhau, cho nên tệp văn bản chỉ có thể truy nhập theo kiểu tuần tự. Ngoài ra không thể tiến hành cả hai hoạt động đọc và ghi cùng lúc trên tệp văn bản.
Các thủ tục đã trình bày đối với tệp có cấu trúc cũng sử dụng đợc trong tệp văn bản, tuy nhiên tệp văn bản có các đặc điểm khác đợc trình bày sau đây.
a, hàm chuẩn
- Hàm EOF(var f:Text):Boolean. Trả về giá trị False khi cửa sổ tệp cha đến điểm cuối tệp, ngợc lại cho giá trị True. Hàm này hờng dùng để kiểm tra xem đã đọc hết tệp văn bản cha.
VÝ dô:
While Not EOF(F) Do...
- Hàm EOLN(var F:Text):Boolean. Trả về giá trị False khi cửa sổ tệp cha đến điểm cuối dòng hay cuối tệp, ngợc lại cho giá trị True. Hàm này thờng dùng để kiểm tra xem đã đọc hết dòng cha. Ví dô:
While Not EOLN(F) Do ...
b, Ghi vào một tệp văn bản
Chúng ta có thể ghi các giá trị kiểu integer, real, boolean, string vào tệp văn bản bằng lệnh Write hay Writeln. Cách ghi này cho phép chuyển các giá trị bằng sôsang dạng kí tự, tức là dới dạng
đọc đợc một cách tờng minh nh trên trang giấy viết bình thờng, cho phép viết các biểu bảng dữ
liệu ... với qui cách mong muốn. Có ba dạng viết:
Write(FileVar, Item1,Item2,...,ItemN); (1) Writeln(FileVar,Item1,Item2,....,ItemN); (2) Write(FileVar); (3)
Lệnh (1): viết các giá trị của các Item1,Item2,...,ItemN là các hằng hay biểu thức có kiểu
đơn giản nh: Nguyên, Thực, Kí tự, Chuỗi, Logic vào biến tệp FileVar.
Lệnh (2): tơng tự nh (1) nhng đa thêm dấu hiệu hết dòng vào tệp sau khi đã viết hết các giá
trị Item1,...,ItemN.
Lệnh (3): chỉ thực hiện việc đa thêm dấu hiệu hết dòng vào tệp.
VËy (2) <-->
Be gin Wr ite(
Fil eva r,It em 1);
....
Wr
ite(
Fil eva r,It em N);
Wr itel n(F ilev ar) En d;
Ví du: sau khi khai báo:
Var a: Byte;
x:Real;
St:String;
Ta cã thÓ viÕt: Write(FileVar,’Vi du: ‘,a,x+5,St);
Ví dụ. Chơng trình sau tạo một tệp văn bản có năm dòng:
Program tao_File;
Var
F:Text;
Begin
Assign(F,’VanBan.Txt’);
Rewrite(F);
Writeln(F,’Cong Hoa Xa Hoi Chu Nghia Viet Nam’);
Writeln(F,’Doc lap - Tu do - Hanh phuc’);
Writeln(F,’---‘);
Writeln(F);
Writeln(F,’Danh sach hoc vien lop Pascal’);
Writeln(F,’*** Khoa I ***’);
Close(F);
End.
Chú ý: trong Write, Writeln có thể dùng cách in có qui cách nh đã trình bày.
c, Đọc dữ liệu từ tệp văn bản
Chúng ta có thể đọc không những các kí tự từ tệp văn bản mà còn có thể đọc lại các số nguyên, thực, logic từ tệp văn bản thông qua các thủ tục:
Read(FileVar, Var1, Var2,...,VarN);
Readln(FileVar, Var1, Var2,...,VarN);
Readln(FileVar);
Trong đó Var1,...,VarN là các biến thuộc kiểu Kí tự, Nguyên, Thực, Logic, Chuỗi.Read đọc một hay nhiều phần tử mà không chuyển cửa sổ tệp xuống dòng, Readln cũng đọc nh Read nhng di chuyển cửa sổ tệp sang đầu dòng tiếp theo sau khi đã lần lợt đọc các biến tơng ứng.
Readln(FileVar): đa cửa sổ tệp sang đầu dòng tiếp theo mà không đọc gì cả.
Ví dụ. Chơng trình sau đây đọc và in ra màn hình nội dung tệp văn bản VanBan.Txt đợc tạo ra từ chơng trình trên.
Program Doc_File;
uses Crt;
Var
F:Text;
Dong:String[80];
Begin
Clrscr;
assign(F,’VanBan.Txt’);
Reset(F);
While Not EOF(F) Do Begin
Readln(F,dong);
Writeln(dong);
End;
Close(F);
Readln;
End.
d, Thủ tục thêm dòng Cú pháp:
Append(Var F:Text);
Lệnh Append mở tệp văn bản để ghi bổ sung các dòng, định vị trí cửa sổ tệp vào cuối tệp.
Lần thủ tục Write hay Writeln kế tiếp với biến tệp sẽ thêm văn bản mới vào cuối tệp.
Ví dụ. Chơng trình sau đây thêm hai dòng vào cuối tệp VanBan.Txt Program Them;
Var
F:Text;
Begin
assign(F,’VanBan.Txt’);
Append(F);
Writeln(F,’Day la dong thu nhat them vao’);
Writeln(F,’Day la dong thu hai them vao’);
Close(F);
End.
e, Các tệp thiết bị
Một số phần mềm của Pascal coi các thiết bị ngoài nh các tệp văn bản, nghĩa là việc xuất nhập
đợc thực hiện bằng các thao tác nh với tệp văn bản. Chẳng hạn đối với Turbo Pascal ta có thể sử dụng các tệp chuẩn sau (không cần khai báo lại);
OUTPUT: là tệp xuất cơ bản. Thông thờng OUTPUT đã đợc tự động gán cho màn hình. Khi dùng biến tệp OUTPUT, các thủ tục Write, Writeln không cần ghi rõ OUTPUT. Đó cũng chính là các cách viết Write, Writeln mà ta đã đợc học từ đầu. Ví dụ:
Writeln(a,b,c):đợc hiểu ngầm là Writeln(OutPut,a,b,c);
Writeln; đợc hiểu ngầm là Writeln(OutPut);
INPUT: là tệp nhập cơ bản tơng ứng với tệp chứa dữ liệu nguồn vào, thờng đợc tự động gán cho bàn phím (trớc đây có thể là máy đọc bìa, đọc băng). INPUT không phải ghi vào vị trí FileVar trong thủ tục Read hay Readln. Ví dụ:
Read(Var); đợc hiểu là Read(Input,Var);
-LST: trong Turbo Pascal máy in đợc định nghĩa là biến tệp có tên LTS. Biến này đợc đặt trong đơn vị chơng trình PRINTER.TPU, vì vậy chỉ cần viết: uses PRINTER; Khi đó để in ta dùng thủ tục:
Write(LTS,...);
Writeln(LTS,...);
Ví dụ. Chơng trình sau in tệp văn bản VanBan,Txt ra máy in.
Program In_File;
Uses Printer;
Var
F:Text;
Dong:String[80];
Begin
assign(F,’VanBan.Txt’);
Reset(F);
While Not EOF(F) Do Begin
Readln(F,dong);
Writeln(Lts,dong);
End;
Close(F);
Readln;
End.
Bài tập dữ liệu kiểu bản ghi và kiểu tệp
1. Viết chơng trình quản lý điểm của một lớp học gồm có các nhiệm vụ sau:
a. Nhập hồ sơ của mỗi học sinh gồm có: họ và tên, năm sinh, điểm trung bình học kỳ một, điểm trung bình học kỳ hai.
b. In danh sách các học sinh của lớp có điểm trung bình toàn năm từ 5 trở lên và theo thứ tự giảm dần của điểm trung bình toàn năm.
c. In danh sách các học sinh phải thi lại (điểm trung bình toàn năm duới 5) theo thứ tự abc của tên.
d. In bảng thống kê tần xuất (số lần xuất hiện) của các loại điểm trung bình toàn năm.
2. Viết chơng trình in ra phiếu thanh toán tiền thuê máy tính theo mẫu sau:
Phiếu thanh toán tiền thuê máy tính Họ tên ngời sử dụng :
Đơn vị công tác : Ngày thuê máy : Tõ giê: §Õn giê:
Tổng số giờ thuê máy : Số tiền phải trả :
Các số liệu nhập vào từ bàn phím. Tiền một giờ thuê máy là 3000 đồng. Cuối cùng in ra bảng tổng kết ngày có dạng:
THống kê tiền thuê máy Ngày Tháng Năm
ST T
Họ và tên
Đơ
n vị Sè giê
Sè tiÒn
1 2 ...
Tổng cộng:
Thủ quỹ:
3. Cho mét cÊu tróc Record nh sau:
Type
TuThuoc = Record
MaThuoc:String[2]; {mã thuốc}
TenThuoc: String[20]; {tên thuốc}
DonViTinh: String[6]; {đơn vị tính}
SoLuong:Integer; {số lợng}
DonGia: Real; {đơn giá}
End;
a. Hãy viết chơng trình nhập số liệu với màn hình nhập nh sau:
Sở Y tế HN Hiệu thuốc QD 1
*******
PhiÕu nhËp thuèc míi
Mã thuốc : Tên thuốc :
Đơn vị tính :
Số lơng : Đơn giá :
b. Viết chơng trình dò tìm dữ liệu với yêucầu sau:
- Nhập từ bàn phím mã thuốc cần dò tìm, nếu mã bằng khoảng trắng thì kết thúc dò tìm.
-Nếu mã thuốc khác khoảng trắng thìdò tìm xem có mã thuốc nào nh vậy không? Nếu có thì
in ra màn hình các thông tin liên quan đến mã thuốc đó, sau đó quay về nhập mã thuốc khác.
c. Viết chơng trình nhập thêm một số loại thuốc mới theo yêu cầu ngời nhập.
d. Viết chơng trình xoá một số loại thuốc khỏi danh sách.
4. hàm RANDOM tạo một số ngẫu nhiên trên đoạn [0,1]. hãy tạo 3000 số ngẫu nhiên và ghi ra tệp văn bản: mỗi dòng có 8 số, các số cách nhau hai kí tự, một số có 6 số lẻ.
5. LËp tr×nh tÝnh tÝch hai ma trËn C(m,p)= A(m,n) x B(n,p).
Dữ liệu về A và B đợc đọc vào từ tệp văn bản INPUT.TXT: dòng đầu tiên của tệp ghi m,n,p;
các dòng sau ghi lần lợt các dòng của ma trận A, các dòng của ma trận B, mỗi số cách nhau ít nhất bởi một dấu các trắng. Ma trận kết quả C ghi vào tệp văn bản OUTPUT.TXT: ma trận in theo dòng, bắt đầu một dòng có thông báo số thứ tự dòng, mỗi dòng văn bản in 5 số, mỗi số dành 13 chỗ và in 5 số lẻ. Ví dụ hai tệp:
IN PU T.T XT
OU TP UT .T XT 2 3 2
Do ng 1 cua C:
1 2 3 4 5 6
50.
000 00 14.
000 00 7 1 8 2 9 3
Do ng 2 cua C:
12 2.0 000 0 32.
000 00
PhÇn IV