Trường Đ i h c Khoa h c T  nhiên ạ ọ ệ Khoa Công ngh  thông tin ọ B  môn Tin h c c

ơ sở

NH P MÔN L P TRÌNH

Đ ng Bình Ph

ương dbphuong@fit.hcmus.edu.vn

T P TIN

1

&

VC

N i dung

BB

Khái niệm dòng (stream)

1

Khái niệm và phân loại tập tin

2

Các thao tác xử lý căn bản

3

Một số hàm quản lý tập tin

4

22

T p tin

&

VC

ấ Nh p xu t

BB

Khái ni mệ

ữ ệ ế ấ  C lưu d  li u (bi n, m ng, c u trúc, …) trong  ả

ế ị ế ị ế ị ừ

ừ ự

ử t b  (

ớ ộ b  nh  RAM.  D  li u  ữ ệ được n p vào RAM và g i ra ngoài  ế ị device) ậ  (input device): bàn phím, con chu tộ t b  nh p ấ  (output device): màn hình, máy in t b  xu t ậ ậ ấ : t p tin t b  v a nh p v a xu t ọ ử ệ ế ị đều th c hi n m i x  lý thông ạ chương trình thông qua các thi • Thi • Thi • Thi  Các thi t b

33

T p tin

qua các dòng (stream).

&

VC

Stream (dòng)

BB

Khái ni mệ

ế  Là môi trường trung gian để giao ti p (nh n/

ử ương trình và thi

ữ ử ậ

ộ ố ớ ố ẽ ử ậ ế ị t b . ế ị t b   ế ị t b

g i thông tin) gi a ch  Mu n nh n/g i thông tin cho m t thi ta s  g i thông tin cho stream n i v i thi ộ ậ đó (đ c l p thi ế ị). t b

stream nh pậ .

• “Ch y” vào ch ả • “Ch y” ra ch ả

ương trình g i là

stream xu tấ .

44

T p tin

 Stream là dãy byte d  li u ữ ệ ọ ương trình g i là

&

VC

Stream (dòng)

BB

Phân lo iạ

ố đa 255 ký  i  ặ

cu i dòng ‘\0’ ho c ký t

ở ớ

 Stream văn b nả  (text) • Ch  ch a các  ký tự. ứ • T  ch c thành t ng dòng, m i dòng t ừ ứ

ữ ệ ử ụ

ử ượ

ổ ự ế t , k t thúc b i ký t sang dòng m i ‘\n’.  Stream nh  phân ị • Ch a các  ứ byte. • Được đọc và ghi chính xác t ng byte. • X  lý d  li u b t k , k  c  d  li u văn b n. ấ ỳ ể ả ữ ệ • Đ c s  d ng ch  y u v i các t p tin trên đĩa. ậ ủ ế

55

T p tin

(binary)

&

VC

Stream (dòng)

BB

Các stream chu n ẩ định nghĩa s nẵ

Tên

Stream

Thi

ế ị ương  ngứ

t b  t

stdin

Nh p chu n

Bài phím

stdout

Xu t chu n

Màn hình

stderr

L i chu n

Màn hình

stdprn (MS­DOS)

In chu nẩ

Máy in (LPT1:)

ố ế

stdaux (MS­DOS)

C ng n i ti p COM 1: ị

ẩ Ph  chu n Ví d  ụ (hàm fprintf xu t ra stream xác đ nh) ấ

t b  báo l

 Xu t ra màn hình: ấ  Xu t ra máy in: ấ  Xu t ra thi ế ị ấ i:  Xu t ra t p tin (stream  ậ ấ

fp):

fprintf(stdout, “Hello”); fprintf(stdprn, “Hello”); fprintf(stderr, “Hello”); fprintf(fp, “Hello”);

66

T p tin

&

VC

T p tin

BB

ớ ạ ượ ư ờ ữ ạ c l u tr  t m th i

ư

ữ ữ ệ : trong b  nh  RAM

màn hình. ớ ộ ả

i h n và đ  ừ bàn phím.

. ế ượ i quy t đ

ấ ờ c bài

ầ  C n m t thi t b  l u tr  sao cho d  li u ữ ệ v n ẫ

77

T p tin

ươ ướ ạ Nhu c uầ  D  li u gi ữ ệ • Nh pậ : gõ t • Xu tấ : hi n th  trên  ể • L u tr  d  li u  M t th i gian, không gi ớ ố ữ ệ ớ toán v i s  d  li u l n. ữ ộ ng trình c không h n ch ế ị ư ế còn khi k t thúc ch ề ầ  và kích th nhi u l n , có th  ể s  d ng  ử ụ ế.

&

VC

T p tin

BB

 T p h p thông tin

Khái ni mệ ậ ợ ộ ạ ượ ổ  ch c theo  c t ị

