|
C 语言把文件看作是一个字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成。根据数据的组织形式,可分为 ASCⅡ 文件和二进制文件。文件的操作包括:文件的打开、文件的关闭、文件的读写操作、文件状态检查以及文件的定位等。 1 文件的打开1.1 函数原型FILE *fopen(char *pname,char *mode) 1.2 功能说明 按照 mode 规定的方式,打开由 pname指定的文件。若找不到由 pname 指定的相应文件,就按以下方式之一处理:
打开文件的作用:
FILE *:指出 fopen 是一个返回文件类型的指针函数; 1.3 参数说明pname:是一个字符指针,它将指向要打开或建立的文件的文件名字符串。 mode:是一个指向文件处理方式字符串的字符指针。 1.4 返回值正常返回:被打开文件的文件指针。! t" ~$ I5 D& X7 r" Z( Z2 i' }1 U FILE *fp;' Q3 d9 k" O, s# l //判断按读方式打开一个名叫test的文件是否失败0 b2 {) S0 C& K/ u" }9 D if((fp=fopen("test","r")) == NULL)//打开操作不成功 { printf("The file can not be opened.\n"); exit(1);//结束程序的执行 }; j" u3 x/ E5 M/ m1 p 要说明的是:C 语言将计算机的输入输出设备都看作是文件。例如,键盘文件、屏幕文件等。ANSI C 标准规定,在执行程序时系统先自动打开键盘、屏幕、错误三个文件。这三个文件的文件指针分别是:标准输入 stdin、标准输出 stdout 和标准出错 stderr。 2 文件的关闭2.1 函数原型 int fclose(FILE *fp);8 }8 N& r7 S9 M1 X3 D+ @ 2.2 功能说明 关闭由 fp 指出的文件。此时调用操作系统提供的文件关闭功能,关闭由 fp->fd 指出的文件;释放由 fp 指出的文件类型结构体变量;返回操作结果,即 0 或 EOF。 2.3 参数说明fp:一个已打开文件的文件指针。 2.4 返回值正常返回:0。3 }5 J3 q- A. A( G9 O1 r1 M( [# Y. R 3 文件的读写操作 3.1 从文件中读取一个字符( r6 i3 `, ?* L2 y2 z 3.1.1 函数原型/ ~3 v( `2 z k int fgetc(FILE *fp); 3.1.2 功能说明 从fp所指文件中读取一个字符。 3.1.3 参数说明fp:这是个文件指针,它指出要从中读取字符的文件。 3.1.4返回值正常返回: 返回读取字符的代码。0 h( B# E4 G" a6 T# i 显示指定文件的内容: //程序名为:display.c//执行时可用:display filename1 形式的命令行运行。显示文件filename1中的内容。例如,执行命令行display display.c将在屏幕上显示display的原代码。 //File display program." O1 Z$ f) F7 p! S, r" a2 W1 ]' d9 _ #include <stdio.h>: `& d8 T8 @, f; f void main(int argc,char *argv[]) //命令行参数' c! m" M8 u; [: m5 w6 t6 A1 e { int ch;//定义文件类型指针2 D4 s0 r6 N: l0 r K3 I9 x+ U FILE *fp;//判断命令行是否正确 if(argc!=2) {% U, F) i" u) e9 E3 t8 ^8 f printf("Error format,Usage: display filename1\n"); return; //键入了错误的命令行,结束程序的执行 }/ d! w. n# n8 ?" f! Z //按读方式打开由argv[1]指出的文件+ x) Z2 y% Q( S6 A% k if((fp=fopen(argv[1],"r"))==NULL) {5 u6 E- B# B% A( k+ M printf("The file <%s> can not be opened.\n",argv[1]);//打开操作不成功 return;//结束程序的执行3 l1 S7 B$ ~' b: a; Y9 L- j }* p; e) d) K; o, h: O% E //成功打开了argv[1]所指文件 ch=fgetc(fp); //从fp所指文件的当前指针位置读取一个字符 while(ch!=EOF) //判断刚读取的字符是否是文件结束符' x+ [ k" d: z$ e8 X {; t# X: ]8 q( U. f putchar(ch); //若不是结束符,将它输出到屏幕上显示 ch=fgetc(fp); //继续从fp所指文件中读取下一个字符. F2 K! m+ x" c" H" C4 e9 e } //完成将fp所指文件的内容输出到屏幕上显示 fclose(fp); //关闭fp所指文件. u. ~6 |+ ?2 q9 @4 `+ [ } 3.2 写一个字符到文件中去2 A0 b/ M2 T# W" u 3.2.1 函数原型7 @* b' l3 n: d& Y& N. Y. x/ o int fputc(int ch,FILE *fp) 3.2.2 功能说明 把 ch中的字符写入由 fp 指出的文件中去。 3.2.3 参数说明ch:是一个整型变量,内存要写到文件中的字符(C 语言中整型量和字符量可以通用)。 fp:这是个文件指针,指出要在其中写入字符的文件。 3.2.4 返回值正常返回: 要写入字符的代码。. Z- n# n) N% A 将一个文件的内容复制到另一个文件中去: //程序名为:copyfile.c. T7 F6 [! G& x) L1 ?% R//执行时可用:copyfile filename1 filename2形式的命令行运行,将文件filename1中的内容复制到文件filename2中去。! G$ @8 w3 s4 u2 a3 p F- W4 k //file copy program. #include <stdio.h>/ \4 E" j" O7 L6 K3 P: P* _, l( W void main(int argc,char *argv[]) //命令行参数0 f5 v$ V" s6 b/ ~7 } { int ch; FILE *in,*out; //定义in和out两个文件类型指针3 h9 n1 ~: O' n* S if(argc!=3) //判断命令行是否正确 { printf("Error in format,Usage: copyfile filename1 filename2\n");" S( m* s1 I' r: ^ return; //命令行错,结束程序的执行4 q( l! c$ A* a- u. | } //按读方式打开由argv[1]指出的文件9 b: x4 u; v2 E8 x if((in=fopen(argv[1],"r"))==NULL)* f# k) M" f1 B# r- w" ]9 j2 O {% ]/ a, S( V0 P- Y X- a' ~ printf("The file <%s> can not be opened.\n",argv[1]); return; //打开失败,结束程序的执行$ l6 |/ _4 l9 [4 e; v" c } //成功打开了argv[1]所指文件,再 //按写方式打开由argv[2]指出的文件4 _) l7 R* C4 t/ \( ?+ r7 V if((out=fopen(argv[2],"w"))==NULL) { printf("The file %s can not be opened.\n",argv[2]);, i! j2 R4 e8 P2 h6 r return; //打开失败,结束程序的执行1 _ A8 ^8 H. I } //成功打开了argv[2]所指文件8 F; ^4 @( q/ l ch=fgetc(in); //从in所指文件的当前指针位置读取一个字符 while(ch!=EOF) //判断刚读取的字符是否是文件结束符+ E% {- u( f; d7 U { fputc(ch,out); //若不是结束符,将它写入out所指文件 ch=fgetc(in); //继续从in所指文件中读取下一个字符5 F" l) A2 b2 e; Z: m5 A3 \- G } //完成将in所指文件的内容写入(复制)到out所指文件中 fclose(in); //关闭in所指文件3 l( f$ Y2 S/ { Y' D fclose(out); //关闭out所指文件 }* c5 s2 F# b% ~& `. ^ 按十进制和字符显示文件代码,若遇不可示字符就用井号"#"字符代替之。 //程序名为:dumpf.c- x$ W5 \1 L$ J, V# Z& F% @2 L//执行时可用:dumpf filename1 形式的命令行运行。 // File dump program. #include <stdio.h> void main(int argc,char *argv[]) { char str[9]; int ch,count,i;" F4 M' P& M4 r$ } FILE *fp; if(argc!=2); M: q: M' n5 O {& N7 g# h- L9 t5 c( |% P6 `1 o8 S printf("Error format,Usage: dumpf filename\n");* F( c6 r3 A5 d/ l) f5 k return; l* N) m8 ]) q7 B# l: I }) f$ j2 V. J5 d: {) ` c) c if((fp=fopen(argv[1],"r"))==NULL) {+ w* c, T; `5 ^' o3 k) k printf("The file %s can not be opened.\n",argv[1]);. d$ q9 ~. v! _7 W6 G% a return; }$ W% }7 r5 k. L: \6 G( x q& z3 ]$ K count=0; do{" t$ {$ K- {. V, |3 A- ? i=0; //按八进制输出第一列,作为一行八个字节的首地址; _ h/ n) T s g* B' s- f printf("%06o: ",count*8);, k4 Q+ ?8 W' o/ K* p# f do{; r- s& \' a" d; W6 B // 从打开的文件中读取一个字符 ch=fgetc(fp); // 按十进制方式输出这个字符的ASCII码 printf("%4d",ch); // 如果是不可示字符就用"#"字符代替 if(ch<' '||ch>'~') str='#';7 ?: {8 _5 c* q% @ // 如果是可示字符,就将它存入数组str以便形成字符串9 _: l( {+ U6 D# R- J4 G else str=ch;( X& C& C+ d0 b" z; e Y // 保证每一行输出八个字符 if(++i==8) break;3 A5 q& `6 X0 ]* `* \: ]! {( _: | }while(ch!=EOF); // 遇到文件尾标志,结束读文件操作9 g( ?4 j4 l9 E+ }* A str='\0'; // 在数组str加字符串结束标志+ ^9 m6 I* r5 i {0 i9 K, o for(;i<8;i++) printf(" "); // 一行不足八个字符用空格填充# Q/ k- ~# p# w- m/ b* \$ z" z; C printf(" %s\n",str); // 输出字符串% }/ {8 c0 L* W) C count++; // 准备输出下一行 }while(ch!=EOF); // 直到文件结束 fclose(fp); // 关闭fp所指文件; H7 q8 ?) `7 l: x$ O }- t/ m4 p, x8 Q% G" i# [ 3.3 从文件中读取一个字符串/ D5 n2 \* k2 n( l- U8 h 3.3.1 函数原型7 {& K3 x _' K' J' w char *fgets(char *str,int n,FILE *fp)& ]+ a ]4 [: K7 p7 S8 b 3.3.2 功能说明 从由 fp 指出的文件中读取 n-1 个字符,并把它们存放到由 str 指出的字符数组中去,最后加上一个字符串结束符 '\0'。 3.3.3 参数说明str:接收字符串的内存地址,可以是数组名,也可以是指针。. M* |; t4 I8 R- ~" x( M 正常返回:返回字符串的内存首地址,即 str 的值。 3.4.1函数原型 int fputs(char *str,FILE *fp) 3.4.2 功能说明 把由 str 指出的字符串写入到 fp 所指的文件中去。 3.4.3 参数说明str:指出要写到文件中去的字符串。 fp:这是个文件指针,指出字符串要写入其中的文件。 3.4.4 返回值正常返回: 写入文件的字符个数,即字符串的长度。 将一个文件的内容附加到另一个文件中去。 //程序名:linkfile.c//执行时可用:linkfile filename1 filename2形式的命令行运行,将文件filename2的内容附加在文件filename1之后。 // file linked program.' C H. X$ M' B- k/ X #include <stdio.h>5 |) o$ b! W$ N4 } #define SIZE 512( X5 Y1 w2 {4 D5 D- w' w, z" Y+ z void main(int argc,char *argv[])6 X/ }4 C; O) H' Z# O { char buffer[SIZE];7 r, l1 h2 n2 [5 x( F FILE *fp1,*fp2; if(argc!=3) { printf("Usage: linkfile filename1 filename2\n"); return; } // 按追加方式打开argv[1] 所指文件; X) H {7 w4 s if((fp1=fopen(argv[1],"a"))==NULL) {) E9 J0 r8 l! }' J printf("The file %s can not be opened.\n",argv[1]);( f. ]% B' o& y$ C# }! E return; } if((fp2=fopen(argv[2],"r"))==NULL) {% G2 K; j) k% [/ z- [+ i printf("The file %s can not be opened.\n",argv[2]);/ o0 [: ]+ b, @" d! d! Q return;+ M* I, U/ S, L3 u } // 读入一行立即写出,直到文件结束 while(fgets(buffer,SIZE,fp1)!=NULL)& _* I$ K/ Z, g* A u5 K" z d printf("%s\n",buffer); while(fgets(buffer,SIZE,fp2)!=NULL)0 g2 d% x; [- v* K, r fputs(buffer,fp1); fclose(fp1); fclose(fp2); if((fp1=fopen(argv[1],"r"))==NULL) {" U) J) o- h* ~6 N, B- x G printf("The file %s can not be opened.\n",argv[1]);: `4 w. {5 [' q8 | return; }8 O4 J, d2 q8 [2 n' H/ ^! D6 t D while(fgets(buffer,SIZE,fp1)!=NULL)* N+ {9 x6 |. I3 f printf("%s\n",buffer);# u R: R$ `6 X Z fclose(fp1); } 3.5 往文件中写格式化数据! @' g2 R4 Y, I) i 3.5.1 函数原型5 A5 X0 K' X' U. W3 a. C* ? int fprintf(FILE *fp,char *format,arg_list) 3.5.2 功能说明 将变量表列(arg_list)中的数据,按照 format 指出的格式,写入由 fp 指定的文件。fprintf() 函数与 printf() 函数的功能相同,只是 printf() 函数是将数据写入屏幕文件(stdout)。 3.5.3 参数说明fp:这是个文件指针,指出要将数据写入的文件。 //程序代码如下:) x' a- X6 R$ ]+ b6 c. g // file display program.0 i% X6 N- o; K/ [3 l m #include <stdio.h>; U9 Z+ M( x1 f+ j( c+ Z/ v void main(), ^% B* C9 F8 H$ M. k1 |, Z {& x; {2 F3 a2 P( ~5 h( I8 h7 R char name[10];% X- N8 g/ S7 c% x. [/ E3 v' ` int nAge,nClass; long number;* F* @! d$ u6 V% W+ p/ q* [ FILE *fp; if((fp=fopen("student.txt","w"))==NULL)% F4 A4 M- d0 }+ r8 Z5 Q! [6 P { printf("The file %s can not be opened.\n","student.txt"); return;. L+ P0 n+ i+ d/ y; S6 D6 ]" d } fscanf(stdin,"%s %d %d %ld",name,&nClass,&nAge,&number); fprintf(fp,"%s %5d %4d %8ld",name,nClass,nAge,number); fclose(fp);, I- [2 g* |, ?! u% W% J if((fp=fopen("student.txt","r"))==NULL) { printf("The file %s can not be opened.\n","student.txt");6 @' F y% N: S8 B return;) v. s9 b2 D; U+ U! A1 Q+ B } fscanf(fp,"%s %d %d %ld",name,&nClass,&nAge,&number); printf("name nClass nAge number\n");/ m" `0 s5 i" V0 f$ o) z fprintf(stdout,"%-10s%-8d%-6d%-8ld\n",name,nClass,nAge,number);! w1 S. M* I, O1 M) D fclose(fp); }) g A- {# E! |: a2 f' q% W* [) A6 ^ 3.6 以二进制形式读取文件中的数据' I7 @, O2 c( n. P# |$ F, b2 k3 t 3.6.1 函数原型 int fread(void *buffer,unsigned sife,unsigned count,FILE *fp) 3.6.2 功能说明 从由 fp 指定的文件中,按二进制形式将 sife*count 个数据读到由 buffer 指出的数据区中。 3.6.3 参数说明buffer:这是一个 void 型指针,指出要将读入数据存放在其中的存储区首地址。 sife:指出一个数据块的字节数,即一个数据块的大小尺寸。9 Q, S4 R( _& n/ F; d# P 正常返回:实际读取数据块的个数,即 count。 3.7.1 函数原型 int fwrite(void *buffer,unsigned sife,unsigned count,FILE *fp)5 ]: M8 V+ q; ~4 S$ M1 y3 u) K 3.7.2 功能说明 按二进制形式,将由 buffer 指定的数据缓冲区内的 sife*count 个数据写入由 fp 指定的文件中去。 3.7.3 参数说明buffer:这是一个 void型指针,指出要将其中数据输出到文件的缓冲区首地址。 正常返回:实际输出数据块的个数,即 count。 p, x; ~ v1 B2 C: g. { #define SIZE 40 `- D) G8 B- u struct worker { int number; char name[20]; int age; }; void main() { struct worker wk;' R1 ^6 a2 V: S( b# u int n; FILE *in,*out; if((in=fopen("file1.txt","rb"))==NULL) { printf("The file %s can not be opened.\n","file1.txt"); return;; z* x2 V1 V- H4 s! w4 t! A } if((out=fopen("file2.txt","wb"))==NULL) {7 P3 n( v, x; i( [/ B: N printf("The file %s can not be opened.\n","file2.txt");6 g: }0 J! k7 | return; } while(fread(&wk,sizeof(struct worker),1,in)==1) fwrite(&wk,sizeof(struct worker),1,out); fclose(in); fclose(out); }& c. B0 C ]+ A" C 3.8 以二进制形式读取一个整数 3.8.1 函数原型6 X& `% ]$ J) c y! M int getw(FILE *fp) 3.8.2 功能说明 从由 fp 指定的文件中,以二进制形式读取一个整数。 3.8.3 参数说明fp:是文件指针。 3.8.4 返回值正常返回:所读取整数的值。 void main(int argc,char *argv[]) { int i,sum=0; FILE *fp; if(argc!=2), u1 A5 ]8 U: a' G { ]$ O- u9 X, J3 Y2 H printf("Command error,Usage: readfile filename\n");0 K Y5 h. T, V: s6 }4 |* j exit(1);9 ?7 l$ L3 A; w5 j7 e8 _3 J4 J } k. ~2 [+ _" g/ L( D; Z" v if(!(fp=fopen(argv[1],"rb")))4 I5 v: ~1 E1 |+ x0 x {) S) B& q/ g! F& U printf("The file %s can not be opened.\n",argv[1]);0 r' U0 U/ u8 l5 U; f exit(1); }: v N! A2 S! k/ R- i u+ T+ m for(i=1;i<=10;i++) sum+=getw(fp); printf("The sum is %d\n",sum);+ k1 t/ B+ t% m: A fclose(fp); } 3.9 以二进制形式存贮一个整数 3.9.1 函数原型! o0 G* z6 ?+ f) F, [, n int putw(int n,FILE *fp) 3.9.2 功能说明 以二进制形式把由变量 n 指出的整数值存放到由 fp 指定的文件中。 3.9.3 参数说明n:要存入文件的整数。2 M, o- [: H7 ^5 X1 I 正常返回:所输出的整数值。 void main(int argc,char *argv[]) { int i; FILE *fp; if(argc!=2)9 D1 I4 ]( K0 t( Z8 ] {! ?. {2 x5 T4 d; @" a% e printf("Command error,Usage: writefile filename\n");6 i9 k( d( Z! h2 b. \& ?. B return;' q9 ]) ?& c) X% Z' v v } + d0 K/ u& Q0 I1 a2 D8 s1 D6 p if(!(fp=fopen(argv[1],"wb")))" K6 {; N( Z1 D/ u3 `5 @* `1 f {: z" r& x3 R) C+ p0 j P printf("The file %s can not be opened.\n",argv[1]); return;- r# s; E6 C4 A }+ ]/ G5 L& v1 L* r P! z, v8 p0 e for(i=1;i<=10;i++) printf("%d\n", putw(i,fp)); fclose(fp); } 4 文件状态检查 4.1 文件结束 4.1.1 函数原型6 P) H1 C( p8 y" J int feof(FILE *fp)3 s" _; i2 g9 d$ |0 ] 4.1.2 功能说明 该函数用来判断文件是否结束。 4.1.3 参数说明fp:文件指针。 4.1.4 返回值0:假值,表示文件未结束。+ H% e# u$ O! R/ q void main(int argc,char *argv[])4 p, x3 {2 z. y. x1 Y/ B { FILE *in,*out;4 _% k& [6 N J; H$ j char ch;' H6 [7 U# [- L4 i, k, P if(argc!=3)5 y2 f5 v6 E: u: r q {' y4 k* ?' {4 `5 P/ P3 }- k printf("Usage: copyfile filename1 filename2\n");7 `$ T$ J# \% o, N6 ~1 U return;! A6 ?, V4 @- \: L, V. A; ^ } if((in=fopen(argv[1],"rb"))==NULL) { printf("The file %s can not be opened.\n",argv[1]);' _% }5 L- P6 v& _8 T return;) b3 I: k h- ?( K$ ` }! |$ R$ L( ]: C if((out=fopen(argv[2],"wb"))==NULL). l" v0 c7 E4 [* y7 O/ b { u. O: ~+ R3 g2 ^- X1 n3 Q& P printf("The file %s can not be opened.\n",argv[2]);: l) M. a3 e% `; t# d return;1 W4 r- y1 j' Q" V" b F, _ } while(!feof(in))/ j" |: a. M- c; }5 G+ V { ch=fgetc(in);' O2 h' z8 S# x' a9 h if(ferror(in)) {; q8 n% E3 W, |- F2 d- a printf("read error!\n"); clearerr(in); } else4 U$ S$ s* g& e$ ]2 k {) {6 M% y; C9 U/ F" V+ V, T3 w fputc(ch,out); if(ferror(out)) {; r" `) k7 @5 O. z3 R, U( ?/ a printf("write error!\n");& d8 _9 H- M# T+ D: C clearerr(out);+ G7 Q, ?' b% x9 r- a } } } fclose(in);* e- ], \) A7 c% s- z: L, j+ J fclose(out); }" B/ ~8 v. {. \2 d9 e 4.2 文件读/写出错& T/ l' I5 s+ k! B" R6 \: r 4.2.1 函数原型/ r! t% u4 M& Y/ p6 Z" ^ int ferror(FILE *fp) K3 v" r+ j3 p! p" [$ `& O 4.2.2 功能说明 检查由 fp 指定的文件在读写时是否出错。 4.2.3 参数说明fp:文件指针。 4.2.4 返回值0:假值,表示无错误。 4.3.1 函数原型 void clearerr(FILE *fp) 4.3.2 功能说明 清除由 fp 指定文件的错误标志。 4.3.3 参数说明fp:文件指针。 4.3.4 返回值无。 #include <stdio.h>void main(int argc,char *argv[]) {% v) a! h4 a1 [1 N2 h t FILE *in,*out; char ch;8 j. P) @1 t6 h% _1 d8 H if(argc!=3)6 r/ W4 E1 V j# _6 n) i { printf("Usage: copyfile filename1 filename2\n");) r' y: [: E1 b; J. M8 q return;) e* D/ f! B& M' f9 Y! ^3 r! @: t) a } if((in=fopen(argv[1],"rb"))==NULL) {6 v& P4 X/ M9 ]! N' Y printf("The file %s can not be opened.\n",argv[1]); return; }/ \3 @5 F0 H' n. Y% L if((out=fopen(argv[2],"wb"))==NULL)% `' }; Q+ m: X1 r' K {) W9 ?, E2 F2 u; u: `/ k% I printf("The file %s can not be opened.\n",argv[2]);0 I6 |8 _7 S/ B5 j+ C" V7 \ return;" d% L$ s2 T" x* ] } while(!feof(in))6 I/ R" w i. \2 ~! b { ch=fgetc(in); if(ferror(in)) { printf("read error!\n"); clearerr(in); } else: y6 f8 n+ |5 J5 q. |6 R {4 `: W- x# h2 o% @ fputc(ch,out);9 a1 Q# O! B7 a0 @" e4 A& j* z! G if(ferror(out)). h. F7 j& o5 H. d j6 m {- n: u/ P7 ~1 y4 X! Y printf("write error!\n");) C7 s8 A/ n2 Y0 n3 O clearerr(out);7 j* U$ U& a" a } }$ v; \' W$ n+ M4 B9 z } fclose(in);2 c. R. L8 c1 W5 l7 i' A6 D& u& S. y fclose(out);/ D. ^' `# ~0 B# B9 ? } 4.4 了解文件指针的当前位置 4.4.1 函数原型6 {' X$ v1 g7 I5 M1 C long ftell(FILE *fp) 4.4.2 功能说明 取得由 fp 指定文件的当前读/写位置,该位置值用相对于文件开头的位移量来表示。 4.4.3参数说明fp:文件指针。 4.4.4 返回值正常返回:位移量(这是个长整数)。 5.1 反绕 5.1.1 函数原型 void rewind(FILE *fp)9 ?/ I' A, Y8 a: |7 g7 S: C- G& T 5.1.2 功能说明 使由文件指针 fp 指定的文件的位置指针重新指向文件的开头位置。 5.1.3 参数说明fp:文件指针。 5.1.4返回值无。 #include <stdio.h>void main() k# \9 ^4 g. W$ P* n; l, \ { FILE *in,*out;1 j$ Z$ Q1 f5 d x. o; O7 N in=fopen("filename1","r"); out=fopen("filename2","w");$ q- a3 F/ k- s9 p( e while(!feof(in)) fputc(fgetc(in),out); rewind(out); \0 u) @8 X) M p) o. O" y* j while(!feof(in)) putchar(fgetc(in));, O# y' ?+ |( D( L+ G fclose(in);" X4 M3 T/ }: U) W/ X% P) l# L fclose(out); }7 R% M7 c) q( |2 ~' y 5.2 随机定位- \, z; C: z0 x1 K# { 5.2.1 函数原型5 ?3 |; L& l0 H) ?, S2 e V, [ int fseek(FILE *fp,long offset,int base) 5.2.2 功能说明 使文件指针 fp 移到基于 base 的相对位置 offset 处。 5.2.3 参数说明fp:文件指针。) b2 \* D7 F$ b9 v& F 正常返回:当前指针位置。 #include <string.h> struct std_type! B( B, n' X2 G. U8 Q: N {! X: F: D3 I5 Z, I int num; char name[20]; int age;; c( F, x( x. Z `; [ char class; }stud; int cstufile()1 ?0 |- ^. p, X4 N! V! V7 i { int i; FILE *fp;$ c# {6 W! V3 \; Z# e4 B if((fp=fopen("stufile","wb"))==NULL) { printf("The file can't be opened for write.\n"); return 0;3 t9 q$ b1 B/ t: i } for(i=1;i<=100;i++)8 L0 |# v) V' q% U {1 Q7 u, U8 x* n0 X% S stud.num=i; strcpy(stud.name,"aaaa");2 G$ @0 D( \; `, n: P2 o$ j, k stud.age=17;! C* n# R! F$ R# D+ b; H stud.class='8';( O6 D h! D: T# U1 k7 a) V1 T fwrite(&stud,sizeof(struct std_type),1,fp); }, y. U7 M$ c9 N, t( a" n J- a0 ?4 c fclose(fp); return 1;6 n8 L) P/ n1 A" p& e }% W6 ^* l) L2 q0 `4 r) P/ n' Z void main() {$ t8 M, B4 ^% ]( }) }$ i& O int n; FILE *fp; if(cstufile()==0) return; if((fp=fopen("stufile","rb"))==NULL)7 m( f4 d6 Z: B {4 A; ^ f5 Q. v P; Q printf("The file can not be opened.\n"); return; } for(n=0;n<100;n+=2)! f' m8 C' b! w* o7 w+ X* D& Y {9 e; Y# H" i: J/ k0 v7 h2 f& N fseek(fp,n*sizeof(struct std_type),SEEK_SET);) e1 w' `; N( H fread(&stud,sizeof(struct std_type),1,fp);7 Z# S! t4 x" y% |; d$ ?3 {1 g: n printf("%10d%20s%10d%4c\n",stud.num,stud.name,stud.age,stud.class); }6 e- q1 b$ r- o U/ Y$ @+ `* G fclose(fp);; u6 W# f; J% ~. S! ?3 R& Y6 C D } 5.3 关于exit()函数7 `( P/ M) d, s [7 N 5.3.1 函数原型 void exit(int status)6 U% \9 S2 w+ N 5.3.2 功能说明 exit() 函数使程序立即终止执行,同时将缓冲区中剩余的数据输出并关闭所有已经打开的文件。 5.3.3 参数说明status:为 0 值表示程序正常终止,为非 0 值表示一个定义错误。 5.3.4 返回值无。 5.4 关于feof()函数5.4.1 函数原型: T+ Q& n! a. u S+ S int feof(FILE *fp)2 s6 v) c8 P5 d8 D# y 5.4.2 功能说明 在文本文件(ASCII 文件)中可以用值为 -1 的符号常量 EOF 来作为文件的结束符。但是在二进制文件中 -1 往往可能是一个有意义的数据,因此不能用它 来作为文件的结束标志。为了能有效判别文件是否结束,ANSI C 提供了标准函数 feof(),用来识别文件是否结束。 5.4.3 参数说明fp:文件指针。 5.4.4 返回值返回为非 0 值:已到文件尾。/ P: b3 {/ g7 h; W |
微信公众号
手机版