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