ữ ệ  (d  li u) đ ộ ở

ộ ư ế ị ư

ế

t b  l u tr )

ượ ư ư

. ế (tùy vào thi t b  nh p

ế ị ư ậ ) và ghi

ế ị

88

T p tin

ứ ớ m t d ng nào đó v i m t tên xác đ nh.  M t ộ dãy byte liên t cụ  (  góc đ  l u tr ). ữ  Đ c l u tr  trong các thi ữ ữ t b  l u tr  ngoài  ề nh  đĩa m m, đĩa c ng, USB… • V n t n t ẫ ồ ạ i khi ch • Kích th ướ c không h n ch  Cho phép đ c d  li u ( ọ ế ị t b  xu t ứ ươ ng trình k t thúc ạ ữ ệ thi ấ ). ữ ệ thi d  li u (

&

VC

T p tin

BB

Phân lo iạ

ế  Theo người s  d ng

ử ụ : quan tâm đ n n i dung ẽ ộ ở ộ ầ

ạ ậ t p tin nên s  phân lo i theo ph n m  r ng  .EXE, .COM, .CPP, .DOC, .PPT, …

ự ạ  Theo người l p trình ng

ườ ẽ

ử ụ ứ ậ ớ

ăn b nả  ( ng v i stream ị ể ậ t p tin ki u nh  phân ớ ứ ( ng v i

99

T p tin

ị ậ  t o các stream t : t ị ể ế ố ớ ậ minh đ  k t n i v i t p tin xác đ nh nên s ạ phân lo i theo cách s  d ng stream trong C  t p tin ki u v ể ả văn b n) và  stream nh  phân).

&

VC

ạ ậ

Phân lo i t p tin

BB

ể ăn b n)ả

ả ế ế

ự T p tin ki u văn b n (stream v ậ  Dãy các dòng k  ti p nhau.  M i dòng dài t ố đa 255 ký t ế  và k t thúc

ỗ ằ ệ b ng ký hi u cu i dòng ( end_of_line).

ộ  Dòng không ph i là m t chu i ỗ  vì không đ c ượ

ở i  ố ả ự ế k t thúc b i ký t

ặ ‘\0’.  Khi ghi ‘\n’ được chuy n thành c p ký t ự CR

ể (v  ề đầu dòng, mã ASCII 13) và LF (qua dòng,  mã ASCII 10).

1010

T p tin

ể  Khi đọc thì c p ặ CR­LF được chuy n thành

‘\n’.

&

VC

ạ ậ

Phân lo i t p tin

BB

ị ị T p tin ki u nh  phân (stream nh  phân)

ộ ể ậ  D  li u ữ ệ được đọc và ghi m t cách chính xác ,

ự ế không có s  chuy n   k t thúc chu i ‘ ể đổi nào c .ả ỗ \0’ và end_of_line không  Ký t

1111

T p tin

ự có ý nghĩa là cu i chu i và cu i dòng mà  ử được x  lý nh ỗ ọ ư m i ký t ố .  khác

&

VC

ặ Quy t c đ t tên t p tin

BB

Tên (name)

ở ộ M  r ng (extension)

.

• Không bắt buộc. • Thường có 3 ký tự. • Thường do chương trình ứng dụng tạo tập tin tự đặt

• Bắt buộc phải có. • Hệ điều hành MS-DOS: dài tối đa 8 ký tự. • Hệ điều hành Windows: dài tối đa 128 ký tự. • Gồm các ký tự A đến Z, số 0 đến 9, ký tự khác như #, $, %, ~, ^, @, (, ), !, _, khoảng trắng.

1212

T p tin

&

VC

ị ậ

Đ nh v  t p tin

BB

ộ ậ ư ụ ườ  Ch  đ n m t t p tin không n m trong th  m c

Đ ng d n ẫ ỉ ế ệ

ỉ ậ ủ ổ ư ụ data c a

ằ ụ c:\data\list.txt ch  t p tin   đĩa  ượ hi n hành. Ví d :  ằ list.txt n m trong th  m c   Trong ch C. c ghi

ự ề ươ ng trình, đ ỗ trong chu i nh  sau:   D u ấ ‘\’ bi u th  ký t ể

ể ể  đi u khi n nên đ  th   c.

ở ướ ộ ấ ‘\’   tr ậ ầ ng trình yêu c u nh p

ệ ư ườ ộ ấ ậ

1313

T p tin

ẫ ườ ng d n này đ ư “c:\\data\\list.txt” ể ị ả hi n nó ta ph i thêm m t d u  ươ ế Nh ng n u ch ỉ ẫ ừ  bàn phím thì ch  nh p m t d u  ng d n t đ ‘\’.

&

VC

ớ ậ

Quy trình thao tác v i t p tin

BB

ố ế ớ ậ ế ở ả ộ : t o m t stream n i k t v i t p tin  ỏ ượ c qu n lý b i bi n con tr

ấ STDIO.H

ẵ c đ nh s n trong  ấ ầ ượ ủ 1. M  t p tin ở ậ ở ầ c n m , stream đ ấ ế FILE đ n c u trúc   C u trúc đ ị ượ  Các thành ph n c a c u trúc này đ c dùng

ử trong các thao tác x  lý t p tin.

c t p tin) ng trình.

