I. Khái niệm về tệp
II. Cấu trúc và phân loại tệp
III. Mở tệp mới để cất dữ liệu
IV. Đọc dữ liệu từ một tệp đã có
V. Tệp truy nhập trực tiếp
VI. Các thủ tục và hàm xử lý tệp của Turbo PASCAL
VII. Tệp văn bản (TEXT Files)
VIII. Tệp không định kiểu (UnTyped File)
34 trang |
Chia sẻ: Mr Hưng | Lượt xem: 1246 | Lượt tải: 0
Bạn đang xem trước 20 trang nội dung tài liệu Cơ sở dữ liệu - Chương 14: Kiểu dữ liệu có cấu trúc: Kiểu tệp (File), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
14.1
Có 4 kiểu dữ liệu có cấu trúc:
ARRAY, SET, RECORD, FILE
Chương 14
Kiểu dữ liệu có cấu trúc:
Kiểu tệp (File)
14.2
I. Khái niệm về tệp
II. Cấu trúc và phân loại tệp
III. Mở tệp mới để cất dữ liệu
IV. Đọc dữ liệu từ một tệp đã có
V. Tệp truy nhập trực tiếp
VI. Các thủ tục và hàm xử lý tệp của Turbo PASCAL
VII. Tệp văn bản (TEXT Files)
VIII. Tệp không định kiểu (UnTyped File)
Nội dung học của chương: Tệp
14.3
I. Khái niệm về tệp
Tệp (hay tệp dữ liệu) nói chung là
tập hợp các phần tử dữ liệu có liên quan với
nhau và có cùng kiểu dữ liệu,
được lưu trữ trong bộ nhớ ngoài (băng từ,
đĩa mềm, đĩa cứng ...),
mỗi tệp có một tên.
Tiếng Anh: File, tiếng Pháp: Fichier được
dùng để chỉ các ngăn đựng hồ sơ treo, tủ
phiếu thư viện
14.4
Thí dụ
Tủ phiếu thư viện
Tệp=hộp đựng các phiếu ghi
A B C
Tên ... ...
... ... Z
M
Tên tệp
Tủ phiếu = đĩa Mỗi ngăn kéo = 1 tệp
Tên sách: PASCAL
Tên tác giả: Q.T. Ngọc
NXB: Giáo dục
....
Mỗi phiếu = 1 bản ghi
14.5
So sánh với định nghĩa ARRAY
Giống nhau: dãy các phần tử cùng kiểu
Khác nhau:
ARRAY có số phần tử xác định trước.
FILE có số phần tử không xác định trước.
ARRAY lưu trữ dữ liệu ở bộ nhớ trong RAM nên
không giữ lại được dữ liệu khi mất điện hay khi kết
thúc chương trình.
FILE lưu trữ dữ liệu ở bộ nhớ ngoài nên giữ được
dữ liệu khi mất điện hoặc kết thúc CT.
Muốn lưu trữ hồ sơ cán bộ ... phải dùng FILE
14.6
Khai báo tệp
TYPE
Kiểu_tệpT = FILE OF kiểu_phần_tử;
VAR
Biến_tệp: Kiểu_tệpT;
Mỗi ô là một phần tử của tệp, với dấu hiệu kết thúc tệp...
TYPE {Định nghĩa các kiểu tệp }
FileInteger = FILE OF integer;
FileReal = FILE OF real;
FileBoolean = FILE OF boolean;
VAR {Khai báo các biến tệp }
F1,F2: FileInteger;
F3:FileReal; { F3 là tệp các số thực }
End of File
14.7
TYPE
NhânSự = RECORD
Tên : String[30];
Tuổi: byte;
Lương : real;
END;
FNhânSự = FILE OF NhânSự;
VAR
FNS: FNhânSự; {FNS:Tệp các bản ghi nhân sự}
F5 : FILE OF Char; {Khai báo trực tiếp}
F6 : FILE OF ARRAY [1..5] OF INTEGER;
14.8
II. Cấu trúc và phân loại tệp
Cách truy nhập vào các phần tử của tệp:
Các phần tử của tệp không có tên hay kí hiệu như
ARRAY và RECORD.
Tại mỗi thời điểm, ta chỉ có thể truy nhập (ghi hoặc
đọc) vào một phần tử nhất định của tệp thông qua vị trí
của một cửa sổ. Hãy hình dung cuộn phim và ống kính.
Mỗi tệp F đều có một dấu hiệu đặc biệt đánh dấu kết
thúc tệp. Hàm EOF(F) kiểu Boolean báo cho ta biết vị
trí cửa sổ tệp đã đến vị trí cuối tệp chưa ?
Cửa sổ nhìn tệp
EOF(F)
14.9
Cách phân loại tệp: theo cách truy cập
Truy cập tuần tự: muốn vào phần tử thứ n bắt
buộc phải đi qua n-1 phần tử trước đó. Thí dụ:
băng từ.
Trong PASCAL, ngầm định là tệp tuần tự.
Truy cập trực tiếp: là tệp có thể đặt cửa sổ tệp
vào bất kì phần tử nào. Thí dụ: đĩa mềm, đĩa
cứng... Lí do: đầu từ ghi/đọc có thể di chuyển
thẳng vào vị trí mong muốn.
14.10
III. Mở tệp mới để cất dữ liệu
Gồm các bước cơ bản:
ASSIGN(Biến_Tệp, Tên_Tệp); Gán tên tệp
REWRITE(Biến_Tệp); Mở tệp mới ...
...Write(Biến tệp, các giá trị);
CLOSE(Biến_tệp); Đóng tệp lại
hoặc
ASSIGN(FileVar, FileName);
REWRITE(FileVar);
...Write(FileVar, Item1, Item2,...);
CLOSE(FileVar);
Sau thủ tục Rewrite, cửa sổ tệp nằm ở vị trí đầu tiên
của tệp để sẵn sàng nhận giá trị ghi vào.
14.11
Tên tệp
*.PAS các tệp chứa chương trình Pascal
*.FOR các tệp chứa chương trình FORTRAN,
*.BAS chứa chương trình viết bằng BASIC,
*.ASM là các chưng trình viết bằng ASSEMBLER,
*.DOC chứa tệp văn bản tài liệu, (DOCument)
*.TXT chứa tệp văn bản (TeXT)
*.COM và *.EXE là các tệp chứa chưng trình
dưới dạng mã máy có thể chạy ngay
được trên máy vi tính IBM-PC.
*.DAT chứa các dữ liệu cần xử lý (DATa).
*.SAM chứa các mẫu (SAMple) tín hiệu điện trong
xử lý tín hiệu số.
........
14.12
Ghi giá trị vào tệp:
WRITE(FileVar, Item1, Item2, ...., ItemN);
WRITE(Biến_Tệp, Các giá trị cần ghi vào);
với
Item1, Item2,... ItemN: các hằng, biến, biểu thức,
Các Item phải có cùng kiểu phần tử của tệp.
Thí dụ: Ghi các số nguyên vào tệp F1
WRITE(F1, 3, I+2*J, K, 5);
Mỗi một lần ghi xong một giá trị, cửa sổ của tệp sẽ chuyển
sang vị trí mới tiếp theo.
14.13
Thí dụ 14.3
Tạo một tệp chứa các số nguyên từ 1 đến 100 với tên tệp
trên bộ nhớ ngoài (đĩa mềm ...) là NGUYEN.DAT.
PROGRAM TAO_TEP_1;
VAR
I:integer;
F: File OF integer;
Begin
ASSIGN(F, 'NGUYEN.DAT');
REWRITE(F);
FOR I:=1 TO 100 DO Write(F, I);
CLOSE(F);
End.
14.14
PROGRAM TAO_TEP_2;
TYPE
FI= File OF integer; St30 = String[30];
VAR
MyFile: FI; FileName: St30;
(*-------------------------------------------*)
Procedure Tao_File(Var F: FI; Ten: St30);
Var I :integer;
Begin
ASSIGN(F, Ten); REWRITE(F);
For i:=1 To 100 DO Write(F, I);
CLOSE(F);
End;
(*-------------------------------------------*)
BEGIN
Write(' Ten Tep : '); Readln(FileName);
Tao_File(MyFile, FileName);
END.
14.15
IV. Đọc dữ liệu từ một tệp đã có
Các bước cơ bản đối với một biến tệp F
ASSIGN(F, Tên_Tệp); Gán tên tệp
RESET(F); Mở tệp ra để đọc
WHILE NOT EOF(F) DO
Begin
READ(F, X); Đọc một phần tử của tệp
...... Xử lý biến X, nếu cần ...
End;
CLOSE(F); Đóng tệp lại.
Sau thủ tục Reset(F), cửa sổ của tệp F nằm ở vị trí đầu tiên của
tệp để sẵn sàng đọc giá trị thứ nhất.
Mỗi khi đọc cần phải thử xem cửa sổ có nằm cuối tệp ?
14.16
Thí dụ 14.5 Đọc giá trị thứ nhất và thứ ba cho hai biến A và B
Program DOC_TEP_1;
Var
A, B: integer;
FI: File OF integer;
Begin
ASSIGN(FI, 'NGUYEN.DAT');
RESET(FI);
Read(FI, A);(* Đọc phần tử thứ nhất của tệp ra biến A *)
Read(FI, B);(* Đọc phần tử thứ hai của tệp ra biến B *)
Read(FI, B);(* Đọc phần tử thứ ba của tệp ra biến B *)
(* Lúc này B không giữ giá trị thứ hai nữa *)
CLOSE(FI);
End.
Thay bằng một lệnh Read(FI, A, B, B);
14.17
Thí dụ 14.6
Program DOC_TEP_2;
Var
I, SoPhanTu: Integer;
FI: File OF integer;
FileName: String[20];
Begin
Write(' Ten tep chua cac so nguyen : ');
Readln(FileName); SoPhanTu :=0;
ASSIGN(FI, FileName);RESET(FI);
WHILE NOT EOF(FI) DO
Begin
Read(FI, I); Writeln(I);
SoPhanTu := SoPhanTu + 1;
End;
CLOSE(FI);
Writeln('So Ptu cua tep ',FileName, ' la ', SoPhanTu);
End.
14.18
Thí dụ 14.7
TYPE
FI : File OF Integer;
VAR
FS, FD: FI;(* FS:File Source, FD:File Destination *)
Name1, Name2 : String[30];
(*--------------------------------------------*)
Procedure Copy_File_Int(Var Source, Destination: FI);
Var I : Integer;
Begin
Reset(Source); Rewrite(Destination);
While Not EOF(Source) Do
Begin
Read(Source, I); Write(Destination, I);
End;
Close(Source);
Close(Destination);
End;
14.19
(*---------------------------------------------*)
Begin
Write('Copy from File : '); Readln(Name1);
Write(' to File : '); Readln(Name2);
Assign(FS, Name1);
Assign(FD, Name2);
Copy_File_Int(FS, FD);
Writeln('End OF Copy !');
End.
Chương trình làm gì ?
14.20
V. Tệp truy nhập trực tiếp
Với tệp chứa trên đĩa mềm hoặc đĩa cứng, ta có thể
truy nhập trực tiếp vào phần tử thứ n.
Thủ tục
SEEK(FileVar, No);
sẽ đặt cửa sổ của tệp vào đúng vị trí thứ n.
Lưu ý: phần tử đầu tiên của tệp đánh số là 0.
Sau đó có thể dùng Read hoặc Write đối với ptử n
Thí dụ 14.8: Giả sử một tệp đã chứa 100 số nguyên từ
1 đến 100. Ta phải kiểm tra xem phần tử thứ 2
(đếm từ 0) của tệp có giá trị bằng 3 không, nếu
không bằng 3 thì phải sửa lại.
14.21
Var
F: File OF Integer;
Ch: char; I : Integer;
Begin....
Assign(F, 'SONGUYEN.DAT'); Reset(F);
SEEK(F, 2); (* Đặt cửa sổ vào vị trí thứ 3 *)
Read(F, I);
Writeln(' I = ', I);
Write(' Co sua lai ? (C/K) '); Readln(Ch);
If Ch in ['C', 'c'] Then
Begin
SEEK(F, 2); Write(' I = '); Readln(I);
Write(F,I); (* Thay đổi giá trị của tệp *)
End;
....
CLOSE(F);
END.
14.22
VI. Các thủ tục và hàm xử lý tệp của
Turbo PASCAL
FileSize (FileVar) hàm cho số phần tử của tệp
FileVar. FileSize nhận giá trị 0 khi tệp rỗng, không có
phần tử nào.
FilePos(FileVar) hàm cho vị trí tức thời của con trỏ
tệp (cửa sổ) của tệp FileVar.
Erase(FileVar);
Rename(FileVar, Str);
Tham khảo thêm sách.
14.23
Thí dụ ứng dụng tổng hợp
Xây dựng hệ thống các chương trình quản lí
cán bộ
Nhập dữ liệu
In ra dữ liệu
Tìm kiếm
Sắp xếp
Cập nhật dữ liệu
....
Các modun chương trình này đều tác động
lên tệp dữ liệu NHANSU.DAT
14.24
VII. Tệp văn bản (TEXT Files)
Tệp văn bản là kiểu tệp chỉ chứa các kí tự theo
mã ASCII.
Tệp văn bản được tổ chức thành từng dòng (line)
nhờ có các kí tự kết thúc dòng (End Of Line)
gồm một cặp 2 kí tự điều khiển CR (Carriage
Return, mã ASCII là 13) và LF (Line Feed, mã số
10).
Kiểu tệp văn bản đã được định nghĩa trước với
từ khoá TEXT.
Thí dụ:
Var
F1, F2: TEXT;
14.25
Thí dụ với đoạn văn bản sau:
Vi du van ban
1234
HET
sẽ được lưu trữ trên đĩa như sau:
Do tổ chức theo dòng nên việc ghi/đọc cũng có
các thủ tục xử lí theo dòng như Readln và
writeln.
Vi du van ban CR LF 1234 CR LF HET
14.26
Ghi vào tệp văn bản
Write(FileVar, Item1, Item2, ...,ItemN);
Writeln(FileVar, Item1, Item2 ...,ItemN);
Writeln(FileVar);
Thí dụ:
Var
F: TEXT;
Write(F, 'Thi du:', I, X, J, S5, 6, X+I)
Sự khác nhau giữa các mẫu lệnh trên
Lưu ý: Có sự chuyển đổi các kiểu dữ liệu khác thành
dãy kí tự rồi mới ghi vào tệp văn bản.
14.27
Thí dụ 14.10
VAR
KetQua : TEXT; { File van ban chua ket qua }
A : integer; B : real;
C : String[20]; D : Boolean;
Begin
A := 34; B:=3.14; C:=' END.'; D := true;
Assign(KetQua, 'KETQUA.TXT'); Rewrite(KetQua);
Write(KetQua, 'Ket qua la : ');
Write(KetQua, A:10);
Write(KetQua, B:10:4);
Writeln(KetQua, C);
Writeln('Dong 2! ':10, D);
Close(KetQua);
End. 12345678901234567890
Ket qua la 34 3.14 END
Dong2!TRUE
14.28
Màn hình là tệp văn bản ngầm định có tên là
OUTPUT song không cần dùng đến tên này
Writeln(3, X+Y);
được hiểu ngầm là Writeln(Output, 3, X+Y);
Máy in là tệp văn bản với tên là Lst
Writeln(Lst, 3, X+Y);
Không cần làm các thủ tục ASSIGN, REWRITE
và CLOSE với tệp màn hình và máy in
14.29
Đọc từ tệp văn bản
Read(FileVar, Var1, Var2 ..., VarN);
Readln(FileVar, Var1, Var2 .., VarN);
Readln(FileVar);
Trong đó Var1, Var2... là các biến và chỉ có thể là các
biến mà thôi. Các biến này có thể có các kiểu Integer,
Real, String, Char, Byte và Boolean.
Khó khăn hơn khi ghi, thủ tục đọc yêu cầu phải
tuân thủ qui tắc tương ứng giữa kiểu dữ liệu và dãy kí
tự biểu diễn nó ở trong tệp văn bản.
14.30
Thí dụ: muốn đọc 2 số 34 và 3.14 từ tệp
Ket qua la 34 3.14 END
Dong2!TRUE
Ta dùng Readln(F, St10, I, J);
Phải đọc St10 để nhẩy qua các kí tự phi số.
Thủ tục Read và Readln tệp văn bản đối với các
dữ liệu là số liệu như byte, real, integer sẽ nhẩy
qua các dấu cách và dấu chấm câu phía trước.
Nghĩa là ta phải biết trước cấu trúc tệp văn bản
chứa dữ liệu cần đọc thì mới đọc được.
Sự khác nhau giữa Read và Readln.
14.31
Hàm EOLN(F) báo hiệu vị trí cuối dòng
Bàn phím là một tệp văn bản ngầm định có tên là
INPUT.
Read(Var1) được hiểu là Read(INPUT, Var1)
Ưu điểm của tệp văn bản: đọc bằng mắt và sửa
dữ liệu một cách dễ dàng bằng các chương trình
soạn thảo văn bản thông thường.
14.32
Thí dụ: cấu trúc một tệp văn bản được soạn ra:
THOI TIET THANG 10 NAM 1989
--------------------------------
1 30 298.5 45
2 35 100.8 24
.............
Viết chương trình đọc nhiệt độ, áp suất, độ ẩm
PROGRAM DOC_DU_LIEU;
Var
F: TEXT;
NhietDo, DoAm: integer;
Ngay : Byte;
ApSuat : Real;
SoNgay: Byte; {Số ngày = số dòng chứa dữ liệu }
14.33
BEGIN
Assign(F,'THANG10.DAT'); Reset(F);
Readln(F); (* Nhẩy qua dòng 1 *)
Readln(F); (* Nhẩy qua dòng 2 *)
SoNgay := 0;
WHILE NOT SEEKEOLN(F)DO
Begin
(* Đọc số liệu từng ngày một *)
Readln(F, Ngay, NhietDo, ApSuat, DoAm);
SoNgay := SoNgay + 1;
.... (* Xử lí dữ liệu: tính giá trị trung bình *)
End;
Writeln('Ket qua xu li cua',SoNgay,' ngay la :');
....
Close(F);
END.
14.34
VIII.Tệp không định kiểu (UnTyped File)
Tệp luôn luôn có kiểu song trong một số trường hợp xử
lí, ta không cần quan tâm tới bản chất kiểu dữ liệu. Tệp
không định kiểu là tệp được khai báo không có kiểu
phần tử.
Ưu điểm: tốc độ xử lí sẽ cao lên rất nhiều.
Thí dụ muốn Copy từ tệp F1 bất kì thành F2.
Tự đọc trong sách giáo trình.
Bài tập: làm hết các bài tập cuối chương.
Chương này vô cùng quan trọng.
Các bài tập làm thêm:
Các file đính kèm theo tài liệu này:
- ngon_ngu_lap_trinh_pascalchuong14_1502.pdf