A.Đặt vấn đề: Rèn luyện tư duy lôgic cho học sinh không
chỉ là nhiệm vụ của các thầy cô giáo dạy các môn toán,lý,hoá …mà còn là nhiệm vụ của các thầy cô dạy tin
học.
Khi dạy đến bài "kiểu dữ liệu
tệp-thao tác với tệp" học sinh thường kêu ca không hiểu gì cả ,quả thực là
như vậy nếu giáo viên không làm rõ từng vấn đề thìhọc sinh khó mà áp dụng được - sau khi đọc
bài này chắc các em sẽ hiểu rõ hơn cách tổ chức kiểu dữ liệu tệp và các thao
tác với tệp.
B.Nội dung bài
I / Phân loại :
Có
3 loại chính :
+
File văn bản ( Text) (trọng tâm bài)
+
File có kiểu , mỗi phần tử của File như một bản ghi
+
File không kiểu
II / File văn bản ( Text ):
1)
Định nghĩa : File văn bản là một kiểu dữ liệu lưu trữ dữ liệu dưới dạng
các kí tự theo từng dòng . Các kí tự này được mã số theo bảng mã ASCII .
Đặc biệt các kí tự 10,13,26 có nhiệm vụ riêng :
#13
: Báo hết 1 dòng( Dạng Hecxa
: 0D )
#10
: Về đầu dòng tiếp theo ( Dạng Hecxa : 0A )
#26
: Báo hết File( Dạng
Hecxa : 1A )
2)
Cách khai báo :
Cách
1Type TenkieuFile=
Text;
VarTenbienFile: TenkieuFile;
Cách
2VarTenbienFile: Text;
Thí
dụVarF1,F2: Text;
3)
Thông báo làm việc với 1 File :
ASSIGN(Tên_biến_File,Xâu_ký_tự_Tên_File);
Thí
dụ : ASSIGN(F1,’DAYSO.INP’); bắt đầu làm việc với biến file F1, biến này quản
lý File ‘DAYSO.INP’ trong thư mục hiện thời .
4)
Thông báo mở File để đọc :
RESET(Tên_Biến_File)
Thí
dụ : ASSIGN(F1,’DAYSO.INP’);
RESET(F1);
Sẽ
mở File ‘DAYSO.INP’ của thư mục hiện thời để đọc lấy các dữ liệu trong đó.
4)
Thông báo mở File để ghi :
REWRITE(Tên_Biến_File)
Thí
dụ : ASSIGN(F1,’DAYSO.OUT’);
REWRITE(F1);
Sẽ
mở File ‘DAYSO.OUT’ của thư mục hiện thời để ghi các dữ liệu vào File này.
Chú ý 1 : Lệnh
Rewrite(F) sẽ xoá các dữ liệu có sẵn trong File cũ do biến F quản lý , nó bắt
đầu tạo một File mới trùng tên File cũ . Để tránh tình trạng vô ý làm mất dữ
liệu cũ , muốn ghi thêm dữ liệu mới vào File , người ta gọi RESET(F) trước khi
gọi REWRITE(F) hoặc dùng lệnh thông báo mở File để ghi tiếp sau đây :
5)
Thông báo mở File để ghi tiếp :
APPEND(Tên_biến_File);
Chú ý 2 :Trong các lệnh Reset,Rewrite,Append nêu trên
nếu trước chúng có hướng dẫn biên dịch kiểm tra dữ liệu vào ra {$I-} thì khi
không gặp lỗi đọc,ghi File thì hàm IORESULT trả giá trị bằng 0 , trái lại nếu
có lỗi thì hàm này cho giá trị khác 0 .
6)
Đọc dữ liệu từ File
Trong
tổ chức File , có một biến con trỏ chỉ đến vị trí hiện thời cần đọc (đọc đến
đâu con trỏ này dời theo tới đó ).Sau lệnh reset(F) con trỏ ở vị trí đầu File .
Lệnh 1 :READ(F,danh_sách_biến) ;
Lần
lượt đọc các giá trị ghi trong File , bắt đầu kể từ vị trí hiện thời của con
trỏ , các giá trị này tương ứng gửi vào các biến kể từ trái sang phải trong
danh sách biến
Lệnh 2 :READLN(F,danh_sách_biến);
Lần
lượt đọc các giá trị ghi trong File , bắt đầu kể từ vị trí hiện thời của con
trỏ , các giá trị này tương ứng gửi vào các biến kể từ trái sang phải trong
danh sách biến . Sau đó con trỏ File tự động chuyển tới vị trí đầu dòng tiếp
theo của File
Lệnh 3 : READLN(F);
Không
đọc dữ liệu nào của dòng hiện thời , con trỏ của File chuyển ngay xuống đầu
dòng sau .
6)
Ghi dữ liệu vào File
Lệnh 1 :WRITE(F,danh_sách_biến)
;
Lần
lượt ghi các giá trị của các biến kể từ trái sang phải trong danh sách biến vào
trong File , bắt đầu kể từ vị trí hiện thời của con trỏ
Lệnh 2 :WRITELN(F,danh_sách_biến);
Lần
lượt ghi các giá trị của các biến kể từ trái sang phải trong danh sách biến vào
trong File , bắt đầu kể từ vị trí hiện thời của con trỏ. Sau đó con trỏ File tự
động chuyển tới vị trí đầu dòng tiếp theo của File
Lệnh 3 : WRITELN(F);
Không
ghi dữ liệu nào vào dòng hiện thời , con trỏ của File chuyển ngay xuống đầu
dòng sau , chờ lệnh ghi tiếp vào dòng này.
Chú ý 3 : Chỉ trong File
dạng văn bản ( dạng Text ) mới có các lệnh Readln, Writeln, Append .
Chú ý 4 : Khi ghi các
giá trị số vào File , giữa 2 số liền nhau phải ghi ít nhất 1 dấu cách (Kí tự 32
- bằng ấn Space bar ) hoặc kí tự kết thúc dòng ( Kí tự 13 - bằng ấn Enter )
Chú ý 5 : Tổ chức ghi
File theo qui luật như thế nào thì khi đọc File phải theo qui luật đó
Thí dụ :
Giả sử trong File ‘TD1.TXT’ chỉ ghi 1
dòng :
Trần văn Tin1810.08.09.0
bằng cách cho biến Hoten :=‘Trần văn Tin’;
biến
Tuoi := 18;
biến
Toan := 10.0;
biến
Van := 8.0;
biến
TBMon:= (Toan+Van)/2;
Sau đó để ghi các giá trị trên vào File
dùng các lệnh :
Assign(F,’TD1.TXT’);
Rewrite(F);
Writeln(F,Hoten,Tuoi,’‘,Toan,’‘,Van,’‘,TBMon);
Bây giờ muốn hiện các giá trị này lên màn
hình ta dùng các lệnh sau :
Assign(F,’TD1.TXT’);
Reset(F);
Readln(F,S,NS,T,V,TB);
Writeln(S,’‘,NS,’ ‘,T,’‘,V,’‘,TB);
Chú ý 6 :
Để tiện ích , trong Turbo thường dùng F3
để soạn các File văn bản chứa các bộ dữ liệu phục vụ Test (Kiểm tra ) các
chương trình .
7) Đóng File :
CLOSE(Tên_biến_File);
8) Xoá File :
ERASE(Tên_biến_File);
9) Một số hàm và thủ tục :
EOLN(Tên_biến_File);
+ Hàm cho giá trị TRUE nếu con trỏ File ở
vị trí sau giá trịcuối cùng của dòng
hiện thời , cho giá trị False khi con trỏ chưa tới vị trí của giá trị cuối cùng
của dòng
EOF
(Tên_biến_File);
+ Hàm cho giá trị TRUE nếu con trỏ File ở
vị trí sau dòng cuối cùng của File, cho giá trị False khi con trỏ chưa tới vị
trí sau dòng cuối cùng của File .
SEEKEOLN(Tên_biến_File);
+ Khi đọc File , cho con trỏ bỏ qua các kí
tự dấu cách không đọc , hàm có giá trị True khi con trỏ tới vị trí sau giá trị
cuối cùng của dòng hiện thời, ngược lại có giá trị False
SEEKEOF(Tên_biến_File);
+Khi đọc File , cho con trỏ bỏ
qua các kí tự dấu cách và các dòng trống không đọc , hàm có giá trị True khi
con trỏ tới vị trí sau dòng cuối cùng của File, ngược lại có giá trị False
Chú ý 7 : Máy in (thực
chất là bộ nhớ của máy in) được định nghĩa là 1 File văn bản có tên chuẩn
làLST . Vì vậy để ghi dữ liệu vào máy
in ( để in ra giấy ) một giá trị của biễn x ta dùng Lệnh 1 :Write(LST,x);
hoặc Lệnh
2 :Writeln(LST,x);
Lệnh
2 sau khi in xong giá trị của x thì in xuống đầu dòng tiếp theo .
III / File có kiểu gồm các phần tử cùng
kiểu :
1)
Định nghĩa : File có kiểu là một kiểu dữ liệu chứa các phần tử (Record
Component ) giống hệt nhau (độ dài, kiểu ...) . Mồi phần tử gọi là 1 bản ghi
của File .Con trỏ của File sẽ dịch chuyển từ bản ghi này tới bản ghi kia . Các
kiểu của phần tử có thể là các kiểu chuẩn đơn giản như :
Integer,Char,Byte,Real,String...) nhưng cũng có thể là những kiểu có cấu trúc
như : array, Record . Song phần tử của File không được là kiểu File.
2)
Khai báo :
Cách 1 :Type
Tên_kiểu_của_biến_File = Fileof Tên_kiểu_của_phần_tử;
VarTên_biến_File: Tên_kiểu_của_biến_File;
Cách 2 :VarTên_biến_File: Fileof Tên_kiểu_của_phần_tử;