Sau ñó ta chỉ cần dùng các thủ tục READ ñể ñọc nó ra hoặc WRITE ñể ñặt giá trị mới vào 6.Các thủ tục và hàm xử lí tệp của Pascal FILESIZE F : cho số phần tử của tệp F FILEPOS F : cho vị [r]
(1)Dữ liệu kiểu File 1.Khái niệm tệp Tệp hay tệp liệu là tập hợp các liệu có liên quan với và có cùng kiểu ñược nhóm lại với tạo thành dãy Chúng thường ñược chứa thiết bị nhớ ngoài máy tính (ñĩa mềm, ñĩa cứng ) Tệp liệu theo nghĩa rộng : có thể ñó là chương trình, có thể là số liệu, có thể là các liệu khác kí tự, văn Tệp ñược lưu trữ nhớ ngoài ñĩa cứng, ñĩa mềm ðiều ñó có nghĩa là tệp ñược lưu trữ ñể dùng nhiều lần và tồn chương trình kết thúc ñiện Vì liệu nào cần lưu giữ thì chúng ta bắt buộc phải dùng ñến tệp Tệp là kiểu liệu có cấu trúc ðịnh nghĩa tệp có phần nào giống mảng chỗ chúng ñều là tập hợp các phần tử liệu cùng kiểu Song mảng ñược khai báo chương trình với số phần tử ñã xác ñịnh, còn số phần tử tệp không xác ñịnh ñịnh nghĩa Cách ñịnh nghĩa tệp Pascal Cách TYPE Kiểu_tệp = FILE OF kiểu_phần_tử; Sau ñó ta khai báo VAR Biến_Tệp : Kiểu_tệp; Cách : khai báo trực tiếp VAR Biến_tệp : FILE OF Kiểu_phần_tử; VD : TYPE FileInteger = FILE OF integer; FileReal = FILE OF real; FileBoolean = FILE OF Boolean; Nhan_su = RECORD Ten : String[30]; Tuoi : Byte; Luong : Real; END; VAR F1,F2 : FileInteger; F3 : FileReal; FNS : FILE OF Nhan_su; F5 : FILE OF Char; 3.Mở tệp ñể cất liệu a Mở tệp ñể ghi Pascal dùng thủ tục ñi liền theo thứ tự ASSIGN (Biến_Tệp, Tên_tệp); Gán tên_tệp cho biến_tệp; REWRITE (Biến_Tệp); (2) VD : ASSIGN(F1,'NGUYENTO.DAT'); REWRITE(F1); Sau mở tệp xong, tệp rỗng vì chưa có phần tử nào, cửa sổ tệp không có giá trị xác ñịnh vì nó trỏ vào cuối tệp (EOF) Lưy ý, trên ñĩa có tập tin trùng với tên tệp mở thì nó bị xoá ñi b.Ghi các giá trị vào tệp với thủ tục WRITE Cách viết Write (Biến_tệp, Item1, Item2, , ItemN); Trong ñó Item1, Item2, ItemN là các hằng, biến, các biểu thức và phải có giá trị cùng với kiểu phần tử tệp VD : Với I,J,K là các biến INTEGER, ta có thể viết : Write (F1, 3, I+2*J, K, 5); Bước cuối cùng việc ñặt liệu vào tệp là ñóng tệp thủ tục CLOSE (Biến_Tệp) VD : CLOSE(F1); ðọc liệu từ tệp ñã có a Mở tệp ñể ñọc Pascal dùng thủ tục ñi liền theo thứ tự ASSIGN (Biến_Tệp, Tên_tệp); Gán tên_tệp cho biến_tệp; RESET (Biến_Tệp); VD : ASSIGN(F1,'NGUYENTO.DAT'); RESET(F1); Sau mở tệp xong, tệp không rỗng thì cửa sổ trỏ vào phần tử ñầu tiên tệp b.ðọc liệu từ tệp Cách viết Read (Biến_tệp, Var1, Var2, , VarN); Trong ñó Var1, Var2, VarN có thể là các biến có giá trị cùng với kiểu phần tử tệp Việc ñọc phần tử tệp còn cần có ñiều kiện : phải xem tệp có còn phần tử không, tức là cửa sổ tệp chưa trỏ ñến EOF Hàm EOF(Biến_tệp)=TRUE cửa sổ tệp trỏ vào cuối tệp và EOF(Biến_tệp)=FALSE cửa sổ trỏ vào phần tử tệp VD : Muốn ñọc tất các phần tử tệp WHILE not EOF(Biến_Tệp) DO BEGIN Read(Biến_Tệp, X); END; c.Bước cuối cùng việc ñọc liệu từ tệp là ñóng tệp thủ tục CLOSE (Biến_Tệp) VD : CLOSE(F1); 5.Tệp truy nhập trực tiếp Vì ñộ dài các phần tử tệp là nên ta có thể truy nhập trực tiếp vào vị trí phần tử nào ñó tệp cách dùng SEEK (3) Cách viết SEEK (Biến_Tệp, No) No là số thứ tự phần tử tệp Theo thủ tục này máy ñặt cửa sổ tệp vào phần tử thứ No Sau ñó ta cần dùng các thủ tục READ ñể ñọc nó WRITE ñể ñặt giá trị vào 6.Các thủ tục và hàm xử lí tệp Pascal FILESIZE (F) : cho số phần tử tệp F FILEPOS (F) : cho vị trí tức thời trỏ ERASE (F) : xoá FILE trên ñĩa có tên ñã gán vào F RENAME (F, St) : ñổi tên tệp thành St (kiểu String) 7.Tệp văn (TEXT FILE) a Cách khai báo VAR Biến_tệp : TEXT; VD : VAR F1,F2 : TEXT Các phần tự tệp kiểu TEXT là các kí tự (chữ viết) song TEXT khác với FILE OF Char chỗ TEXT ñược tổ chức thành dòng với ñộ dài dòng khác nhờ có thêm các dấu hết dòng đó là cặp kắ tự ựiều khiển : - CR (Carriage Return) : nhảy ñầu dòng, mã số ASCII=13 - LF (Line Feed) : nhảy xuống dòng tiếp theo, mã số ASCII=10 Chúng ñược nhận dạng ñể ngăn cách dãy kí tự tương ứng với dòng khác VD : ðoạn văn sau VI DU 1234 HET Máy chứa tệp văn thành dãy sau : VI DU ³ CR LF ³ 1234 ³ CR LF ³ HET ³ EOF b.Ghi vào tệp văn Có thủ tục Write(Biến_Tệp, Item1, Item2, ItemN); Writeln(Biến_Tệp, Item1, Item2, ItemN); Writeln(Biến_Tệp); Trong ñó Item1, Item2, ItemN là các hằng, biến, biểu thức có kiểu ñơn giản Integer, real, Boolean, String Cách viết vào tệp văn cách viết màn hình khác với màn hình hạn chế có 80 dòng x 25 cột Còn tệp văn có số dòng, cột không giới hạn (xem lại Chương : Thủ tục vào liệu) c.ðọc liệu từ tệp văn Chúng ta có thể ñọc không kí tự từ tệp văn mà còn có thể ñọc các số nguyên số thực, boolean từ tệp văn thông qua các thủ tục Read(Biến_Tệp, Var1, Var2, VarN); (1) Readln(Biến_Tệp, Var1, Var2, VarN); (2) Readln(Biến_Tệp); (3) Trong ñó Var1, Var2, VarN là các biến kiểu Char, Integer, String, Real, Boolean (4) Thủ tục (2) ñọc xong ñưa cửa sổ tệp sang ñầu dòng Thủ tục (3) không ñọc gì ñưa cửa sổ tệp sang ñầu dòng Kiểm tra tệp mở Xét ñoạn chương trình sau kiểm tra xem tệp F có trên ñĩa hay không VAR st:string; F:TEXT; BEGIN Write('Nhập tên tệp : ');readln(st); assign(f,st);{$I-} reset(f); if ioresult=0 then write('Tệp ',St,' có trên ñĩa') else write('Tệp ',St,' không có trên ñĩa') END; Tệp không ñịnh kiểu Tệp không ựịnh kiểu là kiểu file ựặc biệt đó là tệp ựịnh nghĩa hay khai báo ra, ta không nói rõ nó chứa gì, không nói rõ chất các liệu ghi ñó Vì việc chuyển liệu từ ñĩa vào cấu trúc liệu ñược thực đó là lắ vì tệp không ựịnh kiểu ựược dùng rộng rãi các ứng dụng ñòi hỏi tốc ñộ cao Cách khai báo VAR Biến_tệp : FILE; Việc ghi và ñọc liệu ñối với tệp không ñịnh kiểu thường xuyên dùng ñến thủ tục BLOCKREAD và BLOCKWRITE { Nhập N Sau ñó nhập N số nguyên từ bàn phím Ghi các số ñó vào file 'bai1.dat' Sau ñó mở lại file ñó ñọc N số ñó và tính tổng chúng (file kiểu byte)} uses crt; var i,a,n:byte;{i,a,n kiểu byte} f:file of byte;{biến f kiểu tệp (byte)} tong:integer;{tong kiểu integer} begin clrscr;{Xoá màn hình} assign(f,'bai1.dat');rewrite(f);{Mở file bai1.dat ñể ghi} write('N = ');readln(n);{ðọc N} for i:=1 to n do{Cho i chạy từ ñến N} begin write('Nhap so thu ',i,' : ');readln(a);{ðọc số thứ i vào a} write(f,a);{Ghi a vào f} end; close(f);{đóng tệp F} tong:=0;{Gán tong 0} assign(f,'bai1.dat');reset(f);{Mở file bai1.dat ñể ñọc} for i:=1 to n do{Cho i chạy từ ñến N} begin (5) read(f,a);{ðọc từ f biến a} inc(tong,a);{Cộng a vào tổng} end; writeln('Tong = ',tong);{Xuất tổng} readln; end { Viết thủ tục taofile(s:string;n:integer) tạo n số nguyên ngẫu nhiên từ 10000 sau ñó ghi và file (kiểu integer)có tên là s Sau ñó thử tạo file 'bai21.dat' có 10 phần tử, 'bai22.dat' có 20 phần tử} uses crt; var f:file of integer;{f kiểu tệp integer} procedure taofile(s:string;n:integer); var i,a:integer;{Khai báo i,a kiểu integer} begin assign(f,s);rewrite(f);{Mởi file s ñể ghi} for i:=1 to n do{Cho i chạy từ ñến n} begin a:=random(10000)+1;{Gán a số ngẫu nhiên từ 10000} write(f,a);{Ghi a vào f} end; close(f);{đóng tệp f} end; begin randomize; taofile('bai21.dat',10); taofile('bai22.dat',20); end { Viết chương trình tương tự bài tập lần này tạo n kí tự ngẫu nhiên khoảng từ 'A' 'Z' và ghi vào tệp 'bai3.dat' Sau ñó mở lại file ñếm xem có bao nhiêu kí tự 'A', bao nhiêu 'B' } uses crt; var dem:array['A' 'Z']of byte;{Mảng dem['A' 'Z'] kiểu byte} f:file of char;{f kiểu tệp kí tự} ch:char;{ch kiểu kí tự} i,n:byte;{i,n kiểu byte} procedure taofile(s:string;n:integer); var i:byte;{Khai báo i kiểu byte} begin assign(f,s);rewrite(f);{Mở file s ñể ghi} for i:=1 to n do{Cho i chạy từ ñến N} begin ch:=chr(random(26)+65);{Gán ch kí tự ngẫu nhiên từ 'A' 'Z'} write(f,ch);{Ghi ch vào f} (6) end; close(f);{đóng tệp f} end; begin clrscr;{Xoá màn hình} randomize; write('N = ');readln(n);{ðọc N} taofile('bai3.dat',n); assign(f,'bai3.dat');reset(f);{Mở file bai3.dat ñể ñọc} for i:=1 to n do{Cho i chạy từ ñến N} begin read(f,ch);{ðọc kí tự ch từ f} inc(dem[ch]);{Tăng dem[ch]} end; for ch:='A' to 'Z' do{Cho ch chạy từ 'A' 'Z'} if dem[ch]>0 then{Nếu ch có xuất thì} writeln('Chu ',ch,' xuat hien ',dem[ch],' lan');{Xuất ch và số lần xuất hiện} readln; end { Tạo file số nguyên ngẫu nhiên (bài 2) file có m phần tử, file có n phần tử sau ñó ghi vào file bai41.dat, bai42.dat Sau ñó mở lại file này ðọc hết các phần tử file vào mảng A Sắp xếp lại theo thứ tự tăng dần sau ñó ghi vào file bai4.dat} uses crt; var a:array[1 10000]of integer;{Mảng a 10000 phần tử kiểu integer} f:file of integer;{f kiểu tệp integer} i,j,tg,m,n:integer;{i,j,tg,m,n kiểu byte} procedure taofile(s:string;n:integer); var i,a:integer;{Khai báo i,a kiểu integer} begin assign(f,s);rewrite(f);{Mở file s ñể ghi} for i:=1 to n do{Cho i chạy từ ñến N} begin a:=random(10000)+1;{Gán a số ngẫu nhiên từ 10000} write(f,a);{Ghi a vào tệp f} end; close(f);{đóng tệp f} end; begin clrscr;{Xoá màn hình} randomize; write('M = ');readln(m);{ðọc M} write('N = ');readln(n);{ðọc N} taofile('bai41.dat',m); (7) taofile('bai42.dat',n); assign(f,'bai41.dat');reset(f);{Mở file bai41.dat ñể ñọc} for i:=1 to m read(f,a[i]);{ðọc m phần tử tử f vào a} close(f);{đóng tệp f} assign(f,'bai42.dat');reset(f);{Mở file bai42.dat ñể ñọc} for i:=1 to n read(f,a[m+i]);{ðọc n phần tử tử f vào a} close(f);{đóng tệp f} for i:=1 to m+n-1 do{Cho i chạy từ ñến m+n-1} for j:=i+1 to m+n do{Cho j chạy từ i+1 ñến m+n} if a[i]>a[j]then{Nếu a[i]>a[j] thì} begin tg:=a[i];a[i]:=a[j];a[j]:=tg;{ðổi chỗ a[i],a[j]} end; assign(f,'bai4.dat');rewrite(f);{Mở file bai4.dat ñể ghi} for i:=1 to m+n write(f,a[i]);{Ghi m+n phần tử từ a vào f} close(f);{đóng tệp f} end { Viết chương trình nhập từ bàn phím liên tục các xâu S Ghi chúng vào file 'bai5.txt' Chương trình kết thúc nhập chuỗi S rỗng} uses crt; var s:string;{Xâu S} f:text;{f kiểu tệp văn bản} begin clrscr; assign(f,'bai5.txt');rewrite(f);{Mở file bai5.txt ñể ghi} repeat readln(s);{ðọc S} if s<>''then writeln(f,s);{Nếu S không rỗng thì ghi s vào f} until s='';{Cho ñến S rỗng} close(F);{đóng tệp F} end { Viết chương trình nhập từ file 'bai61.txt' là file văn Tạo file 'bai62.txt' có nội dung tương tự file 'bai61.txt' ñổi tất kí tự thường file bai61.txt thành kí tự hoa Hướng dẫn WHILE not EOF(F)DO BEGIN ðọc xâu S từ file F ðổi S thành hoa Ghi S vào file F1 END} uses crt; var s:string;{Xâu S} (8) f,f1:text;{F,F1 kiểu tệp văn bản} i:byte;{i kiểu byte} begin assign(f,'bai61.txt');reset(f);{Mở file bai61.txt ñể ñọc (dùng biến F)} assign(f1,'bai62.txt');rewrite(f1);{Mở file bai62.txt ñể ghi (dùng biến F1)} while not eof(f)do{Trong chưa hết file f thì} begin readln(f,s);{ðọc xâu S từ F} for i:=1 to length(s)do s[i]:=upcase(s[i]);{ðổi S thành hoa} writeln(f1,s);{Ghi xâu S vào F1} end; close(F);close(f1);{đóng f,f1} end { Viết chương trình tạo tệp văn có tên là bai71.txt bai72.txt Mỗi tệp có 100 dòng Mỗi dòng là số nguyên ñược tạo ngẫu nhiên Sau ñó mở file bai71.txt ðọc các số file ñó và ghép vào cuối file bai72.txt Hướng dẫn Sau tạo file xong thì - Dùng thủ tục APPEND ñối với bai72.txt ñể ghi vào cuôi - ðọc các số từ tệp bai71.txt ghi vào tệp bai72.txt cách bình thường} uses crt; var s:string;{Xâu S} f,f1:text;{F,F1 kiểu tệp văn bản} i:byte;{i kiểu byte} procedure taofile(s:string); var i,a:integer;{Khai báo i,a kiểu integer} begin assign(f,s);rewrite(f);{Mở file s ñể ghi} for i:=1 to 100 do{Cho i chạy từ ñến 100} begin a:=random(10000)+1;{Gán a số ngẫu nhiên từ 10000} writeln(f,a);{Ghi a vào f} end; close(f);{đóng tệp f} end; begin taofile('bai71.txt'); taofile('bai72.txt'); assign(f,'bai71.txt');reset(f);{Mở file bai71.txt ñể ñọc (dùng biến F)} assign(f1,'bai72.txt');append(f1);{Mở file bai72.txt ñể ghi vào cuối (dùng biến F1)} for i:=1 to 100 do{Cho i chạy từ ñến 100} (9) begin readln(f,s);{ðọc xâu s từ F} writeln(f1,s);{Ghi xâu S vào F1} end; close(f);close(f1);{đóng tệp f,f1} end { Viết chương trình ñọc từ bàn phím chuỗi S1 và chuỗi S2 Nếu file có tên S1 tồn thì ñổi tên S1 thành S2 ngược lại thông báo file không tồn tại} uses crt; var f:file;{f kiểu tệp bất kì} s1,s2:string;{Xâu S1,S2} begin clrscr;{Xoá màn hình} write('S1 = ');readln(s1);{ðọc S1} write('S1 = ');readln(s2);{ðọc S2} assign(f,s1);{$I-}Reset(f);{$I+} if IOResult <> then write('File ',s1,' khong ton tai'){Nếu IOResult<>0 thì không tồn tại} else{Ngược lại} begin Close(F);{đóng tệp F} rename(F,s2);{ðổi tên D thành S2} end; readln; end { Nhập S Viết chương trình hiển thị file văn có tên S lên màn hình Nếu văn ñó dài thì hiển thị trang sau ñó ñợi cho người dùng bấm phím Enter thì hiển thị tiêp Hướng dẫn i:=0; WHILE not EOF(F)DO BEGIN ðọc và xuất xâu S IF i=23 THEN readln; END;} uses crt; var f:text;{f kiểu tệp văn bản} i:byte;{i kiểu byte} s:string;{Xâu S} begin clrscr;{Xoá màn hình} write('S = ');readln(s);{ðọc S} assign(f,s);reset(f);{Mở s ñể ñọc} i:=0;{Gán i=0} (10) while not eof(f)do{Trong chưa hết tệp F thì} begin readln(f,s);{ðọc S} writeln(s);{Xuất S} inc(i);{Tăng i} if i=23 then begin i:=0;readln;end;{Nếu i=23 thì gán i=0 và dừng lại ñợi} end; close(f);{đóng tệp F} end { Viết chương trình mã hoá file văn cách : ðổi các kí tự file văn ñó thành kí tự có mã = (255-mã_kí_tự_cũ) (ñổi tất các kí tự kể kí tự CR,LF ) Hướng dẫn Ta mở file văn ñó dạng file kí tự ñọc kí tự ñổi mã ghi vào file Giải mã thì cần chạy lại chương trình mã hoá ñối với file ñã mã hoá} uses crt; var f,f1:file of char;{f,f1 kiểu tệp kí tự} ch:char;{ch kiểu kí tự} s:string;{Xâu S} begin clrscr;{Xoá màn hình} write('S = ');readln(s);{ðọc S} assign(f,s);reset(f);{Mở file S ñể ñọc (dùng biến F)} assign(f1,'mahoa.dat');rewrite(f1);{Mở file mahoa.dat ñể ghi (dùng biến F1)} while not eof(f)do{Trong file f chưa hết thì} begin read(f,ch);{ðọc kí tự ch từ f} ch:=chr(255-ord(ch));{Mã hoá ch} write(f1,ch);{Ghi ch vào f1} end; close(f);close(f1);{đóng tệp f,f1} end 10 (11)