ề ậ ớ ệ Gi i thi u v  t p tin

ạ ậ Phân lo i t p tin

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

ử ộ ố M t s  hàm x  lý khác

Bài t pậ

T p tin văn b n ASCII

T p tin nh phân

khóa FILE đ

c đ nh

Khai báo bi n t p tin b ng t ế ậ

ượ ị

nghĩa trong v i c u trúc:

ừ ớ ấ

FILE Danh sách bi n ế con trỏ

Ví d :ụ

ế

FILE *fp; // Khai báo 1 bi n con tr file

ế

FILE *fp1,*fp2 // Khai báo nhi u bi n con tr file

đườ

fopen (char *

ng d n, char *ki u)

ế

để ở ộ ể ỏ

m  m t File, n u thành công  ứ

ượ

ả ề

c l i tr  v  NULL.

ng d n

đ

ấ ậ

ườ

ế

ng d n đ truy xu t t p tin. N u ể ng d n thì s truy xu t trong th m c hi n hành. ư ụ

ẫ : ch đ nh tên đ ị ẽ ẫ

ẫ ấ

ườ

Hàm dùng  ả ề tr  v  con tr  ki u File  ng v i File  ở v a m , ng Trong đó: ườ trong có đ Ví d : ụ

ườ

ng d n

ườ

các tùy ch n sau:

h p các ký t

mô t

fopen (“test.txt”,…) // Không đ ng d n ẫ fopen (“D:\\test\\test.txt”,…) // Có đ ả

ổ ợ

ki uể là t

ở ậ

“w”

đĩ ỉ để ghi vào  a. (n u  ã  ũ ẽ ị

ế đ M  t p tin ch   ậ có thì n i d ng t p tin c  s  b  xóa)

“w+”

. (n u  ã có thì

ớ ể đ c, ghi ọ ũ ẽ ị

ở ộ ậ ộ

M m t t p tin m i đ ế đ n i d ng t p tin c  s  b  xóa).

đ

ừ đĩ

“r”

ỉ để đọ

c t   a vào

ở ậ M  t p tin  ã có ch   ộ b  nh .

ở ậ

đ

đĩ để

“r+”

cđọ  ho c ặ

M  t p tin  ã có trên  a  ghi.

“a”

ở ậ ậ

M  t p tin  t p tin (không

để thêm vào (append) cu i ố c)

đọ đượ c

để

ở ậ

đọ

ế

“a+”

. N u t p tin  ã  ạ ư

đ c, ghi M  t p tin  ế có thì n i thêm. N u ch a thì t o t p  tin m i.ớ

ở ậ

“b”

M  t p tin ki u

ị ể nh  phân

(binary)

ở ậ

ă

“t”

M  t p tin ki u

ể v n b n

ả (text)

ụ ư

Ta có th k t h p các tùy ch n. Ví d nh “rt”, ể ế ợ “wb” hay “a+t”…

Ví d :ụ FILE *fp; fp = fopen (“SINHVIEN.TXT”, “rt”); if (fp==NULL) {

printf(“Khong mo duoc tap tin.”); perror (“Ly do\n”);

} else {

printf(“Da mo duoc tap tin.”);

}

int fclose (bi n_t p_tin)

đ ấ ở ả

ế    óng t t c  các File  ang m  ta còn

Để đ có th  dùng hàm:

ể int fcloseall ()

c

ượ

N u thành công 2 hàm này cho giá tr khác 0, ng ế i tr v EOF. l ạ ả ề

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

fclose (fp);

Ghi ký tự: (Làm vi c v i Text & Binary.)

ệ ớ

int putc(int ch, FILE *fp);

int fputc(int ch, FILE *fp);

có mã = ch%256. ẽ ộ

c ghi, ng c l ả ề i tr ượ ạ ả

2 hàm này s ghi vào file m t ký t ự N u thành công tr v mã ký t đ ự ượ ế v EOF. ề

File:

(Làm vi c v i Text & Binary. )

Đ c ký t ọ

t ự ừ

ệ ớ

int getc(FILE *fp);

int fgetc(FILE *fp);

ế c l Hàm đ c m t ký t mã c a ủ ký t ộ ự đ c đ t ự ừ ọ ượ File fp, n u thành công hàm cho ượ ạ ả ề EOF. i tr v c, ng

Ví d : ụ char c = fgetc (fp);