ươ ng trình lên t p tin.

1414

T p tin

ậ ậ 2. S  d ng t p tin ở ượ ậ ậ ử ụ  (sau khi đã m  đ  Đ c d  li u ươ ư ừ ậ ữ ệ  t ọ  t p tin đ a vào ch  Ghi d  li u ậ ừ ữ ệ  t  ch 3. Đóng t p tin ử ụ  (sau khi s  d ng xong).

&

VC

ở ậ

Hàm m  t p tin

BB

FILE *fopen(const char *filename, const char *mode)

ở ậ

ng d n) là ch a trong

ứ ả

ớ ể

ườ M  t p tin có tên (đ ở mode (xem b ng). filename v i ki u m

ỏ ể

FILE

ấ ắ

ậ ấ

Thành công: con tr  ki u c u trúc  ặ ấ ạ :  NULL  (sai  quy  t c  đ t  tên  t p  Th t  b i   đĩa,  không  tìm  th y  ể ọ ư

ư ụ

ở ậ

ấ ổ tin,  không  tìm  th y  th  m c, m  t p tin ch a có đ  đ c, …)

FILE* fp = fopen(“taptin.txt”, “rt”); if (fp == NULL)

printf(“Khong mo duoc tap tin!”);

1515

T p tin

&

VC

ố ố ở ậ

Đ i s  m  t p tin (mode)

BB

Đ i số ố Ý nghĩa

ở ậ

b

M  t p tin ki u

ị ể nh  phân

(binary)

ở ậ

t

M  t p tin ki u

ể văn b nả  (text) (m c đ nh )

ữ ệ ừ ậ

ả ề

r

ỉ ể ọ  d  li u t

t p tin. Tr  v  NULL

ch  đ  đ c ấ ậ

ở ậ ế

M  t p tin  n u không tìm th y t p tin.

w

ượ ạ ữ ệ

ữ ệ ỉ ể ch  đ  ghi ư ế c t o n u ch a có, ng

ẽ  d  li u vào t p tin. T p tin s   ẽ c đó s

ậ ướ i d  li u tr

c l

ế

ở ậ M  t p tin  ượ ạ đ ị b  xóa h t.

ố ậ

ữ ệ

a

(append) d  li u vào cu i t p

ỉ ể ch  đ  thêm ẽ ượ ạ

ư

ế

ở ậ M  t p tin  ậ tin. T p tin s  đ

c t o n u ch a có.

ữ ệ

r+

ổ ẽ ượ ạ

ư

ế

Gi ng mode r và b  sung thêm tính năng ghi d  li u  c t o n u ch a có. và t p tin s  đ

w+

Gi ng mode w và b  sung thêm tính năng đ c.

a+

Gi ng mode a và b  sung thêm tính năng đ c.

1616

T p tin

&

VC

ữ ệ

Đ c và ghi d  li u (stdio.h)

BB

 Nh p/xu t  ậ Th c hi n đ c/ghi d  li u theo các cách sau: ọ ệ ữ ệ  Nh p/xu t  ị ấ theo đ nh d ng ậ • Hàm: fscanf, fprintf • Chỉ dùng v i t p tin  ớ ậ ừ ấ t ng ký t ậ  lên t p tin

ớ ậ

ả . ki u văn b n ự  hay dòng • Hàm: getc, fgetc, fgets, putc, fputs • Ch  nên ả . ỉ  dùng v i ớ ki u văn b n ể  Đ c/ghi  ữ ệ ừ ộ ế  d  li u t ự ọ  b  nh  lên t p tin tr c ti p • Hàm: fread, fwrite • Chỉ dùng v i t p tin

ị ki u nh  phân

.

1717

T p tin

ậ ớ

&

VC

Hàm xu t theo đ nh d ng

BB

int fprintf(FILE *fp, char *fnt, …)

ữ ệ

fnt  (gi ng ố

ế

ị Ghi  d   li u  có  chu i  đ nh  d ng  hàm printf) vào stream fp. N u fp là

stdout thì hàm gi ng printf.

ượ

ả ề ố

c.

ượ

ấ ạ : tr  v

ả ề EOF (có giá tr  là ­1, đ

ị ử ụ

Thành công: tr  v  s  byte ghi đ Th t b i c  ị đ nh  nghĩa  trong  STDIO.H,  s   d ng  trong  ể ậ t p tin có ki u văn b n) int i = 2912; int c = ‘P’; float f = 17.06; FILE* fp = fopen(“taptin.txt”, “wt”); if (fp != NULL)

fprintf(fp, “%d %c %.2f\n”, i, c, f);

1818

T p tin

&

VC

Hàm nh p theo đ nh d ng

BB

int fscanf(FILE *fp, char *fnt, …)

ữ ệ

fnt  (gi ng ố

ế

Đ c  d   li u  có  chu i  đ nh  d ng  hàm scanf) t  stream  N u fp là

ỗ ị fp. stdin thì hàm gi ng printf.

ả ề ố

Thành công: tr  v  s  thành ph n đ c và  ư l u tr  đ Th t b i

ữ ượ c. ấ ạ : tr  v

ả ề EOF.

int i; FILE* fp = fopen(“taptin.txt”, “rt”); if (fp != NULL)

fscanf(fp, “%d”, &i);

1919

T p tin

&

VC

Hàm nh p theo đ nh d ng

BB

Ví dụ

ứ ộ ậ ỗ

ạ ỗ ị

 M t t p tin ch a nhi u dòng, m i dòng là  ề thông tin m i sinh viên theo đ nh d ng sau: • ­()tabtab<ĐTB> • Ví d : ụ 0312078­H. P. Trang(Nu)   17/06/85   8.5

không g pặ  ký t ự

ộ g pặ  m t trong

2020

T p tin

ự ừ ữ Đ c chu i thông tin ph c h p ứ ợ ọ  %[chu i]ỗ : đ c cho đ n khi  ế ọ ừ nào trong chu i thì d ng.  %[^chu i]ỗ : đ c cho đ n khi  ế ọ ỗ  trong chu i thì d ng. nh ng ký t

&

VC

Hàm Tách 2 M ngả

BB

struct SINHVIEN {

// 0312078 // H. P. Trang

char MSSV[8]; char HoTen[30]; char GioiTinh[4]; // Nu char NTNS[9]; float DiemTB;

// 17/06/85 // 8.5

}; void main() {

SINHVIEN sv; FILE *fp = fopen(“dssv.txt”, “rt”); if (fp != NULL) {

fscanf(fp, “%[^-]-%[^(](%[^)])\t%[^\t]

\t%f”, &sv.MSSV, &sv.HoTen, &sv.GioiTinh, &sv.NTNS, &sv.DiemTB);

fclose(fp);

}

}

2121

T p tin

&

VC

Hàm nh p ký t

BB

int getc(FILE *fp) và int fgetc(FILE *fp)

ự ừ  t

stream

fp.

ộ Đ c m t ký t getc  là  macro  còn  fgetc  là  phiên  b n  hàm  ủ c a macro

getc.

ự ọ

c sau khi

đ c đ

Thành công: tr  v  ký t

ượ ả ề ấ chuy n sang s  nguyên không d u.

ế ả ề EOF  khi  k t  thúc  stream

ạ :  tr   v   ặ ỗ i.

ể ấ Th t  b i ặ fp ho c g p l char ch; FILE* fp = fopen(“taptin.txt”, “rt”); if (fp != NULL)

ch = getc(fp); //  ch = fgetc(fp);

2222

T p tin

&

VC

ỗ ậ Hàm nh p chu i

BB

Int fgets(char *str, int n, FILE *fp)

ự ừ   t

stream  ủ n­1 ký t

fp  vào  vùng  ặ ự  ho c g p

Đ c  m t  dãy  ký  t nh  ớ str, k t thúc khi đ   ế  xu ng dòng. ký t

ả ề str.

ả ề NULL  khi  g p  l

i  ho c

Thành công: tr  v   ạ :  tr   v   Th t  b i ự EOF. ặ

ấ g p ký t

char s[20]; FILE* fp = fopen(“taptin.txt”, “rt”); if (fp != NULL)

fgets(s, 20, fp);

2323

T p tin

&

VC

Hàm xu t ký t

BB

int putc(int ch, FILE *fp) và int fputc(in ch, FILE *fp)

ự ch vào stream fp.

Ghi ký t putc  là  macro  còn  fputc  là  phiên  b n  hàm  ủ c a macro

putc.

ự ch.

Thành công: tr  v  ký t Th t b i

ả ề ả ề EOF.

ấ ạ : tr  v

FILE* fp = fopen(“taptin.txt”, “rt”); if (fp != NULL)

putc(‘a’, fp); // ho c ặ fputc(‘a’, fp);

2424

T p tin

&

VC

ỗ ấ Hàm xu t chu i

BB

int fputs(const char *str, FILE *fp)

ự str vào stream fp. N u ế fp là  puts

puts, nh ng ư

Ghi chu i ký t stdout thì fputs gi ng hàm  ghi ký t

xu ng dòng.

cu i cùng đã ghi.

Thành công: tr  v  ký t Th t b i

ả ề ả ề EOF.

ấ ạ : tr  v

char s[] = “Ky thuat lap trinh”; FILE* fp = fopen(“taptin.txt”, “wt”); if (fp != NULL)

fputs(s, fp);

2525

T p tin

&

VC

ế

ấ ự Hàm xu t tr c ti p

BB

int fwrite(void *buf, int size, int count, FILE *fp)

ướ

c  m i  m u  ớ buf vào stream

Ghi  count  m u  tin  có  kích  th tin là size (byte) t  vùng nh   ị ể fp (theo ki u nh  phân).

ẫ ng  m u  tin

(không ph i s  l

ả ề ố ượ ng byte) đã ghi.

Thành  công:  tr   v   s   l ả ố ượ ố ượ

ng nh  h n

ấ ạ : s  l

Th t b i

ỏ ơ count.

int a[] = {1, 2, 3}; FILE* fp = fopen(“taptin.dat”, “wb”); if (fp != NULL)

fwrite(a, sizeof(int), 3, fp);

2626

T p tin

&

VC

ế

Hàm nh p tr c ti p

BB

int fread(void *buf, int size, int count, FILE *fp)

ướ

ỗ c  m i  m u   stream

ẫ Đ c ọ count  m u  tin  có  kích  th tin là size (byte) vào vùng nh  ớ buf t ể fp (theo ki u nh  phân).

ẫ ng  m u  tin

ậ ự

(không ph i s  l ấ ạ : s  l

ỏ ơ count khi k t ế

Th t b i

ả ề ố ượ Thành  công:  tr   v   s   l ả ố ượ ng byte) th t s  đã đ c. ố ượ ng nh  h n  ặ ỗ ặ i.

thúc stream fp ho c g p l int a[5]; FILE* fp = fopen(“taptin.dat”, “wb”); if (fp != NULL)

fread(a, sizeof(int), 3, fp);

2727

T p tin

&

VC

ậ Hàm đóng t p tin xác đ nh

BB

int fclose(FILE *fp)

ẽ ượ

fp  s   đ

c  “vét”  (ghi

ữ ệ ế

ướ

Đóng stream fp. D   li u  trong  stream  h t lên đĩa) tr

c khi đóng.

ả ề Thành công: tr  v  0. ả ề EOF. Th t b i

ấ ạ : tr  v

FILE* fp = fopen(“taptin.txt”, “rt”); … fclose(fp);

2828

T p tin

&

VC

ấ ả

Hàm đóng t

t c  stream

BB

int fcloseall()

ượ

t  c   stream  đang  đ

ạ c  m   ngo i  ẩ stdin,  stdout,  stdprn,

ả Đóng  t tr   các  stream  chu n  stderr, stdaux. Nên đóng t ng stream thay vì đóng t

ấ ả t c .

ả ề ố ượ

ượ

Thành công: tr  v  s  l

ng stream đ

c

đóng.

Th t b i

ấ ạ : tr  v

ả ề EOF.

FILE* fp1 = fopen(“taptin1.txt”, “rt”); FILE* fp2 = fopen(“taptin2.txt”, “wt”); … fcloseall();

2929

T p tin

&

VC

ữ ệ

“Vét” d  li u trong stream

BB

ế

ạ ươ c

ử ụ ở ng trình k t thúc, các stream đang m   i. Tuy nhiên, ta  ườ ng minh các stream sau  ấ

ươ ướ ậ ng trình c khi ch

Khi ch ẽ ượ “vét” (flush) và đóng l s  đ nên đóng m t các t ể khi s  d ng xong (nh t là các stream t p tin) đ   tránh các s  c  x y ra tr ế k t thúc bình th ể ự ố ả ườ ng. ữ ệ

3030

T p tin

ấ ả Ta có th  “vét” d  li u trong stream mà không  ằ ầ c n đóng stream đó b ng m t trong hai hàm:  Vét stream fp xác đ nh:  ị int fflush(FILE *fp);  Vét t ở int flushall(); t c  stream đang m :

&

VC

Con tr  ch  v  (position indicator)

BB

Khái ni mệ

ơ ở ậ ọ ậ

a hay a+)

