Chương 9

ộN i dung trình bày N i dung trình bày

ướ

ệ ậ i thi u t p tin ử ậ ậ

ọ ọ

1. Gi ậ c x  lý t p tin 2. Các b 3. Đ c – Ghi t p tin văn b n (Text file) 4. Đ c – Ghi t p tin nh  phân (Binary file)

2

ớ ớ

1. Gi 1. Gi

ệ ậ ệ ậ i thi u t p tin i thi u t p tin

T p tin ậ ượ

ợ  là m t t p h p thông tin đ ứ

ế

ộ ậ c  ch a  trong  các  thi

ặ c đ t tên  và  ữ  ngoài  c a ủ

ượ ị ư t  b   l u  tr ề

ế

,… ự ặ

đ ứ máy tính nh : ư đĩa c ng, đĩa m m, CD, DVD M t  t p  tin  luôn  luôn  k t  thúc  b ng  1  ký  t

đ c

End Of File)

ệ ắ

ộ ậ tệ  ký hi u là EOF ( bi T p tin ậ

ờ ướ

ữ ệ

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

ớ ộ buffer) trong đó   g n li n v i b  nh  đ m ( các thông tin d  li u  đ c  ể khi có  s  trung  chuy n  gi a  b   nh  máy  tính và  ậ t p tin

3

ớ ớ

1. Gi 1. Gi

ệ ậ ệ ậ i thi u t p tin i thi u t p tin

ể ạ

ế ố ớ

fopen c trao đ i

ượ ổ

◦Khi t p tin đ ậ ữ ậ

Đ  ng t k t n i v i m t t p tin, dùng l nh

fclose ủ

ươ ộ ậ

ệ ộ ế ị

ế ở

ươ vùng đ m t c ghi ra thi

Đ  t o k t n i v i m t t p tin, dùng l nh  ệ ộ ậ ể ượ ở c m , thông tin có th  đ ớ ng trình gi a t p tin đó v i ch ắ ế ố ớ ể ◦N u  đóng  m t  t p  tin  đang  m   thì  n i  dung  c a  ộ ậ ượ ứ ng  ng đ ọ ượ c  g i  là  ị ể ạ

ả ệ ◦Quá  trình  này  đ

4

flushing  và  đ m  b o  là  ệ t b  ngoài ả i trong vùng đ m không có thông tin b  đ  l

ớ ớ

ệ ậ ệ ậ

ọ ọ

1. Gi 1. Gi

i thi u t p tin: Minh h a i thi u t p tin: Minh h a

a a

a

b

c

c c

Vùng đệm (buffer)

Tập tin

Dữ liệu đang xử lý

5

fclose

ớ ớ

1. Gi 1. Gi

ệ ậ ệ ậ i thi u t p tin i thi u t p tin

Có 2 lo i t p tin: ạ ậ ◦T p tin văn b n ả ◦T p tin nh  phân

ậ ậ ị

ả ậ ậ ị T p tin văn b n T p tin nh  phân

ậ ầ ử ậ

ự ố ị Là t p tin mà các ph n t ủ c a nó là các ký t

ầ ử  là  Là t p tin mà các ph n t ễ ể các  s   nh   phân  bi u  di n  thông tin ỗ ầ ọ

ọ ộ ự ộ ỳ M i l n đ c hay ghi là đ c  hay ghi m t ký t

ọ ườ ậ ệ Vi c đ c hay ghi tu  thu c  i l p trình vào ng

ự ể ể  chuy n dòng  c chuy n thành 2 ký

6

ử Khi x  lý ký t ượ LF đ ự  CR và LF t

ộN i dung trình bày N i dung trình bày

ướ

ệ ậ i thi u t p tin ử ậ ậ

ọ ọ

1. Gi ậ c x  lý t p tin 2. Các b 3. Đ c – Ghi t p tin văn b n (Text file) 4. Đ c – Ghi t p tin nh  phân (Binary file)

7

ướ ử ướ ử

ậ ậ

Các b Các b

c x  lý t p tin c x  lý t p tin

ướ

ơ ả

Có 4 b

ể ử c c  b n đ  x  lý t p tin

ở ậ ọ

ữ ệ ử

8

ặ ậ ế ậ 1. Khai báo bi n t p tin ặ ể 2. M  t p tin đ  ghi ho c đ c ọ ậ 3. Ghi ho c đ c t p tin (x  lý d  li u) 4. Đóng t p tin

ướ ử ướ ử

ướ ướB c 1 B c 1

Các b Các b

ậ ậ c x  lý t p tin:  c x  lý t p tin:

ướ

ơ ả

Có 4 b

ể ử c c  b n đ  x  lý t p tin

ế ậ FILE *Tên_con_trỏ;

1. Khai báo bi n t p tin: ◦ Ví d :ụ

9

FILE *fp;

ướ ử ướ ử

ướ ướB c 2 B c 2

Các b Các b

ậ ậ c x  lý t p tin:  c x  lý t p tin:

ơ ả

Có 4 b

ể ử c c  b n đ  x  lý t p tin

fopen

ướ ở ậ 2. M  t p tin:  FILE* fopen( const char* filename, const char* mode ); ẫ

ủ ậ

ng d n và tên c a t p tin c n m

ứ ế

ườ ở ậ

t m  t p tin theo ki u nào

 filename:  ch a đ  mode: cho bi

ế

ố ậ

ủ ậ

ghi đè lên n i dung cũ c a t p tin)

