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