• •

ở ể ị

cu i t p tin khi m  đ  chèn (mode  ở ớ  đ u t p tin (hay giá tr  0) khi m  v i các mode

ở ở ầ ậ ị đ u t p tin (giá tr  0).

3131

T p tin

 Đ c t o t ượ ạ ự ộ  đ ng khi m  t p tin.  Xác đ nh n i di n ra vi c đ c/ghi trong t p tin ị ễ ệ V  trí con tr  ch  v ị ỉ ỏ ị  Khi t p tin ch a m :  ư ậ  Khi m  t p tin: ở ậ Ở ố ậ Ở ầ ậ khác (w, w+, r, r+).

&

VC

ầ ự

ấ Truy xu t tu n t

ẫ  & ng u nhiên

BB

ầ ự

ị ế ỉ

ướ (sequentially access)  Ph i đ c/ghi d  li u t ỏ ữ ệ ừ ị  v  trí con tr  ch  v  đ n  ữ ệ ạ ị ọ c khi đ c d  li u t

Truy xu t tu n t ấ ả ọ ị v  trí n­1 tr ầ i v  trí n. ỉ ỏ ế

 Không c n quan tâm đ n con tr  ch  v ị ỉ

ị do  ế ể  đ ng chuy n sang v  trí k   ữ ệ

ẫ ị ự ộ ỏ con tr  ch  v  t ọ ế ti p sau thao tác đ c/ghi d  li u. Truy xu t ng u nhiên (random access)

ạ ị ấ ỳ ấ  Có th  đ c/ghi t ể ọ

ậ ộ ữ ệ ầ

3232

T p tin

ướ ỏ ỉ i v  trí b t k  trong t p tin  ả ọ mà không c n ph i đ c/ghi toàn b  d  li u  tr  quan tâm đ n con tr  ch  v ế c đó ị.

&

VC

ặ ạ ị

Hàm đ t l

i v  trí con tr  ch  v

BB

void rewind(FILE *fp)

ị ề ầ

ặ ạ ị Đ t  l i  v   trí  con  tr   ch   v   v   đ u  (byte  0)  ậ fp. t p tin

Không

FILE* fp = fopen(“taptin.txt”, “w+”); fprintf(fp, “0123456789”); rewind(fp); fprintf(fp, “*****”);

3333

T p tin

&

VC

ị Hàm tái đ nh v  con tr  ch  v

BB

int fseek(FILE *fp, long offset, ing origin)

ặ ị

ầ ậ

ị ớ ị fp v i v   ố origin  (SEEK_SET  SEEK_CUR hay 1: v  trí  ố ậ

ỏ Đ t v  trí con tr  ch  v  trong stream  ớ ộ trí  offset  so  v i  c t  m c  hay 0: đ u t p tin;  hi n t

ệ ạ SEEK_END hay 2: cu i t p tin)

i;

ả ề

Thành công: tr  v  0. ị Th t b i

ả ề ấ ạ : tr  v  giá tr  khác 0.

ố ậ ạ

FILE* fp = fopen(“taptin.txt”, “w+”); fseek(fp, 0L, SEEK_SET);  //  rewind(fp); fseek(fp, 0L, SEEK_END); // cu i t p tin fseek(fp, ­2L, SEEK_CUR);// lùi l

ị i 2 v  trí

3434

T p tin

&

VC

ị Hàm xác đ nh v  trí con tr  ch  v

BB

long ftell(FILE *fp)

ỏ ứ

ị ệ ạ ủ ả ề ị i c a con tr  ch  v   ủ ậ ừ ị   v   trí  đ u  tiên  c a  t p  tin,  t c  là  0)