ố ậ

ư

ườ

ư

 r (đ c)ọ  w (ghi)  a (ghi ti p vào cu i t p tin)  r+ (đ c và  ọ ghi)  w+ (đ c và  ghi, nh ng ư ọ  a+ (đ c và  ọ ghi vào cu i t p tin)  rb, wb, ab, rb+, r+b, wb+, w+b, ab+, a+b gi ng nh  các  ỉ ng h p trên nh ng ch  dùng cho t p tin nh  phân

tr

10

ướ ử ướ ử

Ví dụVí dụ

Các b Các b

ậ ậ c x  lý t p tin:  c x  lý t p tin:

ở ậ

Ví d : M  t p tin

ụ FILE *fp; fp = fopen("d:\\test.txt","w"); if (fp == NULL) {

cout << "Cannot open file"; exit(1);

11

}

ướ ử ướ ử

ậ ậ

ướ ướB c 3 B c 3

Các b Các b

c x  lý t p tin:  c x  lý t p tin:

ướ

ơ ả

Có 4 b

ể ử c c  b n đ  x  lý t p tin

ỗ ể ậ

 M i ki u t p tin có cách đ c và ghi khác nhau

ữ ệ ừ

ả ể

1 t p tin, ph i ki m tra xem có ph i  ố ậ

ậ ư

ế

ượ

ữ c n a

ậ ọ ặ 3. Đ c ho c ghi t p tin

ư

ố ậ ế

ể ọ ậ

ả ủ

 Đ  ki m tra có ph i cu i t p tin hay ch a, có th  dùng  hàm feof ho c dùng k t qu  c a nh ng hàm đ c t p  tin

int feof(FILE *fp);

12

◦ Chú ý:  Khi đ c d  li u t ọ ả ố ậ là cu i t p tin hay ch a, vì đ n cu i t p tin thì không  ể ọ th  đ c đ ể ể

ướ ử ướ ử

ướ ướB c 4 B c 4

Các b Các b

ậ ậ c x  lý t p tin:  c x  lý t p tin:

ướ

ơ ả

Có 4 b

ậ 4. Đóng t p tin:

ể ử c c  b n đ  x  lý t p tin int fclose( FILE *fp );  fp: là con trỏ tập tin muốn đóng

ọ ượ ẽ ế ấ ỳ ữ ệ ◦ Khi hàm đ c g i, nó s  vi

ế ậ ệ ậ

13

t b t k  d  li u nào  ồ ẫ v n còn trong vùng đ m đ n t p tin r i đóng t p  tin

ướ ử ướ ử

ậ ậ

Các b Các b

c x  lý t p tin c x  lý t p tin

ươ

ư ậ

ậ ng trình x  lý t p tin có d ng

ư

Nh  v y m t ch chung nh  sau: #include  #include  void main(){

FILE *fp; fp = fopen("thidu.dat","w"); if (fp==NULL) {

cout<<"Khong mo duoc tap tin"; exit(0);

} ậ ử /* x  lý t p tin */ fclose(fp);

}