Ghi chu i ký t :

ự (Làm vi c v i Text )

ệ ớ

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

ả ề ký tự

c l ượ ố

Hàm s ghi chu i s lên File fp. n u thành công tr v ẽ cu i cùng đ Đ c chu i (dãy) ký t ổ ọ ế ượ ạ ả ề EOF. i tr v (Làm vi c v i Text ) ệ ớ ỗ c ghi vào File, ng File: t ự ừ

char *fgets(char *s, int n, FILE *fp);

File fp vào vùng nh s, k t ộ ế ớ

c t ự ừ ho c g p ký t ự ặ ặ ả ề đ a ch ị ế ỉ vùng nh n k t qu , ng xu ng dòng n u ự ố ậ ế ả ượ

i tr v Hàm s đ c m t dãy ký t ẽ ọ thúc khi đ ủ n-1 ký t thành công hàm tr v ạ ả ề NULL. l

Ghi d li u theo khuôn d ng

ữ ệ

ạ : (Làm vi c v i Text )

ệ ớ

int fprintf(FILE *fp, const char *control, ...);

ứ ị ỉ ủ ể ớ ỗ

 V i control ch a đ a ch c a chu i đi u khi n (gi ng nh ư

ố ị ủ ề ố

trong hàm printf), ... là danh sách các đ i mà giá tr c a chúng c n ghi vào File. ầ

Ví d :ụ

FILE *fp; int a=777 fp = fopen (“taptin.txt”, “wt”); if (fp!=NULL)

fprintf(fp, “%d\n”,a );

ụ ề ữ ệ

Ví d v ghi d li u: void taotaptin() //tao tap tin de ghi(lay du lieu bo

nho de ghi len tap tin)

{

FILE *fp; fp=fopen("TEXT.txt","wt"); if(fp!=NULL) {

char s[]=“Nguyen Van A”; float dtb = 8.5; //ghi du lieu len tap tin fprintf(fp,“Sinh vien ”); fputs (s,fp); fprintf(fp, “\nDiem trung binh %.2f”,dtb);

}

else

printf(“Ko tao duoc tap tin\n” );

}

Đ c d li u theo khuôn d ng: (Làm vi c v i Text )

ọ ữ ệ

ệ ớ

int fscanf(FILE *fp, const char *control,...);

ỉ ủ

ứ ị

ố ứ ế

File.

c t

ọ ượ ừ

V i ớ control ch a đ a ch c a chu i đi u khi n (gi ng nh ư trong hàm scanf), ... là danh sách các đ i ch a k t qu ả đ c đ Ví d :ụ

FILE *fp; int a; fp = fopen (char *tentaptin, “wt”); if (fp!=NULL && feof!=NULL) fscanf(fp, “%d”,&a );

ứ ợ

đượ đị

ụ ề ọ ữ ệ ộ

thông tin các sinh viên,  nh  sau:

đọ

ươ

ế

ng trình

c file

ư   ­()tabtab  MSSV (chu i)ỗ  HoTen (chu i)ỗ  Nam/Nu (s  nguyên)  NTNS (chu i)ỗ ố  DTB (s  th c) Ta c n vi t m t ch ộ ấ ạ text trên, xu t l i ra màn hình các  ừ ạ thông tin ngo i tr  HoTen 0812345­Nguyen Van A(Nam) 29/12/1990

9.5

Ví d v đ c d li u ph c h p: Ta có m t file text (sinhvien.txt) ch a  c  nh d ng

struct sinhvien {

char MSSV[9]; char HoTen [30]; char gioitinh[4]; char ntns[10]; float dtb;

}; void main() {

FILE *fp; sinhvien sv; fp = fopen ("ds.txt","rt"); if (fp!=NULL) {

fscanf(fp,"%[^­]­%[^(](%[^)])\t%[^\t]\t%f” ,

sv.MSSV,sv.HoTen,sv.gioitinh,sv.ntns,&sv.dtb);

fclose(fp);

} printf("%s\n(%s)\n%s\n %.2f",sv.MSSV,sv.gioitinh,sv.ntns,sv.dtb);

}

Ghi m t s nguyên : ộ ố

(Làm vi c v i Binary. ) ệ ớ

int putw(int n, FILE *fp);

N u thành công hàm tr v

c ghi

, ng

c l

ả ề s nguyên đ

ượ

