1. Khi nim :Trc y chng ta xt vic nhp d liu t bn phm. Trong nhiu trng hp thc t , thun li , chng ta phi nhp d liu t cc tp tin trn a . Cc hm th vin ca C cho php truy cp tp tin v chia l 2 cp khc nhau : - cc hm cp 1 l cc hm cp thp nht , truy cp trc tip n cc tp tin trn a.C khng cung cp vng nh m cho cc hm ny - cc hm cp 2 l cc hm truy xut tp tin cao hn , do chng c C cung cp vng nh m i vi cc hm cp 1 , tp tin c xem l khi cc byte lin tc do khi mun truy cp mu tin c th th phi tnh ton a ch ca mu tin v nh vy cng vic vt v hn . Ngoi ra phi cung cp vng nh m cho kiu c ghi ny. i vi cc hm cp hai cng vic nh nhng hn do : - trnh bin dch t ng cung cp vng k c m cho chng - c th truy xut cc mu tin m khng gp kh khn nh vi cc hm cp 1 Trong C , cc thng tin cn thit cho cc hm xut nhp cp 2 c t trong tp tin stdio.h cn cc thng tin v hm nhp xut cp 1 th trong tp tin io.h
2. Stream v cc tp tin : Ta phi phn bit hai thut ng l stream v file .H thng xut nhp ca C cung cp mt khng gian tng tng gia ngi lp trnh v cc thit b c dng . Cp trung gian tng tng ny gi l stream v thit b c th l tp tin . a. Cc streams : Trong my tnh ta dng 2 loi stream : vn bn v nh phn . Mt stream vn bn l mt lot k t c t chc thnh dng m mi dng c kt thc bng k t xung dng newline(\n) . Khi ghi , mt k t chuyn dng LF(m 10) c chuyn thnh 2 k t CR( m 13) v LF . Khi c 2 k t lin tip CR v LF trn tp tin ch cho ta mt k t LF . Mt stream nh phn l mt lot cc byte . a. Cc tp tin : Trong C ,mt tp tin l mt khi nim logic m h thng c th p dng cho mi th t cc tp tin trn a cho n cc terminal . Khi bt u thc hin chng trnh , my tnh m 3 stream vn bn c nh ngha trc l stdin , stdout v stderr . i vi hu ht cc h thng , cc thit b ny l console
2. Nhp xut chun
1. Nhp xut k t , chui k t , nh dng v bn ghi : Nhp xut cp 2(nhp xut chun ) cung cp 4 cch c v ghi d liu khc nhau (ngc li nhp xut cp1 ch dng 1 trong 4 cch ny) . Trc ht d liu c th c ghi mi ln mt k t , tng t nh cch lm vic ca putchar() v getche() c d liu t bn phm v hin th ln mn hnh . Th hai , d liu c th nhp xut theo chui bng cc dng cc hm gets() v puts() Th ba , d liu c th c nhp v xut theo khun dng bng cc hm fprintf() v fscanf() Th t , d liu c c v ghi theo khi c chiu di c nh thng dng lu tr mng hay cu trc bng cc hm fread() v fwrite() . Tm li : Cc hm dng chung cho hai kiu nh phn v vn bn fopen : dng m tp tin
22 fclose : ng tp tin fclose : ng tt c cc tp tin fflush : dng lm sch vng m ca tp tin flushall : dng lm sch vng m ca tt c tp tin ferror : cho bit c li (khc khng) hay khng c li ( bng 0) perror : thong bo li trn mn hnh foef : cho bit cui tp tin hay cha unlink v remove : dng loi tp tin trn a fseek : di chuyn con tr n v tr bt k trn tp tin ftell : cho bit v tr hin ti ca con tr Cc hm nhp xut k t putc v fputc : nhp k t vo tp tin getc v fgetc : c k t t tp tin fprintf : dng ghi d liu nh dng ln tp tin fscanf : dng c d liu nh dng t tp tin fputs : dng ghi chui ln tp tin fgets : dng c chui t tp tin Cc hm dng cho kiu xut nhp nh phn putw : dng ghi mt s nguyn hai byte ln tp tin gets : dng c mt s nguyn hai byte t tp tin fwrite : dng ghi mt mu tin ln tp tin fread : dng c mt mu tin t tp tin
2.Dng vn bn v dng nh phn : Cch khc phn loi cc thao tc nhp xut tp tin l n c m theo kiu vn bn hay nh phn . im khc bit gia hai loi ny l k t newline v end of line . im th hai phn bit hai kiu tp tin l l cch lu tr cc s vo a . i vi dng vn bn th cc s c lu tr thnh chui cc k t cn dng nh phn th cc s c lu nh trong b nh , ngha l dng hai byte cho mt s nguyn v 4 byte cho mt s float .
3. Nhp xut chun : Chng trnh dng cc hm nhp xut cp 2 thng d hiu hn nn chng ta s nghin cu trc . a. Nhp xut k t : nhp k t vo tp tin ta dng hm putc() hay fputc(). c k t t tp tin ta dng hm getc() hay fgetc() . Chng trnh v d ny l to lp cc k t bng cch g vo bn phm mi ln mt k t v ghi vo mt tp tin trn a . Chng trnh dng hm fopen() m mt tp tin , dng hm putc() ghi ln tp tin , dng k t enter kt thc chng trnh . Chng trnh 3-1 : #include <stdio.h> #include <conio.h> void main() { FILE *fp; char ch; printf(Nhap cac ki tu : ); fp=fopen("textfile","w"); while ((ch=getche())!='\r') putc(ch,fp); fclose(fp); }
23 b. M mt tp tin : Trc khi ghi mt tp tin ln a ta phi m tp tin . m tp tin , trc ht ta phi khai bo mt con tr ch ti FILE . FILE l mt structure cha ng cc thng tin v cu trc ca tp tin v d nh kch thc , v tr ca b m d liu hin hnh . Cu trc FILE c khai bo trong stdio.h nn ta cn include tp tin ny . Ngoi ra stdio.h cn xc nh cc tn v cc bin khc c dng trong chng trnh hng n cc tp tin . Do vy trong chng trnh ta c cu lnh : FILE *fp ; Sau ta m tp tin bng lnh : fopen(textfile,w); Khi vit nh vy s lm cho h iu hnh bit l m mt tp tin tn l textfile trong th mc hin hnh vit ln tp tin (nh w) . Ta c th cho tn ng dn y nu mun m tp tin th mc bt k . Hm fopen() tr v mt con tr ch n cu trc FILE cho tp tin v con tr ny c ct gi trong bin fp . Chui w c gi l kiu , n c ngha l ghi ln tp tin . Cc kiu m tp tin l : r,rt m c , tp tin phi c trn a w,wt m ghi , nu trn a c tp tin th ni dung b ghi , nu cha c th tp tin c to lp a,at m ni thm, thng tin c ghi vo cui tp tin c nu c tp tin hay to mi tp tin r+,r+t m va c v ghi , tp tin phi c trn a rb m mt tp tin c theo kiu nh phn . Tp tin phi c sn trn a r+b m mt tp tin c theo kiu nh phn . Tp tin phi c sn trn a w+,w+t m va c v ghi , ni dung tp tin c trn a s b ghi ln wb m ghi theo kiu nh phn , nu trn a c tp tin th ni dung b ghi , nu cha c th tp tin c to lp a+,a+t m c v ni thm , nu tp tin cha c th n s c to ra ab m c v ni thm theo kiu nh phn , nu tp tin cha c th n s c to ra c. Ghi ln tp tin : Khi tp tin c m , ta c th ghi ln tp tin tng k t mt bng cch dng hm : putc(ch,fp) Hm putc() tng t cc hm putch() v putchar() . Hm putc() ghi ln tp tin c cu trc FILE c n nh bi bin fp nhn c khi m tp tin . Tin trnh ghi c tin hnh cho n khi nhn enter . d. ng tp tin : Khi khng c ghi na ta cn ng tp tin . Cu lnh ng tp tin l : fclose(fp); Ta bo cho h thng bit l cn ng tp tin ch bi fp . e. c tp tin : Nu ta c th ghi ln tp tin th ta cng c th c t tp tin . Ta c v d sau : Chng trnh 3-2 : #include <stdio.h> #include <conio.h> main() { FILE *fp; int ch; clrscr(); fp=fopen("textfile","r"); while ((ch=getc(fp))!=EOF)
24 printf("%c",ch); fclose(fp); getch(); }
f. Kt thc tp tin : S khc nhu ch yu gia chng trnh c v ghi l chng trnh c phi phn bit c u l k t EOF . N khng phi l mt k t m l mt s nguyn do h iu hnh gi ti . Khi ht tp tin ta gp m kt thc tp tin EOF (nh ngha trong stdio.h bng -1 ) v hm foef() cho tr khc khng . Ngi ta chn -1 lm m kt thc v nu cha gp cui tp tin th s c c mt byte m m s nm trong khong 0-255 . Nh vy gi tr -1 khng trng vi bt k k t no no c c t tp tin . Trong khi chng trnh ang c v hin th cc k t th n tm kim m gi tr -1 hay EOF . Khi thy gi tr ny , chng trnh s kt thc . Chng ta dng mt bin nguyn ct gi mt k t c c , do ta c th hiu du EOF nh l mt tr nguyn c tr l -1 . Nu dng mt bin kiu char , chg ta c th dng tt c cc k t t 0..255 - l t hp 8 bit . Do nu dng bin nguyn , ta bo m rng ch c mt gi tr 16 bit l -1 , l du EOF . g. S phin phc khi m tp tin : Hai chng trnh ta trnh by trn c mt li tim n . Nu tp tin c ch nh khng m c th chng trnh khng chy . Li ny c th l do tp tin cha c (khi c) hay a khng cn ch(khi ghi). Do vn l phi kim tra xem tp tin c m c hay khng , nu tp tin khng m c th hm fopen() tr v tr 0(0 l NULL trong stdio.h) . Khi ny C coi y khng phi l a ch hp l . Nh vy ta vit li chng trnh trn nh sau Chng trnh 3-3 : #include <stdio.h> #include <stdlib.h> #include <conio.h> void main() { FILE *fp; int ch; clrscr(); if ((fp=fopen("file","r"))==NULL) { printf("Khong mo duoc tap tin\n"); getch(); exit(1); } while ((ch=getc(fp))!=EOF) printf("%c",ch); fclose(fp); }
h. m s k t : Kh nng c v ghi tp tin trn c s cc k t cho php trin khai mt s ng dng . Chng ta xem xt chng trnh m s k t sau : Chng trnh 3-4 : #include <stdio.h> #include <conio.h> main(int argc,char *argv) { FILE *fp;
25 char string[8]; int count = 0; clrscr(); if (argc!=2) { printf("Format c:\<ten chuong trinh> <ten tap tin>"); getch(); exit(1); } if ((fp=fopen(argv[1],"r"))==NULL) { printf("Khong mo duoc tap tin\n"); getch(); exit(1); } while (getc(fp)!=EOF) count++; fclose(fp); printf("Tap tin %s co %d ki tu",argv[1],count); getch(); }
i. m s t : Ta c th sa chng trnh trn thnh chng trnh m s t . Chng trnh 3-5 : #include <stdio.h> #include <stdlib.h> #include <conio.h> main(int argc,char *argv[]) { FILE *fp; char ch,string[81]; int count = 0; int white=1; clrscr(); if (argc!=2) { printf(" Format c:\<Ten chuong trinh> <tentaptin>\n"); getch(); exit(1); } if ((fp=fopen(argv[1],"r"))==NULL) { printf("Khong mo duoc tap tin\n"); getch(); exit(1); } while ((ch=getc(fp))!=EOF) switch(ch) { case ' ': /*nu c du trng , dng mi hay tab*/
26 case '\t': case '\n': white++; break; default:if(white) { white=0; count++; } } fclose(fp); printf("Tap tin %s co %d tu",argv[1],count); getch(); return 0; }
k.Vo ra chui : c hay ghi chui trn tp tin cng tng t nh c hay ghi tng k t ring l . Ta xt mt chng trnh ghi chui Chng trnh 3-6 : #include <stdio.h> #include <string.h> #include <stdlib.h> #include <conio.h> void main() { FILE *fp; char string[8]; clrscr(); if ((fp=fopen("a.txt","w"))==NULL) { printf("Khong mo duoc tap tin\n"); getch(); exit(1); } while (strlen(gets(string))>0) { fputs(string,fp); fputs("\n",fp); } fclose(fp); } Trong chng trnh mi chui kt thc bng cch g enter v kt thc chng trnh bng cch g enter u dng mi . Do fputs() khng t ng thm vo m kt thc chuyn dng mi nn ta phi thm vo tp tin m ny . Chng trnh c mt chui t tp tin : Chng trnh 3-7 : #include <stdio.h> #include <string.h> #include <stdlib.h> #include <conio.h> void main()
27 { FILE *fp; char string[81]; clrscr(); if ((fp=fopen("a.txt","r"))==NULL) { printf("Khong mo duoc tap tin\n"); getch(); exit(1); } while (fgets(string,81,fp)!=NULL) printf("%s",string); fclose(fp); getch(); }
Hm fgets() nhn 3 i s : a ch ni t chui , chiu di ti a ca chui , v con tr ch ti tp tin . l. Vn sang dng mi : Trong chng trnh m k t ta thy s k t m c bao gi cng nh hn s byte c trong tp tin ny nhn c bng lnh dir ca DOS . Khi ta ghi mt tp tin vn bn vo a , C t ng ghi vo a c hai m CR v LF khi gp m sang dng mi \n . Ngc li khi c tp tin t a , cc m CR v LF c t hp thnh m sang dng mi . Chng trnh sau minh hoa thm v k thut vo ra chui , ni dung tng t lnh type ca DOS Chng trnh 3-8 : #include <stdio.h> #include <stdlib.h> #include <conio.h> main(int argc,char *argv[]) { FILE *fp; char string[81]; clrscr(); if (argc!=2) { printf("Format c:\<ten chuong trinh> <ten tap tin>"); getch(); exit(1); } if ((fp=fopen(argv[1],"r"))==NULL) { printf("Khong mo duoc tap tin\n"); getch(); exit(1); } while (fgets(string,81,fp)!=NULL) printf("%s",string); fclose(fp); getch(); return 0;
28 }
m. Cc tp tin chun v my in : Trn y ta ni n cch thc tip nhn mt con tr tham chiu dn mt tp tin trn a ca hm fopen() , C nh ngha li t chun ca 5 tp tin chun nh sau :
Tn Thit b in Thit b vo chun (bn phm) out Thit b ra chun (mn hnh) err Thit b li chun (mn hnh) aux Thit b ph tr chun(cng ni tip) prn Thit b in chun (my in)
Ta c th dng cc tn ny truy cp n cc thit b . Chng trnh sau dng hm fgets(0 v fputs() in ni dung mt tp tin ra my in Chng trnh 3-9 : #include <stdio.h> #include <stdlib.h> #include <conio.h> main(int argc,char *argv[]) { FILE *fp1,*fp2; char string[81]; clrscr(); if (argc!=2) { printf("Format c:\<ten chuong trinh> <ten tap tin>"); getch(); exit(1); } if ((fp1=fopen(argv[1],"r"))==NULL) { printf("Khong mo duoc tap tin\n"); getch(); exit(1); } if ((fp2=fopen("prn","w"))==NULL) { printf("Khong mo duoc may in\n"); getch(); exit(1); } while (fgets(string,81,fp1)!=NULL) fputs(string,fp2); fclose(fp1); fclose(fp2); getch(); return 0; } Trong chng trnh trn my in c coi l tp tin c tn l prn
29 n. Nhp xut nh dng : Trc y ta cp n nhp xut k t . Nhng s c nh dng cng c th ghi ln a nh cc k t . Ta xt chng trnh sau Chng trnh 3-10 : #include <stdio.h> #include <conio.h> main() { FILE *p; int i,n; float x[4],y[4]; clrscr(); p=fopen("test.txt","w"); printf("Cho so cap so can nhap n = "); scanf("%d",&n); fprintf(p,"%d\n",n); printf("Cho cac gia tri x va y\n"); for (i=0;i<n;i++) { scanf("%f%f",&x[i],&y[i]); fprintf(p,"%f %f\n",x[i],y[i]); } fclose(p); }
#include <stdio.h> #include<conio.h> #include <string.h> void main() { FILE *fp; char name[40]; int code; float height; int n,i; clrscr(); fp=fopen("b.txt","w"); printf("Cho so nguoi can nhap : "); scanf("%d",&n); for (i=0;i<n;i++) { printf("Nhap ten , ma so va chieu cao : "); scanf("%s%d%f",name,&code,&height); fprintf(fp,"%s %d %f",name,code,height); } fclose(fp); }
1. M sang dng theo hai kiu : Trong dng vn bn , mt k t chuyn dng tng ng vi 2 m CR v LF khi ghi vo tp tin trn a . Ngc li khi c , t hp CR/LF trn a tng ng vi k t sang dng mi . Tuy nhin nu m tp tin theo kiu nh phn th 2 m CR v LF l phn bit nhau . T s k t m chng trnh m c khc vi trng hp m tp tin bng kiu vn bn Chng trnh 3-12 : Chng trnh m s k t bng cch m tp tin theo kiu nh phn #include <stdio.h> #include <stdlib.h>
31 #include <conio.h> void main(int argc,char *argv[]) { FILE *fp; char string[81]; int count=0; clrscr(); if (argc!=2) { printf("Format c:\<ten chuong trinh> <ten tap tin>"); getch(); exit(1); } if ((fp=fopen(argv[1],"rb"))==NULL) { printf("Khong mo duoc tap tin\n"); getch(); exit(1); } while (getc(fp)!=EOF) count++; fclose(fp); printf("Tap tin %s co %d ki tu",argv[1],count); getch(); }
2. M kt thc tp tin theo 2 kiu : S khc bit th hai khi m tp tin theo kiu nh phn hay kiu k t cn l ch nhn nhn k t kt thc tp tin . Ni chung cc tp tin u c qun l theo kch thc ca n v khi c ht s byte ch ra trong kch thc tp tin th du hiu EOF s c thng bo , du hiu ng vi m 1Ah(hay 26 h 10) . Khi ng tp tin vn bn , m 1A s c t ng chn vo cui tp tin lm du hiu kt thc tp tin (tng ng m Ctrl-Z) . Do vy nu bng ch no ta chn m 1A vo mt v tr gia tp tin , th khi m tp tin theo kiu vn bn v c n m ny chng trnh c s ngng hn v chnh lc hm c pht sinh gi tr -1 bo cho chng trnh l kt thc tp tin . Nu lu s vo tp tin theo dng nh phn th khi m tp tin cn phi m theo dng nh phn . Nu khng s c mt s no l 1A v vic c tp tin theo kiu vn bn s kt thc ngoi nh . Tng t , vi tp tin m theo kiu nh phn m 10 khng c nhn nhn l m sang dng mi v khng c xem l tng ng vi t hp CR/LF na.
3. Chng trnh minh ho : Chng ta xt mt chng trnh dng kiu nh phn kho st tp tin . Chng trnh 3-13 : #include <stdio.h> #include <stdlib.h> #include <conio.h> #define length 10 #define true 0 #define false -1 void main(int agrc,char *argv[]) {
32 FILE *fp; int ch; int j,noteof; unsigned char string[length+1]; clrscr(); if (agrc!=2) { printf("Dang c:\<ten chuong trinh> <ten tap tin>"); getch(); exit(1); } if ((fp=fopen(argv[1],"rb"))==NULL) { printf("Khong mo duoc tap tin\n"); getch(); exit(1); } noteof=true; do { for (j=0;j<length;j++) { if ((ch=getc(fp))==EOF) noteof=false; printf("%3x",ch); if (ch>31) *(string+j)=ch;/* ki tu in duoc*/ else *(string+j)='.';/* ki tu khong in duoc*/ } *(string+j)='\0'; printf(" %s\n",string); } while (noteof==true); fclose(fp); getch(); }
4. Cc hm fread v fwrite : a. Ghi cu trc bng fwrite : Ta xt mt chng trnh ghi cu trc ln a . Trong chng trnh ta dng hm fread() . Hm ny c 4 i s : a ch ghi cu trc , kch thc ca cu trc , s cu trc s ghi v con tr ch ti tp tin . Chng trnh 3-14 : #include <stdlib.h> #include <stdio.h> #include <conio.h> void main() { char chso[10]; FILE *fp;
33 struct nguoi { char ten[30]; int so; float cao; }nv; clrscr(); if((fp=fopen("nhanvien.rec","wb"))==NULL) { printf("Khong mo duoc file\n"); getch(); exit(1); } do { printf("\nCho ten : "); gets(nv.ten); printf("Cho ma so : "); gets(chso); nv.so=atoi(chso); printf("Cho chieu cao :"); gets(chso); nv.cao=atof(chso); fwrite(&nv,sizeof(nv),1,fp); printf("Tiep tuc khong y/n?"); } while(getch()=='y'); fclose(fp); } b. c cu trc bng fread : Ta dng hm fread() c cu trc ghi trn mt tp tin . Cc i s ca fread() cng ging nh fwrite() . Hm fread() tr v s ca nhng mc c c ti . Nu tp tin kt thc n cho tr m . Ta xt v d sau : Chng trnh 3-15 : #include <stdlib.h> #include <stdio.h> #include <conio.h> void main() { FILE *fp; struct nguoi { char ten[30]; int so; float cao; }nv; clrscr(); if((fp=fopen("nhanvien.rec","rb"))==NULL) { printf("Khong mo duoc file\n"); getch(); exit(1); }
34 do { printf("\nTen :%s\n",nv.ten); printf("Ma so :%03d\n",nv.so); printf("Chieu cao :%.2f\n",nv.cao);
} while (fread(&nv,sizeof(nv),1,fp)==1); fclose(fp); getch(); }
c. Ghi mng bng fwrite() : Hm fwrite() cng dng ghi mng ln a . Ta xt v d sau : Chng trnh 3-16 : #include <stdio.h> #include <conio.h> #include <stdlib.h> int table[10]={1,2,3,4,5,6,7,8,9,10}; void main() {
d. c mng bng fread() : Sau khi ghi mng ln a ta c th c cc phn t ca mng t a bng hm fread(). Chng trnh 3-17 : #include <stdio.h> #include <conio.h> #include <stdlib.h>
void main() {
FILE *fp; int a[10]; int i; clrscr(); if((fp=fopen("table.rec","rb"))==NULL) {
35 printf("Khong mo duoc file\n"); getch(); exit(1); } for (i=0;i<10;i++) { fread(a,sizeof(a),10,fp); printf("\%3d",a[i]); } fclose(fp); getch(); }
e. V d v c s d liu : Ta xt chng trnh qun l nhn vin vi cc tp tin trn a nh sau : Chng trnh 3-18 : #include <stdlib.h> #include <stdio.h> #include <conio.h> #define true 1 struct nguoi { char ten[30]; int so; float cao; }; struct nguoi nv[10]; int n=0; char numstr[10];
void main() { char ch; void newname(void); void listall(void); void wfile(void); void rfile(void); clrscr(); while (true) { printf("\nGo 'e' de nhap nhan vien moi\n"); printf("Go 'l'de liet ke nhan vien\n"); printf("Go 'w' de ghi len dia\n"); printf("Go 'r'de doc file tu dia\n"); printf("Go 'q' de ket thuc chuong trinh\n\n"); ch=getch(); switch (ch) { case 'e':newname(); break; case 'l':listall();
36 break; case 'w':wfile(); break; case 'r':rfile(); break; case 'q': exit(1); default : printf("Nhap sai ki tu , chon lai!"); } } }
void newname() { char numstr[81]; printf("\nBan ghi so %d\nCho ten : ",n+1); gets(nv[n].ten); printf("Cho ma so co 3 chu so : "); gets(numstr); nv[n].so=atoi(numstr); printf("Cho chieu cao :"); gets(numstr); nv[n++].cao=atof(numstr); } void listall() { int j; if (n<1) printf("Danh sach rong\n"); for (j=0;j<n;j++) { printf("\nBan ghi so %d\n",j+1); printf("Ten :%s\n",nv[j].ten); printf("Ma nhan vien : %3d\n",nv[j].so); printf("Chieu cao :%4.2f\n",nv[j].cao); } }
void wfile() { FILE *fp; if (n<1) { printf("Danh sach rong , khong ghi\n"); getch(); exit(1); } if ((fp=fopen("nv.rec","wb"))==NULL) { printf("Khong mo duoc file\n"); getch();
37 exit(1); } else { fwrite(nv,sizeof(nv[0]),n,fp); fclose(fp); printf("Da ghi %3d ban ghi len dia\n",n); } }
void rfile() { FILE *fp; if ((fp=fopen("nv.rec","rb"))==NULL) { printf("Khong mo duoc file\n"); getch(); exit(1); } else { while(fread(&nv[n],sizeof(nv[n]),1,fp)==1) { clrscr(); printf("Ban ghi so %3d\n",n+1); printf("Ten nhan vien :%s\n",nv[n].ten); printf("Ma nhan vien :%3d\n",nv[n].so); printf("Chieu cao cua nhan vien :%.2f\n",nv[n].cao); getch(); n++; } fclose(fp); printf("Xong ! Tong so ban ghi da doc %3d\n",n); } }
4. Cc file ngu nhin
Cc tp tin cp trc y l cc tp tin tun t , ngha l tp tin m khi c hay ghi theo ch tun t t u n cui tp tin . i vi tp tin tun t ta khng th c hay ghi mt cch trc tip ti mt v tr bt k trn tp tin . Tp tin ngu nhin cho php ta truy cp ngu nhin vo nhng v tr cn thit trn tp tin . Cc hm dng khi truy cp tp tin ngu nhin l : rewind() : di chuyn con tr tp tin v u tp tin C php : void rewind(FILE *fp); fseek() : di chuyn con tr tp tin v v tr mong mun C php : int fseek(FILE *fp , long sb , int xp) fp - con tr tp tin sb - s byte cn di chuyn
38 xp - v tr xut pht m vic dch chuyn c bt u t . xp c th c cc gi tr sau : xp=SEEK_SET hay 0 : xut pht t u tp tin xp=SEEK_CUR hay 1 : xut pht t v tr con tr hin ti xp=SEEK_END hay 2 : xut pht t cui tp tin ftell() : cho bit v tr hin ti ca con tr tp tin Ta xt chng trnh v d sau : Chng trnh 3-19 : #include <stdlib.h> #include <stdio.h> #include <conio.h> void main() { struct nguoi { char ten[30]; int so; float cao; }nv; int recno; FILE *fp; long int offset; clrscr(); if ((fp=fopen("nhanvien.rec","r"))==NULL) { printf("Khong mo duoc file\n"); getch(); exit(1); } printf("Ban muon doc ban ghi thu may : "); scanf("%d",&recno); recno--; offset=recno*sizeof(nv); if (fseek(fp,offset,0)!=0) { printf("Khong di chuyen duoc con tro file toi do\n"); getch(); exit(1); } fread(&nv,sizeof(nv),1,fp); printf("Ten :%s\n",nv.ten); printf("Ma nhan vien : %3d\n",nv.so); printf("Chieu cao :%4.2f\n",nv.cao); getch(); }
5. Li vo ra
Ni chung , khi m tp tin thnh cng ta c th ghi ln n . Tuy nhin , nhiu trng hp khng m c tp tin nhng ta khng bit li do u . xc nh lli ta dng hm
39 ferror() . Hm ny c i s l con tr tp tin . Hm s c gi tr khng nu khng c li g . Ngc li hm cho gi tr khc khng . Ta cng c th dng hm perror() ch ni dung li . Chng trnh 3-20 : #include <stdio.h> #include<conio.h> #include <string.h> #include <stdlib.h> void main() { FILE *fp; char name[40],numstr[10]; int code; float height; int n,i; clrscr(); fp=fopen("a:\newfile.txt","w"); printf("Cho so nguoi can nhap : "); gets(numstr); n=atoi(numstr); for (i=0;i<n;i++) { printf("Nhap ten : "); gets(name); printf("Nhap ma so : "); gets(numstr); code=atoi(numstr); printf("Nhap chieu cao : "); gets(numstr); height=atof(numstr); fprintf(fp,"%s %d %f",name,code,height); if (ferror(fp)) { perror("Loi ghi file "); getch(); exit(1); } } fclose(fp); } Sau li do ta ghi , trnh bin dch s thng bo li c th trong cu Loi ghi file : no such file directory
6. Vo ra mc h thng
1.Cc tp tin tiu v bin chun : Trong cch vo ra mc h thng , ta phi khi to b m ri t d liu vo trc ghi hay c . Vo ra mc h thng c li ch lng m t hn vo ra chun v tc s nhanh hn . dng cc hm cp 1 ta phi cn cc tp tin tiu sau :
40 io.h - cha cc prototype ca cc hm cp 1 fcntl.h - cha cc nh ngha quyn truy cp sys/stat.h - ch cc nh ngha thuc tnh d.h - cha cc thuc tnh theo DOS 2. Tm tt cc hm : creat - to tp tin mi _creat - to tp tin mi theo kiu nh phn open - m tp tin _open - m tp tin tn ti close v _close - ng tp tin chmod - thay i thuc tnh ca tp tin _chmode - thay i thuc tnh ca tp tin theo kiu DOS perror - thng bo li (stdlib.h) write - ghi mt dy cc byte read - c mt dy cc byte lseek - dng di chuyn con tr v tr 3. c tp tin theo cch vo ra h thng : Ta c chng trnh c tp tin t a v hin th ln mn hnh theo cch vo ra h thng . Chng trnh 3-21 : #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <io.h> #define BUFFSIZE 512 char buff[BUFFSIZE]; void main(int argc,char *argv[]) { int inhandle,bytes,i; clrscr(); if (argc!=2) { printf("Dang <ten chuong trinh> <ten tap tin>"); getch(); exit(1); } if ((inhandle=open(argv[1],O_RDONLY|O_BINARY))<0) { printf("Khong mo duoc file\n"); getch(); exit(1); } while ((bytes=read(inhandle,buff,BUFFSIZE))>0) for (i=0;i<bytes;i++) putch(buff[i]); close(inhandle); }
4. Khi to b m : Trong chng trnh ta phi nh ngha b m bng pht biu #define BUFFSIZE 512 char buff[BUFFSIZE]
41 Nh ta c c d liu t a vo b m buff . Vi DOS , kch thc b m nn chn l bi s ca 512. 5. M mt tp tin : Cng ging nh vo ra bng hm cp 2 , ta phi m tp tin trc khi c hay ghi bng pht biu : inhandle=open(argv[1],O_RDONLY | O_BINARY); Biu thc ny thit lp s lin lc gia tp tin v h iu hnh . Trong biu thc ta cn mt hng lag oflag l du hiu cho bit mc dng tp tin .
oflag ngha O_APPEND t con tr cui tp tin O_CREAT To tp tin mi ghi(khng c hiu qu nu tp tin c ) O_RDONLY M mt tp tin ch c O_RDWR M mt tp tin ch c hay ghi O_TRUNC M v ct b bt tp tin O_WRONLY M tp tin ghi O_BINARY M tp tin kiu nh phn O_TEXT M tp tin kiu vn bn
6. Danh s ca tp tin : Trong vo ra chun , con tr tp tin s nhn c ngay khi gi hm fopen() cn trong nhp xut bng hm cp 1 ta nh c gi tr nguyn gi l danh s ca tp tin . y l s gn cho mt tp tin c th tham chiu n tp tin ny . Nu hm open() cho ta gi tr -1 ngha l danh s khng ng v pht sinh li . 7. c tp tin vo b m : c tp tin vo b m ta dng lnh : byte = read(inhandle , buff , BUFSIZE); Hm ny c 3 i s : danh s ca tp tin , a ch ca b m v s byte cc i cn c . Gi tr ca hm read() ch ra s byte c c . 8. ng tp tin : ng tp tin ta dng lnh close(inhandle); 9. Thng bo li : Khi hm open() cho gi tr -1 , ngha l c li . Dng li s c c bng perror() . Ta c chng trnh v d Chng trnh 3-22 : #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <io.h> #define BUFFSIZE 512 char buff[BUFFSIZE]; void main(int argc,char *argv[]) { int inhandle,bytes,i; clrscr(); if (argc!=2) { printf("Dang <ten chuong trinh> <ten tap tin>"); getch(); exit(1); } if ((inhandle=open(argv[1],O_RDONLY|O_BINARY))<0)
42 { perror("Khong mo duoc file\n"); getch(); exit(1); } while ((bytes=read(inhandle,buff,BUFFSIZE))>0) for (i=0;i<bytes;i++) putch(buff[i]); close(inhandle); }
10. Thao tc trn b m : Vic a tp tin vo b m c li l cho php truy cp trn b m thay v trn tp tin . Lm nh vy nhanh hn truy cp trn a . Chng trnh sau cho php tm mt t trong mt tp tin vn bn . Chng trnh 3-23 : #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <string.h> #include <io.h> #define BUFFSIZE 1024 char buff[BUFFSIZE];
void main(int argc,char *argv[]) { int inhandle,bytes; void search(char *,int); clrscr(); if (argc!=3) { printf("Dang <ten chuong trinh> <ten tap tin> <tu can tim>"); getch(); exit(1); } if ((inhandle=open(argv[1],O_TEXT))<0) { printf("Khong mo duoc file %s\n",argv[1]); getch(); exit(1); } while ((bytes=read(inhandle,buff,BUFFSIZE))>0) search(argv[2],bytes); close(inhandle); printf("Khong tim thay"); getch(); }
void search(char *cau,int buflen) {
43 char *p,*ptr; ptr=buff; while ((ptr=memchr(ptr,cau[0],buflen))!=NULL) if (memcmp(ptr,cau,strlen(cau))==0) { printf("Tu xuat hien lan dau trong cau tai vi tri %d:\n",ptr-buff+1); for (p=ptr;p<ptr+strlen(cau);p++) putch(*p); exit(1); } else ptr++; }
11. Hm dng b m : Hm search() l chng trnh con minh ho cch dng b m . Ta c mt hm memchr() dng : ptr = memchr(ptr , cau[0] , buflen); Hm ny dng tm v tr ca k t cau[0] trong chui ch bi ptr v f\di ca phn cn tm trong b m l buflen . Chng trnh s truyn argv[2] cho cau . Hm ny cho gi tr NULL khi khng tm thy k t cn tm . Ngc li n s cho a ch ca k t tm thy trong b m . Vic so snh cc chui cau v chui ptr c tin hnh nh hm memcmp trong cu lnh : if ((memcmp(ptr,cau,strlen(cau))==0) Hm ny cng c 3 i s l : chui thu nht ptr , chui thu hai cau v o dai can so sanh strlen(cau) 12. Ghi ln tp tin : Ghi thng tin ln tp tin phc tp hn c t tp tin . Ta c chng trnh v d sau dng chp t mt tp tin ny sang tp tin khc. Chng trnh 3-24 : #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <io.h> #include <sys\stat.h> #define BUFFSIZE 4096 char buff[BUFFSIZE];
void main(int argc,char *argv[]) { int inhandle,outhandle,bytes;
clrscr(); if (argc!=3) { printf("Dang <ten chuong trinh> <ten tap tin 1> <ten tap tin 2>"); getch(); exit(1); } if ((inhandle=open(argv[1],O_RDWR|O_BINARY))<0) {
44 printf("Khong mo duoc file %s\n",argv[1]); getch(); exit(1); } if ((outhandle=open(argv[2],O_CREAT|O_WRONLY|O_BINARY,S_IWRITE))<0) { printf("Khong mo duoc file %s\n",argv[2]); getch(); exit(1); } while ((bytes=read(inhandle,buff,BUFFSIZE))>0) write(outhandle,buff,bytes); close(inhandle); close(outhandle); printf("Da chep xong"); getch(); }
Trong v d trn ta m mt lc 2 tp tin vi danh s l inhamdle v outhandle Biu thc m tp tin ngun khng c g c bit cn biu thc m tp tin ch c dng : outhandle = open(argv[2] ,O_CREAT | O_WRONLY | O_BINARY , S_IWRITE) vi O_CREAT to tp tin trn a O_WRONLY ch ghi ln tp tin O_BINARY m tp tin theo kiu nh phn Khi m tp tin vi O_CREAT , i th 3 ca open() l mt trong 3 tr : S_IWRITE : ch cho php ghi ln tp tin S_IREAD : ch cho php c t tp tin S_IWRITE | S_IREAD : cho php c v ghi ln tp tin dng cc tr ny phi khai bo #include <sys\stat.h> sau khai bo #include<fcntl.h> . Hm write() c i tng t nh read() . Trong vng lp while hm read() bo s byte c c qua bin bytes v hm write() s bit s bytes cn ghi vo tp tin ch . Trong chng trnh ta dng b m vi kch thc kh ln chng trnh chy nhanh .