14

ộN i dung trình bày N i dung trình bày

ướ

ệ ậ i thi u t p tin ử ậ ậ

ọ ọ

1. Gi ậ c x  lý t p tin 2. Các b 3. Đ c – Ghi t p tin văn b n (Text file) 4. Đ c – Ghi t p tin nh  phân (Binary file)

15

ậ ậ

ả putc ­  ả

fputc putc ­ fputc

Ghi t p tin văn b n:  Ghi t p tin văn b n:

putc và fputc.

ươ

Có hai hàm ghi ký t ươ Hai hàm này là t

ự ng đ

ậ  vào t p tin là  ng nhau

ố  mu n ghi vào t p tin ỏ ậ ◦ch: kí t ự ◦fp: con tr  t p tin

16

ỗ ầ ỉ ượ ự ◦M i l n ch  ghi đ ộ c m t kí t ậ  vào t p tin

ụVí d : putc ­  Ví d : putc ­

fputc fputc

ế

ự ừ  t

bàn phím và ghi vào file đ n khi g p

Đ c ký t ọ  $ ự kí t void main() {

FILE *fp;  char ch; if ( (fp=fopen(“test.txt”, "w")) == NULL )  { cout << "Cannot open file.\n";

exit(1);

} do {

ọ ừ

//đ c t

bàn phím //ghi vào file

//đóng file

ch = getchar();      fputc(ch, fp);     }while (ch != '$'); fclose(fp);

}

17

ọ ậ ọ ậ

Đ c t p tin văn b n:  Đ c t p tin văn b n:

ả getc ­ fgetc getc ­ fgetc   ả

Hàm đ c: ọ getc ho cặ  fgetc

int getc( FILE *fp );

int fgetc( FILE *fp );

ỏ ậ ◦fp: con tr  t p tin

ỗ ầ ộ t

t p tin ự ọ ượ ả ề c,  tr  v

18

đ c đ ậ ượ ◦M i l n ch  đ c m t ký t ự ừ ậ ỉ ọ ◦Hàm tr  v  mã ASCII c a ký t ủ ế ệ c kí hi u k t thúc t p tin ả ề ọ ế EOF n u đ c đ

ụVí d : getc ­ fgetc    Ví d : getc ­ fgetc

ự ừ  t

file và xu t ra màn hình

Đ c các kí t void main() {

FILE *fp; char ch; if ( (fp=fopen("test.txt", "r")) == NULL )  {

cout << "Cannot open file.\n"; exit(1);

} while (!feof(fp)) { ch = fgetc(fp); putchar(ch);

// in ra màn hình

}  fclose(fp);

}

19

ậ ậ

ả fputs fputs ả

Ghi t p tin văn b n:  Ghi t p tin văn b n:

Hàm ghi 1 chu i vào t p tin:

fputs

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

ỗ ầ ỏ ậ ◦str: chu i c n ghi vào t p tin ◦fp: con tr  t p tin

◦Hàm  tr   v   s   >0  n u  ghi  thành  công,  ng ế ượ ạ c  l i

20

ế ỗ ả ả ề ố ả ề EOF n u có l hàm tr  v i x y ra

Ví d : ụVí d : ụ fputs fputs void main() {

char str[80]; FILE *fp; if ( (fp = fopen("teststr.txt", "w")) == NULL ) {

cout << "Cannot open file.\n"; exit(1);

} do {

// write str to file

cout << "Enter a string (CR to quit):\n"; gets(str); strcat(str, "\n"); /* add a newline */ fputs(str, fp); } while( *str!='\n' ); fclose(fp);

}

21

ọ ậ ọ ậ

ả fgets fgets ả

Đ c t p tin văn b n:  Đ c t p tin văn b n:

ỗ ừ ậ

Hàm đ c 1 chu i t ọ

t p tin:

fgets

char *fgets( char *str, int length, FILE *fp );

◦str: chu i kí t ượ ự ọ ỗ c  đ c đ ◦length: s  kí t ọ ự ầ ố  c n đ c ◦fp: con tr  t p tin ỏ ậ

ọ ặ ự ế   t p  tin  cho  đ n  khi  g p  ký  t

c

