7.5.5. Mở tệp mới để ghi dữ liệu
Chương trình chỉ có thể ghi dữ liệu vào tệp sau khi ta đã làm thủ tục mở tệp. Việc mở tệp được tiến hành nhờ hai thủ tục sau:
ASSIGN( biếntệp, têntệp);
REWRITE( biếntệp);
Ví dụ 7.60: Gán tên tệp cho biến tệp, ở đây tên tệp là một biểu thức kiểu chuỗi tên thực sự của tệp.
Assign(F1,‘DLIEU.DAT’);
khởi tạo tệp DLIEU.DAT nhờ thủ tục
Rewrite(F1) ;
Assign(F3,‘QLSV.DAT’);
Rewrite(F3); {khởi tạo tệp QLSV.DAT}
Sau hai lệnh này máy khởi tạo tệp mới, nếu tệp đã có trên đĩa thì nó xóa đi và tạo mới, biến F1 đồng nhất với tệp DLIEU.DAT, mọi thao tác trên biến F1 chính là thao tác trên tệp DLIEU.DAT. Tương tự, biến F3 đồng nhất với tệp QLSV.DAT
Sau khi mở tệp xong, tệp sẽ rỗng vì chưa có phần tử nào, cửa sổ của tệp sẽ không có giá trị xác định vì nó trỏ vào cuối tệp.
*Chú ý:
- Nếu muốn tạo ra tệp trong một thư mục khác thì tên tệp phải bao gồm cả đường dẫn.
- Nếu trên đĩa đã có sẵn một tệp trùng tên thì nội dung của tệp này sẽ bị xoá. Tệp trở thành rỗng.
* Ghi dữ liệu vào tệp với thủ tục WRITE
Thủ tục WRITE sẽ ghi các giá trị mới vào tệp
WRITE( biếntệp, b1, b2, ..., bN);
Tuần tự ghi vào tệp các giá trị của các biến b1, b2, ..., bN. Các biến b1, ..., bN phải cùng kiểu dữ liệu với các phần tử của tệp.
Ví dụ 7.61:
- Cho i, j, k là các biến kiểu Integer và i=10, j=20, k=100, khi đó lệnh :
Write(F1,i,j,k);
sẽ ghi lần lượt các giá trị 10, 20, 100 vào tệp DLIEU.DAT
- Cho khai báo:
Var X : Ksvien;
Các lệnh sau gán giá trị cho X và ghi X vào tệp QLSV.DAT:
X.Ten:=’Nguyen Thanh Lam’;
X.Namsinh :=2002;
X.DTB :=6.5;
Write(F3, X);
Sau khi ghi X vào tệp QLSV.DAT, con trỏ tệp tự động dời đến vị trí của phần tử tiếp theo.
* Đóng tệp
Bước cuối cùng của việc ghi dữ liệu vào tệp là đóng tệp lại bằng thủ tục CLOSE để đảm bảo thông tin trên tệp là đầy đủ và tin cậy.
CLOSE( biếntệp);
Ví dụ 7.62: Chương trình sau ghi 10 số nguyên từ 1 đến 10 vào tệp SoNguyen.DAT
Program Ghi_Tep;
Var I : Integer;
f : File Of Integer;
Begin
Writeln('THU TUC WRITE, GHI DU LIEU VAO TEP TREN DIA');
Writeln('-------------------------------------------');
Writeln;
Assign(f,'SoNguyen.DAT');
Rewrite(f);
For i := 1 To 10 Do
Write(f,i);
Writeln;
Writeln('Da ghi vao tep SONGUYEN');
Writeln(' Bam ...');
Readln;
Close(f);
End.
7.5.6. Mở tệp đã tồn tại để đọc dữ liệu
Đối với các tệp 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 và đóng lại, ta có thể đọc lại các giá trị đã ghi trong tệp.
Một chương trình muốn sử dụng các dữ liệu đã chứa trong một tệp, đầu tiên phải mở nó ra để đọc.
Ta có hai thủ tục sau:
ASSIGN( biếntệp, têntệp);
RESET( biếntệp);
Sau lệnh RESET con trỏ tệp trỏ vào phần tử đầu tiên (có số thứ tự là 0) của tệp.
Ví dụ 7.63: Assign(F3, ‘QLSV.DAT’);
Reset ( F3); mở tệp QLSV.DAT
*đọc dữ liệu từ một tệp đã có
Để đọc dữ liệu từ tệp ta dùng thủ tục READ có cú pháp như sau:
READ( biếntệp, b1, b2, ..., bN);
Đọc tuần tự các phần tử của tệp từ vị trí hiện thời của con trỏ tệp và gán cho các biến b1, b2, ..., bN. Kiểu dữ liệu của các biến b1, b2, ..., bN phải cùng kiểu với các phần tử của tệp. Mỗi khi đọc xong một phần tử, con trỏ tệp tự động dời đến phần tử tiếp theo.
Ví dụ 7.64:
Lệnh Read(F1, i, j); đọc hai số nguyên trong tệp DLIEU.DAT (kể từ vị trí hiện thời) và gán cho các biến nguyên i, j .
Lệnh Read(F3, X); đọc bản ghi hiện thời của tệp QLSV.DAT và gán cho biến bản ghi X.
Chương trình sau sẽ đọc các phần tử của một tệp có tên được nhập từ bàn phím (kiểm tra sự tồn tại của tệp).
Program Doc_Tep;
Label tt;
Var
I,k : Integer;
Ten : String;
f : File Of Integer;
Begin
Writeln('THU TUC READ, DOC DU LIEU TU TEP TREN DIA');
Writeln('------------------------------------------');
tt:Writeln;
k := 0;
Write('-Cho biet ten tap tin: ');
Readln(Ten);
Assign(f,Ten);
{$I-}
Reset(f);
If IOResult <> 0 Then
{ham IOResult =0 tuc tep f co ton tai}
Begin
Writeln;
Writeln(' Khong co tep nay');
Write(' Bam de tim lai: ');
Readln;
Goto tt;
End;
While Not EOF(f) Do
Begin
Read(f,i);
Writeln(i);
k := k+1;
End;
Writeln;
Writeln('Tep: ',ten,' co: ',k:3,' phan tu');
Write(' Bam ...');
Readln;
Close(f);
End.
Ví dụ 7.65:
Nhập một danh sách sinh viên gồm Họ tên, điểm Toán, điểm Lý, tính điểm trung bình rồi lưu vào tệp HOSO.DAT. Sau đó đọc dữ liệu tệp này và in ra màn hình.
PROGRAM VIDU_7_65;
Uses CRT;
Const Tenttin = ‘HOSO.DAT’;
Type Ksvien= Record
Hoten: String[20];
Toan, Ly, Dtb : Real;
end;
KieuTtin = File of Ksvien ;
Var F : KieuTtin ;
X : Ksvien ;
i: Integer;
BEGIN
Clrscr;
Assign(F, TenTtin);
Rewrite(F);
i:=0;
Repeat
Clrscr;
Gotoxy(10,4);
Write(‘NHAP SV THU ‘,i,‘:(Enter đe ket thuc)‘);
With X do
begin
Gotoxy(10,6); Write(‘Ho va ten:’);
Gotoxy(10,8); Write(‘Diem Toan:’);
Gotoxy(10,10); Write(‘Diem Ly :’);
Gotoxy(20,6); Readln(Hoten);
If Hoten<>’’ then
begin
Gotoxy(20,8); Readln(Toan);
Gotoxy(20,10); Readln(Ly);
DTB:=(Toan+Ly)/2;
end;
end;
If X.Hoten<>’’ then
Write(F,X);
i:=i+1;
Until X.Hoten=’’;
Close(F);
Writeln(#32:5,‘Ho va ten’,#32:6,‘TOAN~~~LY~~~~DTB’);
Reset(F);
While Not Eof(F) do
begin
Read(F, X);
Writeln(X.Hoten, #32:20-Length(X.Hoten),
X.Toan:4:1,#32:3, X.Ly:4:1, #32:3, X.DTb:4:1);
end;
Close(F);
Readln;
END.
*Chú ý: Nếu tham số trong chương trình con là tệp thì nó phải là tham số biến, không thể là tham số trị.
Chia sẻ với bạn bè của bạn: |