i tr ượ ạ ả

 c m t s  nguyên : ố

(Làm vi c v i Binary.

ế v ề EOF. Đọ ộ )

int getw(FILE *fp);

ộ ố

đ c đ

c, khi có l

ọ ượ

i ho c ặ

Hàm đ c m t s nguyên(2 byte). N u thành công tr v ế cu i File hàm tr v

ả ề s nguyên ố ả ề EOF.

Ví d :ụ

void main() {

FILE *f; int n; f = fopen ("myfile.bin",“r+b"); if (f!=NULL) {

n=getw(f); if(n!=EOF)

printf("Da doc thanh cong!\n%d",n);

} else

printf("Loi");

}

Ghi các m u tin lên File: ẫ

int fwrite( void *pt, int size, int n, File *fp);

size

ỏ ỏ ớ

c c a m u tin (byte),

fp là con

V i ớ pt là con tr tr t ẫ

ướ ủ

i vùng nh ch a d li u c n ghi, ớ ứ ữ ệ ầ n làs m u tin, ố ẫ

Hàm s ghi n m u tin kích th

c size byte t

vùng nh pt

ướ

là kích th tr File. ẽ

lên File fp. Hàm tr v m t

c ghi.

ả ề ộ giá tr ị = s m u tin th c s đ

ự ự ượ

ố ẫ

Đ c các m u tin t

File:

int fread( void *pt, int size, int n, File *fp);

ỏ ỏ ớ

i vùng nh ch a d li u đ c đ ớ ứ ữ ệ

c, ọ ượ n là s m u tin c n ầ

ố ẫ

size là kích th đ c, ọ fp là con tr File.

Hàm s đ c n m u tin kích th

c size byte t

File fp vào

V i ớ pt là con tr tr t c c a m u tin (byte), ướ ủ ỏ ẫ

ướ

ẽ ọ ớ

vùng nh pt. Hàm tr v m t

ả ề ộ giá tr ị = s m u tin th c s

ự ự đ c đ

ố ẫ

ọ ượ . c

ng có ể ọ ườ ố ượ

Các hàm fread, fwrite th

cùng đ l n nh ộ ớ ng dùng đ đ c ghi các đ i t ố ự . ư c u trúc, s th c ấ

Ví d : Ghi c u trúc c a sinh viên