◦Đ c  m t  chu i  t ỗ ừ ậ ộ ọ newline hay đã đ c đ ế ộ ượ length­1 ký tự ỏ ả ề str n u đ c thành công và m t con tr   ọ

22

◦Hàm tr  v   ế null n u không

Ví d : ụVí d : ụ fgets fgets

void main() {

char str[80]; FILE *fp; if ( (fp = fopen("teststr.txt", "r")) == NULL ) {

cout << "Cannot open file.\n"; exit(1);

} while( !feof(fp) )

{

fgets (str, 80 , fp); puts (str);

}

fc lo s e (fp);

}

23

ộN i dung trình bày N i dung trình bày

ướ

ệ ậ i thi u t p tin ử ậ ậ

ọ ọ

1. Gi ậ c x  lý t p tin 2. Các b 3. Đ c – Ghi t p tin văn b n (Text file) 4. Đ c – Ghi t p tin nh  phân (Binary file)

24

ậ ậ

ị ị

fwrite fwrite

Ghi t p tin nh  phân:  Ghi t p tin nh  phân:

Hàm ghi: fwrite

int fwrite( const void *buffer, size_t size, size_t count, FILE *fp ); ỉ ữ ệ ầ

ằ c d  li u mu n ghi (tính b ng byte)

Ví d :ụ

◦buffer: đ a ch  d  li u c n ghi ◦size: kích th ố ướ ữ ệ ◦count: s  đ i t ố ố ượ ố ng mu n ghi ◦fp: con tr  t p tin ỏ ậ

25

fwrite(&i, sizeof(int), 1, fp);

ậ ậ

ị ị

fwrite fwrite

Ghi t p tin nh  phân:  Ghi t p tin nh  phân:

 Ví d : T o t p tin nh  phân đ  ghi 10 s  nguyên

#include  void main() {

FILE *f; f = fopen("D:\\songuyen.dat", "wb"); if ( f == NULL ) {

cout << "Cannot open file.\n"; exit(1);

} for( int i=1; i<=10; i++ )

ụ ạ ậ ể ố ị

fwrite(&i, sizeof(int), 1, f);

fclose(f);

}

26

ậ ậ

ị ị

fwrite fwrite

Ghi t p tin nh  phân:  Ghi t p tin nh  phân:

 Ví d : Ghi thông tin c a 1 sinh viên vào t p tin ủ #include … struct svien{

char hoten[30]; float diem;

if (fp==NULL) … fwrite(&sv1, sizeof(svien),1, fp); fclose(fp); cout<<"Da luu thanh cong"; }

ụ ậ

}; void main() { struct svien sv1; // cho nhập sv1… // lưu sv1 FILE *fp; fp=fopen("nhanvien.dat", "ab");

27

Chú ý: Không ghi từng thành phần của cấu trúc vào tập tin mà ghi luôn cả cấu trúc

ọ ậ ọ ậ

ị ị

fread fread

Đ c t p tin nh  phân:  Đ c t p tin nh  phân:

Hàm ghi: fread

int fread( void *buffer, size_t size, size_t count, FILE *fp ); ỉ ữ ệ ầ

ằ ọ c d  li u mu n đ c (tính b ng byte)

ượ ể c, có th

Ví d :ụ

ọ ng đ c đ ố ậ ế ◦buffer: đ a ch  d  li u c n ghi ◦size: kích th ố ướ ữ ệ ◦count: s  đ i t ầ ố ố ượ ng c n đ c ◦fp: con tr  t p tin ỏ ậ ◦Hàm fread tr  v  s  đ i t ả ề ố ố ượ ể ể ả dùng k t qu  này đ  ki m tra cu i t p tin

28

fread(&i, sizeof(int), 1, fp);

ọ ậ ọ ậ

ị ị

fread fread

Đ c t p tin nh  phân:  Đ c t p tin nh  phân:

ọ ậ

Ví d : Đ c t p tin nh  phân có ch a 10 s  nguyên

và xu t chúng ra màn hình #include  void main() {

while ( (fread(&i, sizeof(int), 1, f)) != 0) {

int k; FILE *f = fopen("D:\\songuyen.dat", "rb");  if (f == NULL) … for( int i=1; i<=10; i++ ){       fread(&k, sizeof(int), 1, f);       cout<< k<<"      "; } fclose(f);

cout<< i<<" ";

}

}