Hàm tr  v  v  trí hi n t (tính  t ủ c a stream

fp.

ả ề ị

ệ ạ ủ

i c a con

Thành công: tr  v  v  trí hi n t ị ỉ ỏ tr  ch  v . Th t b i

ấ ạ : tr  v

ả ề ­1L.

FILE* fp = fopen(“taptin.txt”, “rb”); fseek(fp, 0L, SEEK_END); long size = ftell(fp); printf(“Kich thuoc tap tin la %ld\n”, size);

3535

T p tin

&

VC

ế D u hi u k t thúc t p tin

BB

ế t kích th c t p tin

ướ ậ ể ư ẫ

 S  d ng fwrite đ  l u n m u tin ẫ ướ

ướ ậ ỉ ậ Khi đã bi ử ụ  kích th c = n * sizeof(1 m u tin);  S  d ng  ế ợ ử ụ hàm fseek k t h p hàm ftell Khi ch a bi ế ư t kích th  H ng s   ằ c t p tin ả ) ố EOF (=­1) (ch  cho t p tin văn b n

 while ((c = fgetc(fp)) != EOF) …

ố ậ ế ế

3636

T p tin

ả ề ố ả ề ố ố ậ ế  Hàm int feof(FILE *fp) (cho c  2 ki u t p tin) ể ậ  tr  v  s  0 n u ch a đ n cu i t p tin ư  tr  v  s  khác 0 n u đã đ n cu i t p tin. ế

&

VC

ả Các hàm qu n lý t p tin

BB

là các

fprintf, fscanf

ỗ fputc, fputs, fgetc, fgets

ớ fwrite, fread

fopen, fclose

Hàm qu n lý t p tin (File­Management function)

remove

3737

T p tin

ậ ổ Hàm nh p xu t t p tin (File I/O function) ấ ậ ậ ề ậ ướ ầ đã đ  c p ph n tr c  M  và đóng t p tin:  ậ ở  Nh p/Xu t t p tin: ấ ậ ậ • Theo đ nh d ng:  ạ ị • T ng ký t ự ừ  hay chu i:  • Tr c ti p t ế ừ ộ ự  b  nh :  ậ ả  Xóa t p tin:  ậ  Đ i tên t p tin: rename

&

VC

Hàm xóa t p tin

BB

int remove(const char *filename)

Xóa t p tin xác đ nh b i

ở filename.

ả ề

ả ề  Thành công: tr  v  0. ấ ạ : tr  v  ­1.  Th t b i

if (remove(“c:\\vc.txt”) == 0)

printf(“Tap tin vc.txt da bi xoa!”);

else

printf(“Ko xoa duoc tap tin vc.txt!”);

3838

T p tin

&

VC

Hàm đ i tên t p tin

BB

int rename(const char *oldname, const char *newname)

oldname thành newname. ả

ư

ph i  cùng  ả

ổ   đĩa  nh ng  không  ể ử ụ  (có  th   s   ư

Đ i tên t p tin  ậ Hai  t p  tin  ầ ế c n  thi t  ph i  cùng  th   m c ể ụ d ng đ  di chuy n hay sao chép t p tin).

ả ề

ả ề Thành công: tr  v  0. ấ ạ : tr  v  ­1. Th t b i

if (rename(“c:\\a.txt”, “c:\\BT\b.cpp”) == 0)

printf(“Doi ten tap tin thanh cong”);

else

printf(“Doi ten tap tin that bai”);

3939

T p tin

&

VC

ế Bài t p lý thuy t

BB

ự ể ả Bài 1: S  khác nhau gi a stream ki u văn b n  ữ

ổ ‘\n’

ự ự ệ ể ổ

ướ ả ấ ố ể và stream ki u nh  phân?  Stream văn b n t ự ể ả ự ộ  đ ng chuy n đ i ký t ị ặ  CR­LF trong khi stream nh   thành c p ký t ệ phân không th c hi n vi c chuy n đ i này (xem  ư ự ề  đ u nh  nhau). m i ký t Bài 2: C n ph i làm gì tr ầ c khi mu n truy xu t

ế ố ớ ậ ở ậ ạ ầ

4040

T p tin

ở ằ ậ t p tin?  M  t p tin (t o stream k t n i v i t p tin c n  m ) b ng hàm fopen.

&

VC

ế Bài t p lý thuy t

BB

ầ ở ậ

ẽ ả ề

ị ậ ị ầ ở

ỏ ế ậ ể c dùng thay cho t p tin

ấ ậ ể ng pháp đ  truy xu t t p tin?

Bài 3: Khi m  t p tin b ng fopen, ta c n ph i  ả ằ xác đ nh thông tin nào và hàm s  tr  v  cái gì?  C n xác đ nh tên t p tin c n m  và mode m   ở ầ ẽ ả ề ộ ậ t p tin này. Hàm s  tr  v  m t con tr  đ n ki u  ượ ỏ FILE, con tr  này đ ươ ng trình. trong ch Bài 4: Ba ph ươ ị ạ

ự .

4141

T p tin

 1. Theo đ nh d ng.  2. Theo ký t ỗ ự  / chu i ký t  3. Tr c ti p t ớ ế ừ ộ ự  b  nh .

&

VC

ế Bài t p lý thuy t

BB

ừ ậ ươ ể ọ ng pháp đ  đ c thông tin t t p

ứ ự  (theo th  t )

ầ ự ẫ ạ ị ấ ỳ i v  trí b t k )