void GhiSV (SV *&sv){

FILE * f;

int n; f= fopen("DSSV.DAT","wb"); if (f!=NULL)

{

printf("\nNhap vao so sv: "); scanf("%d",&n); sv = (SV *)malloc (n*sizeof(SV)); for(int i=0; i

{

printf("\nNhap sv %d ",i+1); NhapSV(sv[i]);

}

for (i=0;i

printf("%s\t%s\n",(sv+i)->mssv,

(sv+i)->ten);

fwrite(sv,sizeof(SV),n,f); } fclose(f);

Ví d : Đ c c u trúc sinh viên

ụ ọ

ấ void DocSV (){

long l; SV *buffer;

int result; FILE *f; f= fopen("DSSV.DAT","rb"); if (f==NULL) printf("Khong mo duoc tap tin"); else{ fseek (f , 0 , SEEK_END); l = ftell (f);//tinh tong so byte cua tap tin rewind(f); buffer = (SV*) malloc (1*sizeof(SV)); result = 0; int count=0; while(!feof(f)){

if (count = fread(buffer,sizeof(SV),1,f)==1){

result += count; printf("Doc duoc %s %s\n",buffer-

>mssv,buffer->ten);}}

if(result == l/sizeof(SV))

printf("Thanh cong, doc duoc %d cau

truc\n", result);

else {

printf("Qua trinh doc loi\n"); printf("Doc duoc %d cau truc\n",

result);

} free (buffer);

} fclose (f);

}

int rename(“ten_tap_tin_cu”, “ten_tap_tin_moi”);

ng d n nh ẫ ng d n ườ ư fopen. ặ ị ẫ , m c đ nh cùng

ả ề

 Đ i tên t p tin. ậ  ten_tap_tin_cu: khai báo đ ườ  ten_tap_tin_moi: không c n ầ đ chung th m c v i t p tin cũ ư ụ ớ ậ Tr v 0 n u thành công. ế Vd: rename(“C:\\WINDOWS\\regedit.exe”,”hehe.txt”);

int remove(“ten_tap_tin_can_xoa”);

Thanh cong tra ve 0; Vd: remove(“C:\\WINDOWS\\regedit.exe”);

ệ ạ

int fflush(FILE *fp);  Làm s ch vùng đ m File fp Thành công cho giá tr 0, ng

i cho giá tr EOF. ị c l ượ ạ ị

int flushall(void);

ạ ở

c  Làm s ch vùng đ m c a các File đang m ệ ị ố ệ ủ ả ề ở ượ

N u thành công hàm tr v giá tr s t p đang m , ng ế l i tr vè EOF. ạ ả

 Dùng ki m tra l

i tr v 0. c l

int ferror(FILE *fp); i thao tác trên File fp. ỗ Hàm tr v giá tr khác 0 n u có l i, ng ế ị

ể ả ề ỗ ượ ạ ả ề

void perror(const char *s);

 In chu i s và thông báo l i h th ng. ổ ỗ ệ ố

int unlink(const char *filename);

 Xoá m t File trên đĩa ộ

N u thành công hàm cho giá tr 0, ng i tr v EOF. c l ế ị ượ ạ ả ề

void rewind(FILE *fp);

 Chuy n con tr ch v c a File fp v đ u File. ỏ ỉ ề ầ ị ủ ể

int fseek(FILE *fp, long so_byte, int vt_bat_dau);

vt_bat_dau.

ỏ ậ

 D i con tr t p tin đi so_byte tính t  N u:ế

i.

ướ c lên.

ố ượ

 so_byte > 0: chuy n xu ng d ể  so_byte < 0. chuy n ng ể  so_byte = 0: đ ng t

i vt_bat_dau.

ạ  vt_bat_dau có th mang m t trong các giá tr sau:

ứ ể  SEEK_SET(0): v trí đ u t p tin.  SEEK_CUR(1): v trí hi n hành.  SEEK_END(2): v trí cu i t p tin.

ộ ầ ậ ệ ố ậ

ị ị ị

long ftell(FILE *fp);

i c a ệ ạ ủ c ượ i hàm ỗ

Tr v v trí hi n t ả ề ị con tr ch v (byte) đ ị ỏ ỉ tính t 0. N u có l ế ừ tr v -1L. ả ề

fgetpos(FILE* f, fpos_t *vitri);

 Đánh d u trên t p tin . ấ  fpos_t là ki u đ nh nghĩa trong ậ ị ể

“stdio.h”

 *vitri là bi n con tr l u v trí ỏ ư ị

ế đánh d u trên t p tin ậ ấ

 Quay l

i v trí đánh d u

đánh d u b ng hàm

ấ sau khi fgetpos

ạ ị ấ

fsetpos(FILE* f, fpos_t *vitri)

t ch

1. Vi ế ộ

ng trình đ c t p tin văn b n có c u trúc là ọ ậ ươ m t ma tr n vuông (n*n) : ậ  Dòng đ u l u giá tr n. ầ ư  Các dòng ti p theo là m i dòng c a ma tr n. Hai s k ố ề ế ượ ư ở

1. Vi

ộ ụ c ghép vào t p tin th nh t).

Ví d :ụ 4 1 2 4 5 5 0 7 6 4 2 1 3 9 4 5 2 t ch ươ ế tin th hai ghép đ ứ

ng trình ghép 2 t p tin văn b n (n i d ng t p ậ

ứ ấ

ượ

ủ c l u b i kho ng tr ng. nhau đ ỗ ả ắ

ng trình đ nh p thêm d li u cho m u tin

ề ậ

t ch ươ ộ

ẫ ỉ ứ

ữ ệ ị

ng trình đ c d li u t

t ch

1. Vi ế c a m t sinh viên vào cu i t p tin nh phân ch ch a ố ậ ủ m u tin sinh viên. ẫ 2. Vi ươ ế

ọ ữ ệ ừ ậ

i các

ắ ế ạ

t p tin ch a các m u ứ tin là thông tin c a sinh viên. Sau đó s p x p l m u tin theo các thông tin.

t ch

ươ

ẫ 3. Vi ế

c không

ướ

4. Vi

ng trình tìm xem trong t p tin g m các m u ẫ tin SINHVIEN xem có sinh viên nào có MSSV là m t ộ mã đã cho tr t ch ế MSSV đ

ng trình s a ngày sinh c a m t sinh viên có c cho tr

c.

ươ ượ

ử ướ