1 LẬP TRÌNH CĂN BẢN KIỂU TẬP TIN 2 Nộidung chươngnày l Một số khái niệm về tậptin l Các thao tác trên tậptin l Truy cập tậptin văn bản l Truy cập tậptinnhị phân 3 Một số khái niệm về tậptin (file) (1) l Tại sao ta cần đến kiểu tậptin? l Cho phép lưu trữ dữ liệu ở bộ nhớ ngoài(đĩa). l Khi kết thúc chương trình thìdữliệu vẫn còndo đóchúng ta cóthể sử dụng nhiều lần. l Kích thước lớn dữ liệu không hạn chế. 4 Một số khái niệm về tậptin (file) (2) l Có3loại dữ liệu kiểu tậptin: l Tậptin văn bản(Text File) l Dùng để ghi các ký tự lên đĩa(dưới dạng mã Ascii) l Cóchứa: l Ký hiệu‘\n’:xuống dòng l KítựEOF (End Of File)cómã Ascii là26:nằmởcuối tậptin l Tậptin định kiểu(Typed File) l Gồm nhiều phần tử cócùng kiểu: char,int, long,struct… l Được lưu trữ trên đĩa dưới dạng một chuỗi cácbyteliên tục. l Tậptin không định kiểu(UntypedFile) l Gồm các cấu trúc dữ liệu mà ta không quan tâm đến nộidung hoặc kiểu của nó. l Tachỉ lưu ý đến các yếu tố vật lý của tậptin như độ lớn, 5 Một số khái niệm về tậptin (file)(3) l Biến tậptin l Được dùng để đại diện cho một tậptin l Các thao tác lên tậptinsẽ được thực hiện thôngquabiến này l Con trỏ tậptin l Tại mỗi thời điểm,sẽcómột vị trícủa tậptinmàtại đóviệc đọc/ghi thôngtinsẽxảy ra l Tahìnhdungcó1 contrỏ đang chỉ đến vị trí đó l Sau khi đọc/ghi xong dữ liệu, contrỏ sẽ chuyển dịch thêm một phần tử về phía cuối tậptin. l Sau phần tử dữ liệu cuối cùng của tậptinlàdấu kết thúc tậptin EOF 6 Các thao tác trên tậptin l Khai báo biến tậptin l Mở tậptin l Đóng tậptin l Kiểm tra đến cuối tậptin hay chưa? l Di chuyểncontrỏ tậptinvề đầu tậptin -Hàm rewind() 7 Khai báo biến tậptin l Cúpháp: FILE <Danh sách các biếncontrỏ>; l Các biến trong danh sách phải làcáccontrỏ và được phân cách bởi dấu phẩy(,). l Vídụ: FILE *f1,*f2; 8 Mở tậptin (1) l Cúpháp: FILE *fopen(char *Path, const char *Mode) l Ýnghĩa: l Trả về contrỏ tậptincủa tậptin được mở l Trả về NULL nếu cólỗi 9 Mở tậptin (2) l Path:chuỗi chỉ đường dẫn đến tậptin trên đĩa l Type:chuỗi xác định cách thức màtậptinsẽmở.Các giátrị cóthể của Mode: 10 Mở tậptin (3) l Vídụ: Mởmột tậptintênTEST.txt để ghi. FILE *f; f =fopen(“TEST.txt”, “w”); if (f!=NULL){ //Các câu lệnh để thao tác với tậptin // Đóng tậptin } =>mởtậptin để ghi =>nếu tậptin đã tồn tại rồi thìtậptinsẽbịxóa vàmột tậptinmới được tạo ra 11 Đóng tậptin l Cúpháp: int fclose(FILE *f) l Ghi dữ liệu còn lại trong vùng đệm vào tậptinvà đóng lại tậptin l flàcontrỏ tậptin được mở bởi hàm fopen() l Giátrị trả về là0báo rằng việc đóng tậptinthành công l Giátrị trả về là EOF nếu cóxuất hiện lỗi l Cúpháp: int fcloseall() l Đóng tất cả các tậptinlại l Trả về tổng số các tậptin được đóng lại l Nếu không thành công,kết quả trả về làEOF 12 Kiểm tra đến cuối tậptin hay chưa? l Cúpháp: int feof(FILE *f) l Ýnghĩa: l Kiểm tra xem đã chạm tới cuối tậptin hay chưa. l Trả về EOFnếu cuối tậptin được chạm tới, ngược lại trả về 0. 13 Di chuyểncontrỏ tậptinvề đầu tậptin -Hàmrewind() l Cúpháp: void rewind(FILE *f) l Ýnghĩa: l Làm chocontrỏ quayvề đầu tậptin như khi mở nó 14 Truy cập tậptin văn bản l Ghi dữ liệu lên tậptin văn bản l Đọc dữ liệu từ tập tin văn bản 15 Ghi dữ liệu lên tậptin văn bản(1) l Hàm putc() int putc(intc, FILE *f) l Được dùng để ghi một ký tự lên một tậptin văn bản đang được mở (liên kết vớicontrỏ f) để làm việc l c chứa mã Ascii của ký tự l Hàm này trả về EOF nếu gặp lỗi 16 Ghi dữ liệu lên tậptin văn bản(2) l Hàm fputs() int fputs(const char *buffer, FILE *f) l Được dùng để ghi một chuỗi ký tự chứa trong vùng đệm lên tậptin văn bản l Hàm này trả về giátrị 0 nếu buffer chứa chuỗi rỗng và trả về EOF nếu gặp lỗi 17 Ghi dữ liệu lên tậptin văn bản(3) l Vídụ:Viết chương trình ghi chuỗi ký tự lên tậptin văn bản D:\\Baihat.txt 18 Ghi dữ liệu lên tậptin văn bản(3) l Hàm fprintf() fprintf(FILE *f, const char *format,varexpr) l Được dùng để ghi dữ liệu có định dạng lên tậptin văn bản. l format:chuỗi định dạng(giống với các định dạng của hàm printf()) l varexpr:danh sách các biểu thức,mỗi biểu thức cách nhau dấu phẩy(,) 19 Đọc dữ liệu từ tập tin văn bản (1) l Hàm getc() int getc(FILE *f) l Được dùng để đọc dữ liệu từ tập tin văn bản đang được mở để làm việc (liên kết với f) l Hàm này trả về mã Ascii của một ký tự được đọc(kể cả EOF) 20 Đọc dữ liệu từ tập tin văn bản (2) l Hàm fgets() char *fgets(char *buffer, int n, FILE *f) l Được dùng để đọc1chuỗi ký tự từ tậptin văn bản đang được mở (liên kết vớicontrỏ f) l Đọc cho đến khi đủ nký tự hoặc gặp ký tự xuống dòng‘\n’(ký tự này cũng được đưa vào chuỗi kết quả) haygặp ký tự kết thúc EOF (ký tự này không được đưa vào chuỗi kết quả) l buffer:chỉ đến cùng nhớ đủ lớn chứa các ký tự nhận được l Ký tự NULL (‘\0’)tự động được thêm vào cuối chuỗi kết quả lưu trong vùng đệm l Hàm trả về địa chỉ đầu tiên của vùng đệm khi không gặp lỗi và chưa gặp ký tự kết thúcEOF. Ngược lại,hàm trả về giátrị NULL 21 Đọc dữ liệu từ tập tin văn bản (3) l Hàm fscanf() fscanf(FILE *f, const char *format,varlist) l Được dùng để đọc dữ liệu từ tậptin văn bản vào danh sách các biến theo định dạng. l format:chuỗi định dạng(giống hàm scanf()) l varlist:danh sách các biến mỗi biến cách nhau dấu phẩy(,). 22 Đọc dữ liệu từ tập tin văn bản (4) l Vídụ:Viết chương trình chép tậptin D:\Baihat.txt ở trênsang tậptin D:\Baica.txt. 23 Truy cập tậptinnhị phân l Ghi dữ liệu lên tậptinnhị phân l Đọc dữ liệu từ tậptinnhị phân l Di chuyểncontrỏ tậptin l Vídụ 24 Ghi dữ liệu lên tậptinnhị phân l Hàm fwrite() size_tfwrite(const void *ptr, size_t size, size_t n, FILE *f) l ptr: contrỏ chỉ đến vùng nhớ chứa thôngtincần ghi lên tập tin. l n:sốphần tử sẽ ghi lên tậptin. l size:kích thước của mỗi phần tử. l f: contrỏ tậptin đã được mở. l Giátrị trả về của hàm này làsốphần tử được ghi lên tậptin. Giátrị này bằngntrừ khi xuất hiện lỗi. 25 Đọc dữ liệu từ tậptinnhị phân l Hàm fread() size_tfread(const void *ptr, size_t size, size_t n, FILE *f) l ptr: contrỏ chỉ đến vùng nhớ sẽ nhận dữ liệu từ tậptin l n:sốphần tử được đọc từ tậptin l size:kích thước của mỗi phần tử l f: contrỏ tậptin đã được mở l Giátrị trả về của hàm này làsốphần tử đã đọc được từ tậptin.Giátrị này bằngn haynhỏ hơn nnếu đã chạm đến cuối tậptinhoặc cólỗi xuất hiện 26 Di chuyểncontrỏ tậptin l Hàm fseek() int fseek(FILE *f, long offset, int whence) l Được dùng để di chuyểncontrỏ tậptin đến vị tríchỉ định l f: contrỏ tậptin đang thao tác l offset:sốbytecần dịch chuyểncontrỏ tậptinkểtừvịtrí trước đó.Phần tử đầu tiên làvịtrí0. l whence:vịtríbắt đầu để tínhoffset,ta cóthể chọn điểm xuất phát là l Kết quả trả về của hàm là0nếu việc di chuyển thành công.Nếu không thành công, 1giátrị khác0 (đólà1mã lỗi) được trả về. 27 Vídụ l Viết chương trình ghi lên tậptinCacSo.Dat3giátrị số (thực, nguyên,nguyên dài). Sau đó đọc các số từ tậptinvừa ghi và hiển thị lên màn hình . 1 LẬP TRÌNH CĂN BẢN KIỂU TẬP TIN 2 Nộidung chươngnày l Một số khái niệm về tậptin l Các thao tác trên tậptin l Truy cập tậptin văn bản l Truy cập tậptinnhị phân 3 Một số khái niệm về tậptin. phía cuối tậptin. l Sau phần tử dữ liệu cuối cùng của tậptinlàdấu kết thúc tậptin EOF 6 Các thao tác trên tậptin l Khai báo biến tậptin l Mở tậptin l Đóng tậptin l Kiểm tra đến cuối tậptin hay. Làm chocontrỏ quayvề đầu tậptin như khi mở nó 14 Truy cập tậptin văn bản l Ghi dữ liệu lên tậptin văn bản l Đọc dữ liệu từ tập tin văn bản 15 Ghi dữ liệu lên tậptin văn bản( 1) l Hàm putc() int