Ở bộ nhớ trong RAM và sẽ bị mất khi tắt máy Với những bài toán trong đó dữ liệu cần được lưu trữ để xử lý nhiều lần và với khối lượng lớn thì sao?. Khái niệm và phân loại • Khái n
Trang 2Tất cả các kiểu dữ liệu đã xét :
Lưu trữ ở đâu và tồn
tại đến khi nào ?
Ở bộ nhớ trong (RAM)
và sẽ bị mất khi tắt máy
Với những bài toán
trong đó dữ liệu cần
được lưu trữ để xử lý
nhiều lần và với khối
lượng lớn thì sao ?
Ta cần có kiểu dữ liệu khác.
Trong TP đó là kiểu tệp (file)
Trang 3 Đặc điểm dữ liệu kiểu tệp
Được lưu trữ lâu dài ở ngoài (đĩa từ, CD, …) và không bị mất khi tắt nguồn điện vào máy.
Lượng thông tin lưu trữ trên tệp có thể rất lớn và chỉ phụ thuộc vào dung lượng đĩa
Khái niệm và phân loại
• Khái niệm
Tệp (file) là tập hợp dữ liệu được lưu trữ trên bộ nhớ ngoài (đĩa mềm, đĩa cứng )
• Phân loại
Tệp định kiểu
Tệp văn bản
Có 2 loại tệp trong Pascal
là tệp mà các phần tử có cùng một kiểu
gồm các kí tự được phân chia thành một hoặc nhiều dòng
• Cấu trúc
Trang 41 Khai báo biến tệp
Ví dụ:
F1 : FILE OF CHAR;
F2 : FILE OF INTEGER;
F3 : FILE OF REAL;
F4 : TEXT;
VAR <Tên biến tệp> : FILE OF <Kiểu phần tử tệp>;
Để làm việc với kiểu dữ liệu tệp ta phải khai báo biến tệp
Tệp định kiểu
Tệp văn bản
VAR <Tên biến tệp> : TEXT;
Các kiểu phần tử tệp: integer (kiểu số nguyên), real (kiểu số thực),
char (kiểu kí tự), array (kiểu mảng), text (kiểu văn bản) …
Trang 5Ghi Đọc
2 Xử lý tệp
Có 4 nhóm thao tác với tệp
Sơ đồ làm việc với tệp
Trang 62 Xử lý tệp
a) Gán tên
ASSIGN (<Tên biến tệp>, <Tên tệp>);
Ví dụ 1:
Giả thiết có biến xâu MYFILE và cần gán biến tệp F2 với tệp
có tên DULIEU.DAT Việc gán tên tệp được thực hiện như
sau :
MYFILE := ‘DULIEU.DAT ’;
ASSIGN (F2, MYFILE);
hoặc ASSIGN (F2, ‘DULIEU.DAT ’);
Ví dụ 2:
Để chuẩn bị thao tác với tệp có tên là INP.DAT trên thư mục
gốc đĩa C: , ta gắn nó với biếp tệp F3 như sau :
MYFILE : = ‘C:\INP.DAT’ ; ASSIGN (F3, MYFILE);
back
Sử dụng thủ tục Assign để gán tên của một tệp cho biến tệp
Cú pháp :
Trang 72 Xử lý tệp
b) Mở tệp
REWRITE (<Tên biến
tệp>);
Ví dụ 1:
TF : = ‘C:\ KQ.DAT
’ ; ASSIGN (F3, TF);
REWRITE (F3);
back
Sử dụng thủ tục Rewrite để ghi kết quả
Cú pháp :
RESET (<Tên biến tệp>);
Ví dụ 2:
TF : = ‘DL.INP ’ ; ASSIGN (F1, TF);
RESET (F1);
hoặc ASSIGN (F1, ‘DL.INP’);
RESET (F1);
Sử dụng thủ tục Reset để mở đọc 1 file đã tồn tại
Cú pháp :
Trang 82 Xử lý tệp
c) Đọc/ghi tệp định kiểu
READ (<Tên biến tệp>, <Tên biến);
Ví dụ 1:
Thủ tục đọc giá trị từ tệp gắn với biến tệp F1 và gán cho biến C :
READ (F1 , C)
back
Thủ tục Read đọc một (hay nhiều) phần tử của tệp tương
ứng gán vào một (hay nhiều) biến cùng kiểu với phần tử tệp
Cú pháp :
Cú pháp :
Thủ tục Write ghi giá trị một (hay nhiều) biến vào một (hay
nhiều) phần tử tệp Các biến phải cùng kiểu với phần tử tệp
WRITE (<Tên biến tệp>, <Tên biến);
Ví dụ 2:
Thủ tục ghi giá trị biến A vào tệp gắn với biến tệp F3 :
WRITE (F3 , A)
Trang 92 Xử lý tệp
d) Đóng tệp
CLOSE (<Tên biến tệp>);
Ví dụ 1:
Thủ tục đọc giá trị từ tệp gắn với biến tệp F1 và gán cho biến C :
CLOSE (F1) CLOSE (F3)
back
Thủ tục Close đóng một tệp đang mở
Cú pháp :
Lưu ý: Một tệp, sau khi đóng có thể mở lại Khi mở lại tệp, nếu vẫn
dùng biến tệp cũ thì không cần thiết phải dùng thủ tục ASSIGN gán lại
tên tệp
Trang 102 Xử lý tệp
e) Một số hàm và thủ tục chuẩn thường dùng trong
thao tác tệp
back
Hàm logic
EOF(<Tên biến tệp>);
cho giá trị TRUE nếu con trỏ tệp đang chỉ tới cuối tệp.
Thủ tục
SEEK(<Tên biến tệp>,<Biến nguyên>);
đưa con trỏ tệp về vị trí phần tử có số thứ tự xác định bởi giá trị Biến
nguyên (Các phần tử của tệp được đánh số thứ tự bắt đầu từ 0).
Trang 112 Xử lý tệp
f) Ví dụ áp dụng
back
Ví dụ 1: (Sach Giao Khoa trang 92)
PROGRAM KQ_TIN;
USES CRT;
TYPE BANGHI = RECORD
HOTEN : STRING[28];
DIEM : BYTE;
END;
VAR N : INTEGER;
BG : BANGHI;
F : FILE OF BANGHI;
TENTEP : STRING[10];
I : INTEGER;
BEGIN
CLRSCR;
WRITE( ‘So hoc sinh :’);
READLN(N);
TENTEP := ‘KQ.DAT’;
ASSIGN(F,TENTEP);
REWRITE(F);
FOR I:= 1 TO N DO BEGIN
WRITE(‘Ho va Ten :’);
READLN(BG.HOTEN);
WRITE(‘DIEM :’);
READLN(BG.DIEM);
WRITE(F,BG);
END;
CLOSE(F);
END
Trang 122 Xử lý tệp
f) Ví dụ áp dụng
back
Ví dụ 2 (Sach Giao Khoa trang 94)
PROGRAM VIDU_2;
USES CRT;
TYPE BANGHI = RECORD
HOTEN : STRING[28];
DIEM : BYTE;
END;
VAR F : FILE OF BANGHI;
N, TG : INTEGER;
BG : BANGHI;
TENTEP : STRING[10];
DIEM_TB : REAL;
BEGIN
CLRSCR;
N := 0; TG := 0;
TENTEP := ‘KQ.DAT’;
ASSIGN(F,TENTEP);
RESET(F);
WHILE NOT EOF(F) DO BEGIN
READ(F,BG);
TG := TG + BG.DIEM;
N := N + 1;
END;
DIEM_TB := TG/N;
WRITELN(‘Diem trung binh cua lop: ‘, DIEM_TB:4:1);
CLOSE(F) END
Trang 132 Xử lý tệp
g) Đọc/ghi tệp văn bản
READ (<Tên biến tệp>, <Danh sách biến>);
back
Thủ tục đọc Read
Cú pháp :
Thủ tục ghi Write
hoặc READLN (<Tên biến tệp>, <Danh sách biến>);
WRITE (<Tên biến tệp>, <Danh sách biến>);
Cú pháp :
hoặc WRITELN (<Tên biến tệp>, <Danh sách biến>);
Trong đó : Danh sách biến là một hoặc nhiều tên biến Trong trường hợp
nhiều biến thì các tên cách nhau bởi dấu phẩy.
Trong đó : Danh sách kết quả gồm một hoặc nhiều phần tử Trường hợp
có nhiều phần tử thì các phần tử này cách nhau một dấu phẩy Phần tử có
thể là tên biến, biểu thức (số học, quan hệ hoặc logic) hoặc hằng xâu
Trang 142 Xử lý tệp
g) Đọc/ghi tệp văn bản
back
Ví dụ 1:
Giả thiết trong chương trình có khai báo:
VAR FA, FB : TEXT;
và tệp FA được mở để đọc, còn tệp FB để ghi Khi đó:
– Có thể có các thủ tục đọc tệp FA như sau:
READ (FA,A,B,C);
hoặc READLN(FA,A,B,C);
– Có thể có các thủ tục ghi ra tệp FB như sau:
WRITE(FB, ‘A= ’, A, ‘B= ‘, B, ‘C= ‘, C);
WRITELN(FB, ‘X1=’, (–B – SQRT(B*B – 4*A*C))/(2*A):8:3);
Trang 15Ví dụ 2:
Xét đường gấp khúc khép kín không tự cắt N đỉnh trong mặt phẳng, có các cạnh song song với trục tọa
độ và các đỉnh có tọa độ nguyên
Đường gấp khúc 16 đỉnh
Trang 16Chương trình sau thực hiện :
Nhập từ bàn phím số N, tọa độ các đỉnh liên tiếp của đường gấp khúc
và ghi tọa độ các đỉnh ra tệp văn bản GAPKHUC.INP, mỗi dòng chứa
2 số nguyên là tọa độ một đỉnh Các số trên một dòng cách nhau một dấu cách
Chương trinh
Ví dụ 2:
PROGRAM GAPKHUC;
USES CRT;
VAR F : TEXT
I, N, X, Y : INTEGER;
TF : STRING[80];
BEGIN
CLRSCR;
WRITE(‘ N = ‘); READLN(N);
TF := ‘GAPKHUC.INP’;
ASSIGN(F,TF);
REWRITE(F);
FOR I:= 1 TO N DO BEGIN
WRITE(‘ X, Y : ’); READLN(X,Y); WRITELN(F, X, ‘ ’, Y);
END;
CLOSE(F);
END
Trang 17Ví dụ 3:
Chương trình sau đọc dữ liệu của ví dụ 2 chứa ở tệp GAPKHUC.INP, tính chu vi hình giới hạn bởi đường gấp khúc và đưa kết quả ra tệp văn bản GAPKHUC.OUT
PROGRAM VI_DU3;
USES CRT;
VAR FA, FB : TEXT;
L : LONGINT;
X0, Y0, X1, Y1, X, Y : INTEGER;
BEGIN
ASSIGN (FA, ‘GAPKHUC.INP’);
RESET(FA);
READLN(FA, X, Y);
X0 := X; Y0 := Y; L := 0;
WHILE NOT EOF(FA) DO BEGIN
X1 := X; Y1:= Y; READLN(FA,X,Y); L:= L + ABS(X – X1) + ABS(Y – Y1); END;
L := L + ABS (X – X0) + ABS(Y – Y0);
CLOSE(FA);
ASSIGN(FB, ‘GAPKHUC.OUT’);
REWRITE(FB);
WRITELN(FB, ‘Chu vi : ‘, L);
CLOSE(FB) END.