Kiểu bản ghi và kiểu tập tin
9.2.3. Các thao tác trên tập tin
a. Mở tập tin để cất dữ liệu
Ch−ơng trình chỉ có thể cất dữ liệu vào một tập tin sau khi ta làm thủ tục mở tập tin. Việc mở tập tin đ−ợc tiến hành với hai thủ tục đi liền nhau theo thứ tự.
Assign(<File Var>, <FileName>);
Rewrite(<FileVar>);
ở đây <FileVar> là biến kiểu tập tin, <FileName> là một hằng chuỗi kí tự gán cho tập tin đặt trong thiết bị nhớ ngoài (Quy tắc đặt tên theo quy định của HĐH). Nên đặt tên sao cho nó phản ánh đ−ợc ý nghĩa hay bản chất nội dung của tập tin.
Ví dụ 8. Các lệnh sau đây cho phép mở các tập tin F1 và F2 có tên trên đĩa t−ơng ứng là ‘LUONG.DAT’ và ‘NGUYEN.DAT’. Assign(F1,‘LUONG.DAT’); Rewrite(F1); Assign(F2,‘NGUYEN.DAT’); Rewrite(F2);
Sau khi mở tập tin xong, tập tin sẽ rỗng vì tập tin ch−a có phần tử nào, cửa sổ tập tin sẽ không có giá trị xác định vì nó trỏ vào cuối tập tin (EOF).
Chú ý. Khi mở tập tin, nếu trên bộ nhớ ngoài đã có sẵn tập tin có tên trùng với tên tập tin đ−ợc mở thì nội dung tập tin cũ sẽ bị xoá.
Ghi các giá trị vào tập tin với thủ tục WRITE. Thủ tục Write sẽ đặt các giá trị mới vào tập tin.
Cú pháp:
Write(<File Var>, <Item1>,<Item2>,...,<ItemN>);
trong đó <Item1>,<Item2>,...,<ItemN> là các giá trị cần ghi vào tập tin, có thể là các hằng, biến, biểu thức.
Ví dụ 9. Ghi vào tập tin các số nguyên (NGUYEN.DAT) các giá trị 4, 15, 31 ta viết: Write(F2, 4, 15, 31);
khi đó nội dung của tập tin NGUYEN.DAT sẽ nh− sau: 4 15 31 EOF
và vị trí cửa sổ ở phần tử cuối tập tin, cụ thể là ở đây là ở giá trị 31.
b. Đóng tập tin
B−ớc cuối cùng của việc đặt dữ liệu vào tập tin là đóng tập tin lại bằng thủ tục CLOSE để đảm bảo thông tin trên tập tin này là đầy đủ và tin cậy.
Cú pháp:
Close(<FileVar>);
Ví dụ 10. Tạo một tập tin chứa các số nguyên từ 1 đến 100 với tên tập tin trên đĩa là NGUYEN.DAT.
Program Tao_Tap_Tin_1; Var
i : Byte;
F : File Of Byte; Begin
Assign(F,’NGUYEN.DAT’);
Rewrite(F);
For i:= 1 To 100 Do Write(F,i);
Close(F); End.
Một tập tin có thể đ−ợc dùng làm tham số của ch−ơng trình con với lời khai báo bắt buộc phải sau chữ Var tức là tập tin đ−ợc dùng làm tham biến. Chẳng hạn nh− trong ví dụ sau:
Ví dụ 11. Program Tao_Tap_Tin_2; Type F1 = File Of Byte; St30 = String[30]; Var Myfile: F1; FileName : St 30;
Procedure Tao_File(Var F: F1; Ten: St30); Var i = Byte;
Begin
Assign(F,Ten); Rewrite(F);
For i:=1 To 100 Do Write(F,i); Close(F);
End;
Begin {CT_Chinh} Write (‘Ten tap tin: ’); Readln(FileName);
Tao_File(MyFile, FileName); End.
c. Đọc dữ liệu từ một tập tin đã có
Đối với tập tin tuần tự, ta không thể vừa ghi vừa đọc đ−ợc cùng một lúc. Sau khi ghi dữ liệu vào tập tin và đóng lại, ta có thể đọc lại các giá trị dữ liệu trong tập tin.
Một ch−ơng trình muốn sử dụng các dữ liệu đã đ−ợc chứa trong một tập tin, đầu tiên phải mở tập tin đó ra để đọc.
d. Mở tập tin để đọc
Mở tập tin để đọc ta sử dụng cặp lệnh:
Assign(<FileVar>, <FileName>);
Reset(<FileVar>);
Sau lệnh Reset nếu tập tin không rỗng thì cửa sổ bao giờ cũng trỏ vào phần đầu tiên của tập tin và ch−ơng trình sẽ copy phần tử của tập tin đ−ợc trỏ sang biến đệm của cửa sổ. Nội dung của tập tin này không bị xoá. Nếu ta mở tập tin ch−a tồn tại trên đĩa sẽ có lỗi thời gian thi hành.
e. Đọc dữ liệu từ tập tin
Dùng thủ tục READ dạng nh− sau:
Read(<FileVar>,<Var1>,<Var2>, ... ,<VarN>);
trong đó <Var1>,<Var2>, ... ,<VarN> là các biến có cùng kiểu với kiểu thành phần của <FileVar>. Gặp lệnh này, máy sẽ đọc các giá trị tại vị trí cửa sổ đang trỏ (nếu có) gán sang biến cùng kiểu t−ơng ứng sau đó cửa sổ dịch chuyển đến vị trí tiếp theo và đọc giá trị cho biến khác, cứ thế đọc cho đến biến <VarN>.
READ chỉ có thể đọc các giá trị của tập tin để gán giá trị cho các biến. Việc đọc một phần tử của tập tin cần có điều kiện: Phải thử xem tập tin có còn phần tử nào không – tức là cửa sổ ch−a trỏ đến EOF. Do đó tr−ớc khi làm một thao tác gì để đọc tập tin gán cho biến X, cần phải thử xem tập tin đó đã kết thúc ch−a bằng câu lệnh:
If Not Eof(<FileVar>) Then Read(<FileVar>,X)
Hoặc nếu muốn đọc tất cả các phần tử của tập tin ta có thể viết: While Not Eof(<FileVar>) Do
Begin
Read(<FileVar>,X); ...
End;
Công việc cuối cùng kết thúc việc đọc tập tin là đóng tập tin lại với thủ tục : lose(<FileVar>).
Ví dụ 12. Giả sử đã tồn tại một tập tin là NGUYEN.DAT chứa các số kiểu byte có chứa ít nhất là 3 phần tử. Ch−ơng trình sau đây đọc ra giá trị thứ nhất và thứ ba của tập tin và gán cho hai biến A, B t−ơng ứng.
Var A,B :Byte; FI : File Of Byte; Begin Assign(FI,”NGUYEN.DAT); Reset(FI);
Read(FI,A); {Doc 1 phan tu thu 1 của file ra bien A} Read(FI,B); {Doc 1 phan tu thu 2 của file ra bien B} Read(FI,B); {Doc 1 phan tu thu 3 của file ra bien B} Close(FI);
End.
Ba lần đọc Read(FI,...) ở trên có thể thay thế bằng một lệnh đọc duy nhất: Read(Fi,A,B,B);
Ví dụ 13. Ch−ơng trình sau đây đọc tất cả các phần tử của tập tin chứa các số có kiểu Byte nào đó và ghi ra màn hình giá trị các số đó và cuối cùng ghi ra số phần tử của tập tin.
Program Doc_2; Uses Crt; Var i, So_pt :Byte; Fi : File Of Byte; FileName: String[20]; Begin Clrscr;
Write(‘Cho biet ten file (chua cac so nguyen):’);Readln(Filename); Assign(FI,FileName);
Reset(FI); So_pt:=0;
While Not EOF (FI) Do Begin
Read(FI,i); {doc mot phan tu của file ra bien i} Write(i, ‘ ’);
Close(FI); Writeln;
Write(‘So_Phan_Tu_Cua_File: ’ , FileName, ‘la:’, So_pt); Readln
End.