一、单项选择题
1.C语言中,文件由( A )。
A.字符(字节)序列组成 B.记录组成 C.数据行组成 D.数据块组成
2.若文件型指针fp中指向某文件的末尾,则函数feof(fp)的返回值是( C )。 A.0 B.-1 C.非零值 D.NULL 3. 下列语句将输出( B ) #include printf(“%d %d %d”, NULL,’\\0’,EOF); A. 0 0 1 B. 0 0 –1 C. NULL EOF D. 1 0 EOF 4.下列语句中,将fp定义为文件型指针的是( B )。 A.FILE fp; B.FILE *fp; C.file fp; D.file *fp; 5. 定义FILE *fp; 则文件指针fp指向的是( D )。 A. 文件在磁盘上的读写位置 B. 文件在缓冲区上的读写位置 C. 整个磁盘文件 D. 文件类型结构体 6. 缓冲文件系统的缓冲区位于( C )。 A. 磁盘缓冲区中 B. 磁盘文件中 C. 内存数据区中 D. 程序中 7. 以“只读”方式打开文本文件a:\\aa.dat,下列语句中哪一个是正确的( D )。 A、fp=fopen(”a:\\aa.dat”,”ab”); B、fp=fopen(”a:\\aa.dat”,”a”); C、fp=fopen(”a:\\aa.dat”,”wb”); D、fp=fopen(”a:\\aa.dat”,”r”); 8. 以“追加”方式打开文本文件a:\\aa.dat,下列语句中哪一个是正确的( B )。 A、fp=fopen(”a:\\aa.dat”,”ab”); B、fp=fopen(”a:\\aa.dat”,”a”); C、fp=fopen(”a:\\aa.dat”,”r+”); D、fp=fopen(”a:\\aa.dat”,”w”); 9. 如果二进制文件a.dat已存在,现要求写入全新的数据,应以什么方式打开( A )。 A. “w” B. “wb” C. “w+” D. “wb+” 10. 为读写建立一个新的文本文件a:\\aa.dat,下列语句中哪一个是正确的( B )。 A、fp=fopen(”a:\\aa.dat”,”ab”); B、fp=fopen(”a:\\aa.dat”,”w+”); C、fp=fopen(”a:\\aa.dat”,”wb”); D、fp=fopen(”a:\\aa.dat”,”rb+”); 11.以读写方式打开一个已有的二进制文件filel,并且定义FILE *fp,下面fopen函数正确 的调用方式是( B )。 A.fp=fopen (“file1”, ”r”) B.fp=fopen (“file1”, ”rb+”) C.fp=fopen (“file1”, ”rb”) D.fp=fopen (“file1”, ”wb+”) 12.标准库函数fputs (p1,p2)的功能是( C )。 A.从p1指向的文件中读一个字符串存入p2指向的内存 B.从p2指向的文件中读一个字符串存入p1指向的内存 C.从p1指向的内存中读一个字符串写到p2指向的文件中 D.从p2指向的内存中读一个字符串写到p1指向的文件中 81 二、填充题 1.C语言中调用 fopen 函数打开文件,调用 fclose 函数关闭文件。 2. fopen函数的返回值是 包含文件缓冲区信息的FILE结构体地址 。 3. 文件操作的三大特征是 文件保存在外存中 , 文件中数据有序 , 数据数量可以不定 。 4.feof函数可用于 文本 文件和 二进制 文件,它用来判断即将读入的是 否为 文件结束标志 ,若是,函数值为 非零 。 5.若ch为字符变量,fp为文本文件指针,从fp所指文件中读入一个字符时,可用的二 种不同的输入语句是 ch=fgetc(fp) 和 fscanf(fp,”%c”, &ch) 。把一个字符输 出到fp所指文件中的二种不同的输出语句是 fputc(ch,fp) 和fprintf(fp,”%c”, ch) 。 6.sp=fgets (str, n, fp) ; 函数调用语句从 fp 指向的文件输入 n-1 个字符,并把它们放到 字符数组str中,sp得到 str 的地址。而 fputs 函数的作用是向指定的文件输出 一个字符串,输出成功函数返回值为 0 ,fprintf函数输出成功函数返回值为 实际输出的字符数 。 7.“FILE *fp”的作用是定义了一个 文件型指针变量 ,其中的“FILE”是在 stdio.h 头文件中定义的。 8.在对文件进行操作的过程中,若要求文件指针的位置回到文件的开头,应当调用的函数 是rewind ( ) 函数。 9.下面的程序用来统计文件中字符的个数,请填空。 #include long num=0 ; if (fp=fopen (“fname. dat”, ”r”) = =NULL) { printf (“Can’ t open file!\\n”); exit (0) ; } while (!feof (fp)) { fgetc (fp) ; num++ ; } printf (“num=%d\\n”, num) ; fclose (fp) ; } 10.下面程序完成从磁盘文件stu..dat中读取N个学生的姓名、学号、成绩后在屏幕上显示 输出。请将程序补充完整。 #include { char name[20]; int no; int score; } stud[N]; void main () { FILE *fp; int i ; if ((fp=fopen (“stu.dat”, ”rb”))==NULL) { printf (“Can not open file!\\n”); exit (0); } fread (stud, sizeof (struct student), N, fp) ; for (i=0; i printf (“name : %s NO: %d score : %d\\n”, stud[i]. name, stud[i]. no, stud[i]. score); fclose (fp) } 11. 开辟一个存储n个int数据的内存区、并将内存区首地址送入p(指向int类型的指 针变量)的语句为 p=(int )malloc(sizeof(int)*n); 。 12.释放由fp所指向的内存区的语句为 free(fp); 。 13.fp为文件位置指针,将fp移到离当前位置25个字节处的语句为 fseek(fp,25L ,1); 。 14. 输入若干个学生的姓名、学号、数学、英语、计算机成绩到文件中student.dat。 #include { FILE *fp; char name[8],numb[8]; int m,e,c,n,i ; scanf(\"%d\ fp=fopen(“student.dat”,”w”); for(i=1;i<=n;i++) { scanf(\"%s%s%d%d%d\ fprintf(fp,\"%s %s %d %d %d\\n\ } fclose(fp); ; } 15. 下列程序将文件a.dat、b.dat按原顺序(文件中每行一个数,按从小到大排列) 合并到文件c.dat中。 #include { FILE *f1,*f2,*f3; int x,y; if((f1=fopen(\"a.dat\ { printf (“Can not open file!\\n”); exit (0); } if((f2=fopen(\"b.dat\ { printf (“Can not open file!\\n”); exit (1); } if(( f3=fopen(“c.dat”,”w”) )==NULL) { printf (“Can not open file!\\n”); exit (2); } fscanf(f1,\"%d\ fscanf(f2,\"%d\ while(!feof(f1)&&!feof(f2)) if(x fprintf(f3,\"%d\\n\ } if(feof(f1)) { fprintf(f3,”%d\\n”, y ); while(!feof(f2)) { fscanf(f2,\"%d\ fprintf(f3,”%d\\n”,y); } } else { fprintf(f3, “%d\\n”, x ); 83 while(!feof(f1)) { fscanf(f1,”%d”,&x); ; fprintf(f3,\"%d\\n\ } } fclose(f1); fclose(f2); fclose(f3); } 三、程序分析题 1.读程序,指出程序所完成的功能。 #include { int chl,ch2; while ((chl=getchar())!=EOF) if (ch1>=’a’&& chl<=’z’) { ch2=chl-32;putchar(ch2); } else putchar(chl): } 该程序的功能是:从键盘读入一个字符,如果是小写字母,则变成大写输出到屏幕上, 否则原样输出。当打入ctr1-z(即EOF)时,输入结束。 2.读程序,写功能。 #include void main (int argc, char *argv[ ]) { FILE *f1, *f2; char ch; if ( argc<3) { printf (“Parameter missing!\\n”); exit(0); } if (((f1=fopen (argv[1], ”r”)) ==NULL || (f2=fopen (argv[2], ”w”))==NULL) { printf (“Can not open file!\\n”); exit(0); } while (!feof (f1)) fputc (fgetc (f1), f2); fclose (f1) ; fclose (f2) ; } 该程序的功能是:在用命令行的形式运行本程序时,必须在程序名后加二个参数, 这二个参数分别表示磁盘上的二个文件名。程序运行后,能把第一个文件的内容拷贝 到第二个文件。如果命令行缺少参数或文件打不开,程序终止运行并显示出错情况。 3.读程序,写功能。 #include int n=0; char ch; if ((fp=fopen(“fname.txt”,”r”))==NULL) { prlntf(“Can not open file!\n”);exit(0);} while( !feof(fp)) { ch=fgetc(fp) ;if(ch= =’ ’) n++;} printf(“b=%d\n”,n); fclose(fp) ; 84 } 该程序的功能是:统计文本文件fname.txt中的空格字符数。 4.读程序,写功能。 #include“stdio.h” void main( ) { FILE *f1,*f2; int k; if ((f1=fopen(“c:\c\\pl.c”,”r”))= =NULL) { printf(“Can not open file!\\n”); exit(0); } if ((f2=fopen(“a:\\pl.c”,”w”))= =NULL) { printf(“Can not open file!\n”); exit(0); } for(k=1;k<=1000 ;k++) { if( !feof(f1)) break ; fputc( fgetc(f1), f2); } fclose(f1); fclose(f2); } 该程序的功能是:把C盘根目录下的tc目录中的文件p1.c复制到A盘的根目录下, 取同样的文件名p1.c。如果C盘中的p1.c文件超过1000字节,则最多复制1000字节。 5.假定在当前盘当前目录下有2个文本文件,其名称和内容如下: 文件名 a1.txt a2.txt 内容 121314# 252627# 写出下列程序运行后的输出。 #include “stdio.h” void main ( ) { FILE *fp; void fc (FILE *fp1); if ((fp=fopen (“a1.txt”,”r”))==NULL) { printf (“Can not open file!\\n”) ; exit (1); } else { fc(fp); fclose (fp); } if ((fp=fopen (“a2.txt”,”r”))==NULL) { printf (“Can not open file!\\n”) ; exit (1) ; } else { fc (fp); fclose (fp); } } void fc (FILE *fp1) { char c; while (( c=fgetc (fp1)) !=’#’) putchar ( c ) ; } 该程序先打开a1.txt文件,然后调用函数fc( ),把文件中#号字符以前的内容在屏幕 上现示。再打开a2.txt文件,然后调用函数fc( ),把文件中#号字符以前的内容在屏 85 幕上接着现示。因此程序运行后输入 121314252627 6. 写出以下程序运行结果。 #include void main( ) 输出结果: all=abcdefghijklmnop { FILE *fp; int i; seek1 ch=a char s1[80],s[]=\"abcdefghijklmnop\"; seek2 ch=l if((fp=fopen(\"alf.dat\ seek3 ch3=m { printf (“Can not open file!\\n”) ; exit (1) ; } i=sizeof(s); fwrite(s,i,1,fp); rewind(fp); fread(s1,i,l,fp); printf(\"all=%s\\n\ fseek(fp,0,0); printf(\"seek1 ch=%c\\n\ fseek(fp,10,1); printf(\"seek2 ch=%c\\n\ fseek(fp,1,1); printf(\"seek3 ch=%c\\n\ fclose(fp); } 四、程序设计题. 1.编一个程序,从键盘输入 200个字符,存入名为“ f1.txt”的磁盘文件中。 #include “stdio.h” void main ( ) { FILE *fp; int i ; if (( fp=fopen (“f1.txt”, ”w”))==NULL) { printf (“Can not open file!\\n”) ; exit (1); } for ( i=1; i<=200; i++) fputc (getchar ( ), fp) ; fclose (fp) ; } 2.设计一个复制文本文件的程序,源文件名和目标文件名随程序执行时输入。 #include void main (int argc, char *argv[ ]) { FILE *f1, *f2; char ch; if (argc<3) { printf (“Error! Useage: program_name source_file_name object_file_name\\n”); exit (0); } if ((f1=fopen (argv[1], ”r”))==NULL) { printf (“Can not open source file!\\n”) ; exit(0); } if ((f2=fopen (argv[2], ”w”))==NULL) { printf (“Can not open object file!\\n”) ; exit(1); } while (!feof (f1)) fputc (fgect (f1), f2); fclose (f1); fclose (f2); } 3.从上一题中建立的名为“ f1.txt”的磁盘文件中读取120个字符,并显示在屏幕上。 86 #include “stdio.h” void main ( ) { FILE *fp; int i ; if (( fp=fopen (“f1.txt”, ”r”))==NULL) { printf (“Can not open file!\\n”) ; exit (0); } for ( i=1; i<=120; i++) putchar (fgetc ( fp)) ; fclose (fp) ; } 4.编一个程序,将磁盘中当前目录下名为“cow1.txt”的文本文件复制在同—目录下, 文件名改为“ccw2.txt”。 #include “stdio.h” void main ( ) { FILE *f1, *f2; if (( f1=fopen (“ccw1.txt”, ”r”))==NULL) { printf (“Can not open file!\\n”) ; exit (0); } if (( f2=fopen (“ccw2.txt”, ”w”))==NULL) { printf (“Can not open file!\\n”) ; exit (1); } while (!feof (f1)) fputc (fgetc (f1), f2); } 5. 把文本文件d1.dat复制到文本文件d2.dat中,要求仅复制d1.dat中的英文字符。 #include { FILE *fpd1,*fpd2; char ch; if((fpd1=fopen(\"d1.dat\ { printf (“Can not open file!\\n”) ; exit (0); } if(( fpd2=fopen(\"d2.dat\ { printf (“Can not open file!\\n”) ; exit (1); } while(fscanf(fpd1,\"%c\ if(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z') fprintf(fpd2,\"%c\ fclose(fpd1); fclose(fpd2); } 6. 编程,把文本文件d1.dat复制到d2.dat(其中空格字符不复制)。 #include { FILE *fpd1,*fpd2; char ch; if((fpd1=fopen(\"d1.dat\ { printf (“Can not open file!\\n”) ; exit (0); } if(( fpd2=fopen(\"d2.dat\ { printf (“Can not open file!\\n”) ; exit (1); } while(fscanf(fpd1,\"%c\ if(ch!=' ') fprintf(fpd2,\"%c\ fclose(fpd1); fclose(fpd2); } 87 7. 编程,把文本文件d1.dat复制到d2.dat(其中大写英文字母要转换为小写字母)。 #include { FILE *fpd1,*fpd2; char ch; if((fpd1=fopen(\"d1.dat\ { printf (“Can not open file!\\n”) ; exit (0); } if((fpd2=fopen(\"d2.dat\ { printf (“Can not open file!\\n”) ; exit (1); } while(fscanf(fpd1,\"%c\ if(ch>='A'&&ch<='Z') ch=ch+32; fprintf(fpd2,\"%c\ } fclose(fpd1); fclose(fpd2); } 8. 把文本文件d1.dat复制到文本文件d2.dat中,要求仅复制d1.dat中除英文字符和 数字以外的其它内容。 #include { FILE *fpd1,*fpd2; char ch; if((fpd1=fopen(\"d1.dat\ { printf (“Can not open file!\\n”) ; exit (0); } if((fpd2=fopen(\"d2.dat\ { printf (“Can not open file!\\n”) ; exit (1); } while(fscanf(fpd1,\"%c\ if(!(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z'||ch>='0'&&ch<='9')) fprintf(fpd2,\"%c\ fclose(fpd1); fclose(fpd2); } 9. 求出1至100之间的素数(只能被1和自身整除的数)并顺序写入文件su.dat。 #include { FILE *fp; int i,j,k=2; if((fp=fopen(\"su.dat\ { printf (“Can not open file!\\n”) ; exit (0); } fprintf(fp,\"%4d%4d\ for(i=5;i<100;i=i+2) { for(j=3;j<=sqrt(i);j=j+2) if(i%j==0) break; if(j>sqrt(i)) { fprintf(fp,\"%4d\ if(k%10==0) fprintf(fp,\"\\n\"); } } fclose(fp); } 10.磁盘文件a1和a2,各自存放一个已按字母顺序排好的字符串,编程合并二个文件 到a3文件中,合并后仍保持字母顺序。 88 #include { FILE *fp1,*fp2,*fp3; int i,j,k; char c1,c2; if((fp1=fopen(\"a1\ { printf (“Can not open file!\\n”) ; exit (0); } if(( fp2=fopen(\"a2\ { printf (“Can not open file!\\n”) ; exit (1); } if((fp3=fopen(\"a3\ { printf (“Can not open file!\\n”) ; exit (2); } c1=fgetc(fp1); c2=fgetc(fp2); /* 首先从文件a1、a2中各读入一个字符分, do { 别送入变量c1、c2,作循环比较 */ if(c1 // 若a1先读到文件尾,则将c2写入a3,再将a2中其它字符读入后写入a3;..... if(feof(fp1)) do { fputc(c2,fp3); c2=fgetc(fp2); } while(!feof(fp2)) ; else do { fputc(c1,fp3); c1=fgetc(fp1); } while(!feof(fp1)) ; fclose(fp1); fclose(fp2); fclose(fp3); } 11.顺序文件 c.dat 每个记录包含学号(8位字符)和成绩(三位整数)两个数据项。 从文件读入学生成绩,将大于或等于60分的学生成绩再形成一个新的文件 score60.dat保存在A盘上,并显示出学生总人数、平均成绩和及格人数。 #include { FILE *fp1,*fp2; char s[9]; int x,sn=0, cs=0, jn=0; fp1=fopen(\"c.dat\ fscanf(fp1,\"%s%d\ do { sn++; cs+=x; if(x>=60) { jn++; fprintf(fp2,\"%s %d\\n\ fscanf(fp1,\"%s%d\ } while(!feof(fp1)); printf(\"总人数:%d 平均成绩:%d 及格人数:%d\\n\ fclose(fp1); fclose(fp2); } 12.编程序对名为“CCW.TXT”的磁盘文件中“@”之前的所有字符加密,加密的方法 是每个字节的内容减10。 设计思路:从文件 CCW.TXT中读一个字符(字节),减10后写到一临时文件 TMPCCW.TXT,直到读到字符‘@’。然后两文件反绕到头,从文件TMPCCW.TXT 89 中读一个字符,写回到文件CCW.TXT,把原字符复盖。因此两文件以r+和w+的形式 打开。 #include “stdio.h” void main( ) { FILE *fp1, *fp2; char ch; if (( fp1=fopen (″CCW.TXT″, ″r+″))==NULL) { printf (″Can not open file!\\n″) ; exit (0); } if (( fp2=fopen (″TMPCCW.TXT″, ″w+″))==NULL) { printf (″Can not open file!\\n″) ; exit (1); } while((ch=fgetc(fp1))!=‟@‟) { fputc(ch-10, fp2); } rewind(fp1); rewind(fp2); do { ch=fgetc(fp2); if(!feof(fp2)) fputc(ch, fp1); } while(!feof(fp2)) ; fclose(fp1); fclose(fp2) ; } 13.编程序对上一题中名为“CCW.TXT”的磁盘文件中“@”字符之前的所有字符解密 并显示。 #include “stdio.h” void main( ) { FILE *fp1; char ch; if (( fp1=fopen (″CCW.TXT″, ″r″))==NULL) { printf (″Can not open file!\\n″) ; exit (0); } while((ch=fgetc(fp1))!=‟@‟) putchar (ch+10) ; fclose (fp1); } 14.输入100个学生的信息(含学号、姓名、年龄、7科成绩、总分),统计所有学生的 总分,然后存入磁盘二进制数据文件student.dat中。然后再读取该文件,寻找总分 最高的学生并输出该学生的所有信息。 方法一、 定义一个结构变量,每输入一个学生信息,即存人磁盘二进制数据文件student.dat中。 建立存有100个学生信息的文件后,设计一个总分为 0的 hs学生,再打开读取该文件, 每读入一个学生信息,即与hs比较,寻找总分最高的学生在hs,并输出该学生的所有 信息。 #include { struct student { int sno ; char sn[20] ; int sage ; float sg[7] ; 90 float sum ; } s, t, hs ; FILE *fp ; int i, j ; if ((fp=fopen (″student.dat″, ″wb″))==NULL) { printf (″Can not open file!\\n″) ; exit (0); } printf (″以学号 姓名 年龄 成绩1 成绩2 成绩3 成绩4 成绩5 成绩6 成绩7的形式输入:\\n″); for (i=0; i<100; i++) { printf (″学生%d:\\n″,i+1); scanf (″%d″,&s.sno) ; scanf (″%s″,s.sn) ; scanf (″%d″,&s.sage) ; s. sum=0 ; for (j=0; j<7; j++) { scanf (″%f″,&s.sg[j]) ; s.sum=s.sum+s.sg[j] ; } fwrite (&s, sizeof (struct student), 1, fp); } fclose (fp) ; if (( fp=fopen(″student.dat″, ″rb″))==NULL) { printf (″Can not open file!\\n″) ; exit (0); } hs.sum=0; while (!feof (fp) { fread (&t, sizeof (struct student), 1, fp); if (t.sum>hs.sum) { hs.sno=t.sno ; strcpy (hs.sn, t.sn) ; // 必须用strcpy( )函数复制 hs.sage=t.sage; for (j=0; j<7; j++) hs.sg[j]=t.sg[j]; hs.sum=t.sum ; } } printf (″总分最高的学生是 ″); printf(″学号:%d 姓名:%s 年龄:%d\\n″, hs.sno, hs.sn, hs.sage); printf(″成绩1 成绩2 成绩3 成绩4 成绩5 成绩6 成绩7总分\\n″); for(j=0; j<7; j++) printf(″%5.1f″, hs.sg[j]) ; printf(″%5.1f\\n″, hs.sum); } 方法二、 定义一个100个元素的结构数组s,输入100个学生的信息后,一次存入磁盘二进制 数据文件student.dat中。再打开该文件,读入100个学生信息到100个元素的结构数 组t中。数组t中,用结构指针sp和hsp寻找总分最高的学生,使hsp指向它, 91 并输出该学生的所有信息。 void main( ) { struct student { int sno ; char sn[20] ; int sage ; float sg[7] ; float sum ; } s[100], t[100], *sp, *hsp; FILE *fp ; int i, j ; float hsum=0; if ((fp=fopen (″student.dat″, ″wb″))==NULL) { printf (″Can not open file!\\n″) ; exit (0); } printf (″以学号\\n 姓名\\n 年龄\\n成绩1 成绩2 成绩3 成绩4 成绩5 成绩6 成绩7的形式输入:\\n″); for (i=0; sp=s; i<100; i++, sp++) { printf (″学生%d:\\n″,i+1); scanf (″%d″,&sp->sno) ; scanf (″%s″,sp->sn) ; scanf (″%d″,&sp->sage) ; sp->sum=0 ; for (j=0; j<7; j++) { scanf (″%f″,&sp->sg[j]) ; sp->sum=sp->sum+sp->sg[j] ; } } fwrite (s, sizeof (struct student), 100, fp); fclose (fp) ; if (( fp=fopen(″student.dat″, ″rb″))==NULL) { printf (″Can not open file!\\n″) ; exit (0); } fread (t, sizeof (struct student), 100, fp); for (i=0; hsp=t; sp=t i<100; i++, sp++) { if (sp->sum>hsum) { hsnm=sp->sum; hsp=sp } } printf (″总分最高的学生是 ″); printf(″学号:%d 姓名:%s 年龄:%d\\n″, hsp->sno, hsp->sn, hsp->sage); printf(″成绩1 成绩2 成绩3 成绩4 成绩5 成绩6 成绩7总分\\n″); for(j=0; j<7; j++) printf(″%5.1f″,hsp->sb[j]); fclose(fp); } 92 15.编一个程序,统计文本文件中的单词个数。被统计文件的文件名可由键盘任意输入。 #include vode main ( ) { char fname [20]; FILE *fp; int num=0, word=0; char ch; printf (″输入要统计的文件名:″); scanf(″%s″,fname); if((fp=fopen(fname, ″r″))==NULL) { printf(″打不开文件 %s\\n″,fname); exit(0); } while(!feof(fp)) { ch=fgetc(fp); if(ch==‟ ‟) word=0; else if(word==0) { word=1; num++; } } printf(″%s 文件中有%d个单词\\n″,fname,num); fclose(fp); } 16.有两个磁盘文件“f1.txt”和”f2.txt”各放一行字母,今要求把这两个文件中的字母合并, 按字母顺序排列后,输出到新文件“f3.txt”中去。 #include void main ( ) { FILE *fp1, *fp2, *fp3; char a[160], ch; int i=0, j, n; if ((fp1=fopen (″f1.txt″, ″r″))==NULL) { printf(″打不开文件f1.txt!\\n″); exit(0); } if ((fp2=fopen (″f2.txt″, ″r″))==NULL) { printf(″打不开文件f2.txt!\\n″); exit(0); } if ((fp3=fopen (″f3.txt″, ″w″))==NULL) { printf(″打不开文件f3.txt!\\n″); exit(0); } while (!feof(fp1)) { ch=fgetc (fp1) if (!feof (fp1)) a[i++]=ch; /* 读文件f1.txt放到数组a中 */ } while (!feof (fp2)) { h=fgetc (fp2) if (!feof (fp2)) a[i++]=ch; /* 读文件f2.txt接着放到数组a中 */ } a[i]=‟\\0‟ ; n=i ; 93 for (i=0; i while (a[i]!=‟\\0‟) { fputc (a[i], fp3) ; i++; } /* 把数组a逐个字母写入文件f3.txt */ fclose (fp1); fclose (fp2); fclose (fp3); } 17. 二进制文件a.dat中包含若干整数,从键盘输入一个整数,请在文件中找出该整数 的下一个数并输出。若找不到,输出“Not found!” #include scanf(“%d”,&x); if((fp=fopen(“a.dat”,”rb”))==NULL) { printf (″Can not open file!\\n″) ; exit (0); } while(!feof(fp)) { fscanf(fp,”%d”,&y); // 从文件中读一个数 if(x==y) if(!feof(fp)) { fscanf(fp,”%d”,&y); // 若相等,则读下一个数 printf(“next %d is %d\\n”,x,y); flag=0; // 给出找到标志 break; // 已找到,深闺循环结束 } } if(flag) printf(“Not found!”); fclose(fp); } 18. 编一个命令行参数的程序prog.c,若执行prog filename原样输出filename文件的内 容;若执行prog –l filename ,大写输出filename文件的内容;若执行prog –u filename, 则小写输出filename文件的内容;其它情况出错。 #include void main(int argc,char *argv[ ] ) { char *fname , ch; int flag=0; FILE *fp; if(argc<2 || argc>3) { printf(“error!”); exit(0); } if(argc==2) fname=argv[1]; else { if(strcmp(argv[1],”-l”)==0) flag=2; else if(strcmp(argv[1],”-u”)==0) flag=1; else { printf(“error!”); exit(0); } fname=argv[2]; } 94 if((fp=fopen(fname,”r”))==NULL) { printf (″Can not open file!\\n″) ; exit (0); } while(!feof(fp)) { ch=fgetc(fp); switch(flag) { case 1: if(ch>=‟a‟ && ch<=‟z‟ ) ch=ch –(„a‟-„A‟); break; case 2: if(ch>=‟A‟&& ch<=‟Z‟) ch=ch+(„a‟-„A‟); break; default: break; } putchar(ch); } fclose(fp); } 19. 文本文件a.txt中包含若干整数,请把文件中所有数据相加,并把累加和写入文件 最后,试编写相应程序。 #include { int x, sum=0; FILE *fp; if((fp=fopen(“a.dat”,”r+”))==NULL) { printf (″Can not open file!\\n″) ; exit (0); } while(!feof(fp)) { fscanf(fp,”%d”,&x); sum+=x; } fprintf(fp,”%d”,sum); fclose(fp); } 20. 二进制文件dim.dat中包含二维数组数据,已知二维数组每行有5个整型数,行数 不定,请编写一个程序,找出平均值最大的行,输出行号和平均值。 #include float x, max, sum; int ln, n, maxl; max=0.0; ln=1; if((fp=fopen(“dim.dat”,”rb”))==NULL) { printf (″Can not open file!\\n″) ; exit (0); } while(!feof(fp)) { sum=0.0; for(n=0;n<5;n++) { fscanf(fp,”%f”,&x); sum+=x; } 95 } if(sum>max) { max=sum; maxl=ln; } ln++; } printf(“%d %f”,maxl,max/5.0); 96 因篇幅问题不能全部显示,请点此查看更多更全内容