Cơ sở dữ liệu - Chương 14: Kiểu dữ liệu có cấu trúc: Kiểu tệp (File)

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)

pdf34 trang | Chia sẻ: Mr Hưng | Lượt xem: 1048 | Lượt tải: 0download
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:

  • pdfngon_ngu_lap_trinh_pascalchuong14_1502.pdf