29

ọ ậ ọ ậ

ị ị

fread fread

Đ c t p tin nh  phân:  Đ c t p tin nh  phân:

ọ ậ

Ví d : Đ c t p tin nh  phân có ch a 10 s  nguyên

và xu t chúng ra màn hình #include  void main() {

int k; FILE *f = fopen("D:\\songuyen.dat", "rb");  if (f == NULL) … while ( (fread(&i, sizeof(int), 1, f)) != 0) for( int i=1; i<=10; i++ ){ fread(&k, sizeof(int), 1, f); { cout<< i<<" "; cout<< k<<" ";

} } fclose(f);

}

30

ọ ậ ọ ậ

ị ị

fread fread

Đ c t p tin nh  phân:  Đ c t p tin nh  phân:

 Ví d : Đ c t p tin nh  phân có ch a 1 sinh viên và

ụ ứ

ọ ị ượ ọ ậ xu t thông tin đ c đ c ra màn hình

char hoten[30]; float diem;

}; void main(){

struct svien sv1; // đọc dữ liệu vào sv1 FILE *fp;

ấ #include … struct svien{

fp = fopen("nhanvien.dat","rb"); fread(&sv1, sizeof(svien), 1, fp); // xuất ra màn hình cout<

31

ọ ậ ọ ậ

ị ị

fseek fseek

Đ c t p tin nh  phân:  Đ c t p tin nh  phân:

ữ ệ

ầ ự

Ngoài vi c đ c d  li u ki u tu n t ọ

thì trong C  ấ ỳ i v  trí b t k

ớ ị ỏ ố i v  trí mong mu n

ỏ ậ

ể ọ ữ ệ ạ ị còn cho phép đ c d  li u t thông qua hàm: fseek int fseek( FILE *fp, long offset, int origin ); ◦Hàm này di chuy n con tr  file t ể ◦fp: con tr  t p tin ◦offset: v  trí byte mu n chuy n đ n ế ị ◦origin:

ệ ạ i

 SEEK_SET: chuy n t ể ừ ầ ậ  SEEK_CUR: chuy n t ể ừ ị  SEEK_END: chuy n t ể ừ

đ u t p tin  v  trí hi n t ố ậ  cu i t p tin

32

ể ố

ọ ậ ọ ậ

ị ị

fseek fseek

Đ c t p tin nh  phân:  Đ c t p tin nh  phân:

ể ữ ệ

freed, ho c ặ

Sau khi dùng hàm fseek đ  chuy n đ n v  trí  ế ố ữ ặ ọ mong mu n, mu n đ c d  li u ra ho c ghi d   ỉ ệ ị ệ li u vào v  trí đó ta ch  vi c dùng hàm  hàm fwrite

ượ

Vi c truy c p ph i xét xem có v

t ra ngoài kích

ệ ướ

ậ ủ ậ

ả c c a t p tin hay không

th ◦Hàm fseek cho giá tr  0 n u không v ị

ế ị ượ t ra ngoài

ủ ậ ế c c a t p tin, và cho giá tr  khác 0 n u có

33

kích th ỗ ả l ướ i x y ra

ọ ậ ọ ậ

ị ị

fseek fseek

Đ c t p tin nh  phân:  Đ c t p tin nh  phân:

ượ ư

ị c l u trong t p tin nh

Ví d  có 100 s  nguyên đ

ụ phân ◦Mu n đ c s  đ u tiên ta làm nh  sau: ố

ư ọ

ố ầ fseek(fp, 0, SEEK_SET); fread(&x, sizeof(int), 1, fp);

ố ứ ư ố ọ ◦Mu n đ c s  th  30 ta làm nh  sau:

fseek(fp, 29*sizeof(int), SEEK_SET); fread(&x, sizeof(int), 1, fp); ố ứ ư ố ọ ◦Mu n đ c s  th  n ta làm nh  sau:

34

fseek(fp, (n­1)*sizeof(int), SEEK_SET); fread(&x, sizeof(int), 1, fp);

BÀI T P 1Ậ BÀI T P 1Ậ

ư ậ ậ ố Nh p 10 s  nguyên và l u vào t p tin songuyen.dat

ố ừ ư ậ ­ Đ a ra màn hình các s  v a nh p

ậ ố ừ ộ ố ậ ư

ế ố ­ Nh p vào m t s  nguyên và ki m tra xem có trong  ế các s  v a nh p không? N u không thì đ a ra thông  báo, còn n u có thì in s  nguyên đó ra

ạ ậ ­  T o t p tin songuyen2.dat

ế ươ ấ ả ị ủ t ch ng trình sao chép t t c  các giá tr  c a

35

ậ ­  Vi ậ t p tin songuyen.dat vào t p tin songuyen2.dat

BÀI T P 2Ậ BÀI T P 2Ậ

ề ộ ọ ồ Thông tin v  m t h c sinh g m có :

ể ­ stt ­ H  tênọ ­ Năm sinh ­ Đi m trung bình

ộ ọ ạ ế ậ ổ ư

ớ ố ậ ọ ậ a. B  sung m t h c sinh vào t p tin hsinh.dat: n u t p  ế ậ tin ch a có thì t o m i, n u t p tin đã có thì b  sung  h c sinh đó vào cu i t p tin

ậ c a h c sinh: Nh p vào s  th  t

ố ứ ự ủ b. Tìm theo s  th  t ầ ọ ọ ệ ủ ọ

36

ố ứ ự   ủ c a h c sinh c n tìm, hi n thông tin c a h c sinh tìm  th yấ

fflush Hàm fflush Hàm

ấ ấ ả ộ

Hàm  fflush  dùng  đ   xu t  t

t  c   n i  dung  còn  l

i

trong buffer

Cú pháp:

int fflush( FILE *fp );

37

ộ ả ề ượ ạ ả ề ◦Hàm ghi n i dung còn trong buffer đ n fp ◦Hàm tr  v  0 n u thành công, ng ế ế c l i tr  v  EOF

Ệ Ệ

Ị Ị T P NH  PHÂN T P NH  PHÂN

ự ậ ị ế 3. Truy nh p tr c ti p d  li u nh  phân

ữ ệ ộ ể ể

ướ ượ ủ ệ

ệ ằ

ể ỏ ề ằ ớ

ủ ệ ướ

ỏ ệ ế ự ầ ậ ồ ị

ỏ ơ ị c không?

38

ữ ệ ư Tuy nhiên ta còn có m t cách khác đ  ki m tra xem  ậ vi c truy c p có v c c a t p không  t quá kích th b ng cách : ỉ ố ệ ­ Di chuy n con tr  v  cu i t p b ng hàm fseek v i ch   ố s  =2; ằ c c a t p b ng hàm ftell(con_tr _t p). ­ Tính kích th ả ­ R i so sánh xem v  trí b n ghi c n truy c p tr c ti p  ướ có nh  h n giá tr  kích th ướ ơ ­ N u l n  h n  kích th c => thông báo “Không có   trong têp” ph n t ­Ng ế ơ ầ ử ượ ạ c l i : Đ a d  li u ra.

Ệ Ệ

Ị Ị T P NH  PHÂN T P NH  PHÂN

ữ ệ

ế 3. Truy nh p tr c ti p d  li u nh  phân

ố ệ ư ể ví d  trên ta làm nh  sau : ề

Ở fseek(fpt, 0,2); //di chuy n v  cu i t p kich_thuoc=ftell(fpt);  if (kich_thuoc

39

{

6. Các stream chu nẩ 6. Các stream chu nẩ

Khi một chương trình thực thi, ba stream được mở tự động. Đó là stdin (standard input), stdout (standard output), và stderr (standard error). stdin dùng để đọc từ bàn phím, stdout và stderr dùng để viết đến màn hình.

Bởi vì standard streams là các con trỏ file nên có

thể dùng các hàm nhập xuất trên chúng.

40

4.10. Hàm rewind() 4.10. Hàm rewind()

ế

Hàm  rewind()  di  chuy n  indicator  đ n  đi m  b t  ể

ủ đ u c a file.

ư

Hàm có prototype nh  sau:

void rewind(FILE *fp);

41

4.11. Hàm ferror() 4.11. Hàm ferror()

ế

ạ ộ

t m t ho t đ ng trên file đã

Hàm ferror() cho bi i. ỗ

gây ra l Cú pháp:

int ferror(FILE *fp);

ả ề

Hàm  tr   v   true  n u  m t  l

ộ ỗ ọ

ướ

ế ạ ớ i  đã  x y  ra  v i  ho t  ượ ạ i  c l c khi g i hàm ferror(), ng

ộ ả ề

đ ng trên file tr tr  v  false.

42

4.12. Xóa file 4.12. Xóa file

Hàm remove() dùng đ  xóa t p tin.  Cú pháp:

int remove(const char *filename); ả ề

Hàm tr  v  zero n u xóa thành công, ng ế

ượ ạ i  c l

ả ề

tr  v  nonzero

43

Streams và Files 2. 2. Streams và Files

H  th ng nh p xu t c a C  ậ ấ

interface)  ậ ự ị t  b   th t  s

ươ ấ

ấ ủ ệ ố ◦Cung  c p  m t  giao  di n  ( ệ ộ ế ớ ộ ậ ấ nh t  quán  đ c  l p  v i  thi ươ ng tác.  ng trình t mà ch ◦cung c p m t m c đ  tr u t ộ ừ ượ ứ ộ ng gi a  ự ấ ậ ế ị ậ t b  nh p xu t. S   l p trình viên và thi ừ ượ ọ ượ c g i là  ng này đ tr u t stream và  ọ ế ị ậ ự ượ c g i là  t b  th t s  đ thi

file.

44

ậ ậ

ấ ấ

Streams (dòng nh p xu t) 3. 3. Streams (dòng nh p xu t)

ượ

c thi

ớ t k  đ  làm vi c v i  t ế

thi

nhi u lo i thi b  đ u cu i

H  th ng file c a C đ ủ ệ ế ị ạ t b  khác nhau nh  terminals ( ố ), các lo i

, ...

ạ ổ ể

ế

ệ ố ề ị ầ ệ ố ị

ế ế ể ư  đĩa, băng t H  th ng file chuy n đ i m i lo i thành m t thi ạ ỗ ổ t  ả ấ stream.  T t  c   stream  có  cùng

b   logic  g i  là  hành vi

45

ậ ậ

ấ ấ

Streams (dòng nh p xu t) 3. 3. Streams (dòng nh p xu t)

ộ ậ

Stream  đ c  l p  v i  thi

ư ể

ộ ậ ạ

ế

ư

ế t  b   nên  cùng  m t  ho t  đ ng trên stream nh  ghi vào m t t p tin trên đĩa  ể t  b   khác  cũng  có  th   dùng  đ   ghi  vào  lo i  thi màn hình).  nh  console ( Có hai lo i stream ạ :  ◦Văn b n (ả text)  ◦Nh  phân ( ị

binary).

46

3.1. Text Streams 3.1. Text Streams

ổ ự

M t ộ text  stream  là  m t  chu i  các  ký  t ự .  Trong  ể ị   có  th   b   chuy n

ộ ổ

m t  text  stream,  m t  s   ký  t đ i tùy thu c môi tr

ộ ộ ố ườ ng.

ộ ự

newline ('\n') có th  b  đ i thành c p    xu ng  dòng

ể ị ổ ký  t

carriage  return/linefeed  (

Ví d , ký t ụ ự ề ầ

ký  t và v  đ u dòng

).

47

3.1. Text Streams 3.1. Text Streams

ế

t  (hay  đ c)  và  nh ng  ký  t c vi

ế ị

ố ố

ố ự

Không  có  quan h   m t­m t  gi a  các  ký  t ệ ộ ữ ự ượ  đ  trên thi

ữ ự ượ   đ c  ị ế ự t  b     trên  các  thi ể ọ ế t (hay đ c) có th   t b  ngoài.

vi ngoài. Do đó s  ký t khác s  s  ký t

48

3.2. Binary Streams 3.2. Binary Streams

M t ộ binary stream là m t chu i bytes  t

ộ ớ

ớ ố

ổ ứ ươ ng  ng  ế ị t b  ngoài. Nghĩa  m t­m t v i chu i bytes trên thi ố ả ự là  không  có  s   chuy n  đ i  x y  ra.  Do  đó,  s   ằ ọ ế bytes  đ t  (hay  đ c)  thì  b ng  v i  s   bytes  trên thi

ượ c  vi ế ị t b  ngoài.

49

ề ệ ố ề ệ ố

ơ ả ơ ả

4.1. C  b n v  h  th ng file 4.1. C  b n v  h  th ng file

Các hàm liên quan đến file trong thư viện stdio.h

Tên hàm

Ch c năng

Tên hàm

Ch c năng

ở ộ

fopen( )

M  m t file

fclose( )

Đóng m t file.

ế

ự ế

putc( )

Vi

ộ t m t ký t

đ n m t file.

fputc( )

Gi ng nh

ư putc() .

50

ề ệ ố ề ệ ố

ơ ả ơ ả

4.1. C  b n v  h  th ng file 4.1. C  b n v  h  th ng file

Tên hàm

Ch c năng

ự ừ ộ

getc( )

ộ Đ c m t ký t

m t file.

t

fgetc( ) Gi ng nh

ư getc() .

ổ ừ ộ

fgets( )

ộ Đ c m t chu i t

m t file.

ế

fputs( )

Vi

ổ ế t m t chu i đ n m t file.

fseek( )

Tìm m t byte trong m t file.

51

ề ệ ố ề ệ ố

ơ ả ơ ả

4.1. C  b n v  h  th ng file 4.1. C  b n v  h  th ng file

Ch c năng

Tên  hàm ftell( )

ả ề ị

feof( )

ộ ỗ ả

ế

i x y ra.

Tr   v   v   trí  hi n  hành  c a  c a  file  indicator. Trả về true nếu duyệt đến cuối file (end- of-file). ả ề ư

ề ầ

ộ Xóa m t file.

ả ế

ferror( ) Tr  v  true n u m t l rewind( Đ a indicator v  đ u. ) remove( ) fflush( ) X  h t vùng đ m c a file.

52

ỏ ỏ

4.2. Con tr  file ( 4.2. Con tr  file (

File pointer)) File pointer

ỏ ế ị

ể ạ

ư

Con  tr   file  là  m t  c u  trúc  ki u  FILE,  tr   đ n  thông  tin  v   file  nh   tên  file,  tr ng  thái,  và  v   trí  hi n hành c a file.

ươ

ượ

ể ng  ng  đ

ở c  dùng  b i  stream  t ạ ộ

ứ th c hi n các ho t đ ng nh p xu t trên file.

ề ủ Con  tr   file  đ ỏ ệ Cú pháp khai báo:

FILE *fp;

53

4.3. M  fileở 4.3. M  fileở

ể ở ậ

ế

ộ ự ầ

ỏ ỏ ế ượ ạ c  l

ồ ạ

i, n i dung c a

ẽ ị

Các mode đ  m  t p tin ◦"r"  N u  t p  tin  đ ượ c  m   thành  công,  ả ớ hàm fopen() n p nó vào b  nh  và tr   ủ ề   đ u  tiên  c a  v   con  tr   tr   đ n  ký  t ả ề ậ i,  hàm  fopen()  tr   v   t p  tin.  Ng NULL ◦"w" N u t p tin t n t ế ậ nó s  b  ghi đè

54

4.3. M  fileở 4.3. M  fileở

• "a" Nếu tập tin được mở thành công hàm fopen() nạp nó vào bộ nhớ và trả về con trỏ trỏ đến ký tự cuối cùng của tập tin. Nếu tập tin không tồn tại, một tập tin mới được tạo. Trả về NULL nếu không thể mở tập tin.

• "r+" Nếu tập tin được mở thành công, hàm fopen() nạp nó vào trong bộ nhớ. Trả về NULL nếu không thể mở tập tin.

55

4.3. M  fileở 4.3. M  fileở

"a+" Nếu tập tin được mở thành công, hàm

fopen() nạp nó vào bộ nhớ và trả về con trỏ trỏ đến ký tự đầu tiên của tập tin. Nếu tập tin không tồn tại, một tập tin mới được tạo. Trả về NULL nếu không thể mở tập tin.

Các hoạt động có thể làm trên tập tin: đọc, ghi thêm nội dung mới vào cuối tập tin. Không thể sửa đổi nội dung đang có trong tập tin.

56