Bài 5: Hai ph tin là gì?  1. Truy xu t tu n t ấ  2. Truy xu t ng u nhiên (t ấ ị ủ Bài 6: Giá tr  c a EOF?

 ­1 (đ nh nghĩa trong STDIO.H) ằ

Bài 7: Ta dùng h ng ký hi u EOF đ  làm gì? ả ượ ớ

4242

T p tin

ệ ậ ố ậ ử ụ ị ằ ể  Đ c s  d ng v i các t p tin ki u văn b n  ể ệ ấ nh m xác đ nh d u hi u cu i t p tin.

&

VC

ế Bài t p lý thuy t

BB

ố ậ ể ị Bài 8: Cách xác đ nh cu i t p tin trong ki u văn

ị ả ể

ể ử ụ ử ụ ể ể ậ ằ

ả ỉ ị

ị ị

ỏ ỏ ỉ ễ ơ ổ ị ọ ị ằ

4343

T p tin

ề ầ ậ ỉ ề ị ấ ỳ b n và ki u nh  phân?  S  d ng hàm foef cho c  hai ki u t p tin.  Trong ki u văn b n có th  s  d ng h ng EOF. Bài 9: Con tr  ch  v  là gì và cách thay đ i nó? ổ  Con tr  ch  v  đánh d u v  trí trong c a m t  ộ ủ ấ ậ t p tin, n i di n ra các thao tác đ c/ghi.  Thay đ i v  trí con tr  ch  v  b ng hàm rewind  ỏ (v  đ u t p tin) và fseek (v  v  trí b t k ).

&

VC

ế Bài t p lý thuy t

BB

ư ằ Bài 10: N u m  m t t p tin ch a có (b ng mode

ở ộ ậ ị ủ ị

ầ t giá tr  c a con tr  ch  v  lúc đ u? ủ ậ ỏ ị ự ầ ỉ ế ị đ u tiên c a t p

ế ế w), cho bi  Con tr  ch  v  ch  đ n ký t ỉ ỏ ị tin (v  trí 0).

ấ ả ậ t l nh đóng t t c  các stream t p tin. Bài 11: Vi

ế ệ  fcloseall();

ể ể Bài 12: Trình bày hai cách khác nhau đ  chuy n

ỉ ỏ ị ề ầ ậ

4444

T p tin

con tr  ch  v  v  đ u t p tin fp.  1. rewind(fp);  2. fseek(fp, 0, SEEK_SET);

&

VC

ế Bài t p lý thuy t

BB

ạ ươ Bài 13: Đo n ch ng trình sau có sai không?

void main() {

FILE *fp; int c; if ((fp = fopen(“abc.xyz”, “rb”)) == NULL)

printf(“Khong mo duoc tap abc.xyz\n”);

else {

while ((c = fgetc(fp)) != EOF)

fprintf(stdout, “%c”, c);

fclose(fp);

}

}

4545

T p tin

&

VC

Bài t p th c hành

BB

đ c nh p t

Bài 14: Vi ượ Bài 15: Vi

ế t ch ậ ừ ế t ch ừ ộ ậ ả ươ  bàn phím vào m t t p tin. ọ ươ i ph ố ng trình ghi 3 s  nguyên a, b, c  ộ ậ ố ng trình đ c 3 s  nguyên a, b,  ươ ng trình ax

ế

2+  c t  m t t p tin, sau đó gi ả bx + c = 0 r i ghi k t qu  vào m t t p tin khác. ừ   ầ

ế ọ ồ t ch

ng trình đ c n s  nguyên t ắ ướ ế ộ ậ ố c, sau đó s p x p tăng d n

4646

T p tin

Bài 16: Vi ươ ộ ậ m t t p tin cho tr ụ ế ồ r i ghi k t qu  vào 1 t p tin khác. Ví d : 4 2   5   1   4 ậ  4  1   2   4   5

&

VC

Bài t p th c hành

BB

ả ng trình ghi các dòng văn b n

đ c nh p t

ươ  bàn phím lên t p tin. ươ ậ ộ ộ ậ ng trình in n i dung m t t p tin Bài 17: Vi ượ Bài 18: Vi

ế ự ươ ế t ch ậ ừ ế t ch lên màn hình. t ch

ế

ộ ậ ố ế ng trình đ m s  ký t ộ ậ ấ ế ả ố ừ ủ ậ ng trình đ m s  t và xu t k t qu  ra m t t p tin khác.

ố ầ ặ ạ ủ ế ng trình đ m s  l n l p l t ch i c a

4747

T p tin

Bài 19: Vi ữ  ch  cái  ủ ậ c a t p tin và xu t k t qu  ra m t t p tin khác. Bài 20: Vi ế  c a t p tin  ấ ế Bài 21: Vi ế ộ ừ m t t ươ t ch ả ươ ộ ậ  trong m t t p tin.

&

VC

Bài t p th c hành

BB

ế ươ ở ậ ả Bài 22: Vi t ch ng trình m  t p tin văn b n đã

ổ ả ng đ i

ự ệ ấ ả ổ ộ ậ ữ ườ  khác không đ i.

t ch

t c  các ký t ng trình ghép 2 t p tin văn  ượ ứ ả ậ ậ c ghép sau t p

ướ

ộ ậ ộ c. ấ ươ có trên đĩa, sao chép nó thành m t t p tin văn  ề ớ ớ b n m i v i đi u ki n là các ch  th ữ thành ch  hoa, t Bài 23: Vi ươ ế ậ ộ b n, n i dung t p tin th  hai đ ấ ứ tin th  nh t. Bài 24: Vi ế Bài 25: Vi ế ng trình ghi m t danh sách c u

4848

T p tin

t sao sao chép m t t p tin cho tr t ch ậ ể ạ ọ ố trúc xu ng t p tin sau đó đ c lên ki m tra l i.