第八章 文 件.doc_第1页
第八章 文 件.doc_第2页
第八章 文 件.doc_第3页
第八章 文 件.doc_第4页
第八章 文 件.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第八章 文 件一、单项选择题1C语言中,文件由( A )。 A字符(字节)序列组成 B记录组成 C数据行组成 D数据块组成2若文件型指针fp中指向某文件的末尾,则函数feof(fp)的返回值是( C )。 A0B-1C非零值DNULL3. 下列语句将输出( B ) #include printf(“%d %d %d”, NULL,0,EOF); A. 0 0 1 B. 0 0 1 C. NULL EOF D. 1 0 EOF4下列语句中,将fp定义为文件型指针的是( B )。 AFILE fp;BFILE *fp;Cfile fp;Dfile *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 )。 Afp=fopen (“file1”, ”r”) Bfp=fopen (“file1”, ”rb+”) Cfp=fopen (“file1”, ”rb”)Dfp=fopen (“file1”, ”wb+”)12标准库函数fputs (p1,p2)的功能是( C )。 A从p1指向的文件中读一个字符串存入p2指向的内存 B从p2指向的文件中读一个字符串存入p1指向的内存 C从p1指向的内存中读一个字符串写到p2指向的文件中 D从p2指向的内存中读一个字符串写到p1指向的文件中二、填充题1C语言中调用 fopen 函数打开文件,调用 fclose 函数关闭文件。2. fopen函数的返回值是 包含文件缓冲区信息的FILE结构体地址 。3. 文件操作的三大特征是 文件保存在外存中 , 文件中数据有序 , 数据数量可以不定 。4feof函数可用于 文本 文件和 二进制 文件,它用来判断即将读入的是 否为 文件结束标志 ,若是,函数值为 非零 。5若ch为字符变量,fp为文本文件指针,从fp所指文件中读入一个字符时,可用的二 种不同的输入语句是 ch=fgetc(fp) 和 fscanf(fp,”%c”, &ch) 。把一个字符输 出到fp所指文件中的二种不同的输出语句是 fputc(ch,fp) 和fprintf(fp,”%c”, ch) 。6sp=fgets (str, n, fp) ; 函数调用语句从 fp 指向的文件输入 n-1 个字符,并把它们放到 字符数组str中,sp得到 str 的地址。而 fputs 函数的作用是向指定的文件输出 一个字符串,输出成功函数返回值为 0 ,fprintf函数输出成功函数返回值为实际输出的字符数 。7“FILE *fp”的作用是定义了一个 文件型指针变量 ,其中的“FILE”是在 stdio.h 头文件中定义的。8在对文件进行操作的过程中,若要求文件指针的位置回到文件的开头,应当调用的函数是rewind ( ) 函数。9下面的程序用来统计文件中字符的个数,请填空。 #include void main( ) FILE *fp ; 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=%dn”, num) ; fclose (fp) ;10下面程序完成从磁盘文件stu.dat中读取N个学生的姓名、学号、成绩后在屏幕上显示 输出。请将程序补充完整。#include #define N 100struct student char name20; int no; int score; studN;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; iN; i+) printf (“name : %s NO: %d score : %dn”, studi. name, studi. no, studi. score); fclose (fp)11. 开辟一个存储n个int数据的内存区、并将内存区首地址送入p(指向int类型的指 针变量)的语句为 p=(int )malloc(sizeof(int)*n); 。12释放由fp所指向的内存区的语句为 free(fp); 。13fp为文件位置指针,将fp移到离当前位置25个字节处的语句为 fseek(fp,25L ,1); 。14. 输入若干个学生的姓名、学号、数学、英语、计算机成绩到文件中student.dat。 #include void main() FILE *fp; char name8,numb8; int m,e,c,n,i ; scanf(%d,&n); fp=fopen(“student.dat”,”w”); for(i=1;i=n;i+) scanf(%s%s%d%d%d,name,numb,&m,&e,&c); fprintf(fp,%s %s %d %d %dn,name,numb,m,e,c); fclose(fp); ; 15. 下列程序将文件a.dat、b.dat按原顺序(文件中每行一个数,按从小到大排列) 合并到文件c.dat中。 #include void main() FILE *f1,*f2,*f3; int x,y;if(f1=fopen(a.dat,r)=NULL) printf (“Can not open file!n”); exit (0); if(f2=fopen(b.dat,r)=NULL) 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,&x); fscanf(f2,%d,&y); while(!feof(f1)&!feof(f2) if(xy) fprintf(f3,%dn,x); fscanf(f1,%d,&x); else fprintf(f3,%dn,y); fscanf(f2,%d,&y); if(feof(f1) fprintf(f3,”%dn”, y ); while(!feof(f2) fscanf(f2,%d,&y); fprintf(f3,”%dn”,y); else fprintf(f3, “%dn”, x ); while(!feof(f1) fscanf(f1,”%d”,&x); ; fprintf(f3,%dn,x); fclose(f1); fclose(f2); fclose(f3); 三、程序分析题1读程序,指出程序所完成的功能。 include void main( ) int chl,ch2; while (chlgetchar())!EOF) if (ch1a& chlz) ch2chl-32;putchar(ch2); else putchar(chl): 该程序的功能是:从键盘读入一个字符,如果是小写字母,则变成大写输出到屏幕上, 否则原样输出。当打入ctr1-z(即EOF)时,输入结束。2读程序,写功能。 #include void main (int argc, char *argv ) FILE *f1, *f2; char ch; if ( argc3) printf (“Parameter missing!n”); exit(0); if (f1=fopen (argv1, ”r”) =NULL | (f2=fopen (argv2, ”w”)=NULL) printf (“Can not open file!n”); exit(0); while (!feof (f1) fputc (fgetc (f1), f2); fclose (f1) ; fclose (f2) ;该程序的功能是:在用命令行的形式运行本程序时,必须在程序名后加二个参数,这二个参数分别表示磁盘上的二个文件名。程序运行后,能把第一个文件的内容拷贝到第二个文件。如果命令行缺少参数或文件打不开,程序终止运行并显示出错情况。3读程序,写功能。 include void main( ) FILE *fp: int n0; char ch; if (fpfopen(“fnametxt”,”r”))=NULL) prlntf(“Can not open file!n”);exit(0); while( !feof(fp) chfgetc(fp) ;if(ch= = ) n+; printf(“bdn”,n); fclose(fp) ; 该程序的功能是:统计文本文件fname.txt中的空格字符数。4读程序,写功能。 include“stdio.h” void main( ) FILE *f1,*f2; int k; if (f1fopen(“c:tcpl.c”,”r”)= =NULL) printf(“Can not open file!n”); exit(0); if (f2fopen(“a:pl.c”,”w”)= =NULL) printf(“Can not open file!n”); exit(0); for(k1;k1000 ;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( ),把文件中#号字符以前的内容在屏幕上接着现示。因此程序运行后输入 1213142526276. 写出以下程序运行结果。 #include void main( ) 输出结果: all=abcdefghijklmnop FILE *fp; int i; seek1 ch=a char s180,s=abcdefghijklmnop; seek2 ch=l if(fp=fopen(alf.dat,wb+)=NULL) 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=%sn,s1); fseek(fp,0,0); printf(seek1 ch=%cn,fgetc(fp); fseek(fp,10,1); printf(seek2 ch=%cn,fgetc(fp); fseek(fp,1,1); printf(seek3 ch=%cn,fgetc(fp); 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 (argc3) printf (“Error! Useage: program_name source_file_name object_file_namen”); exit (0); if (f1=fopen (argv1, ”r”)=NULL) printf (“Can not open source file!n”) ; exit(0); if (f2=fopen (argv2, ”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个字符,并显示在屏幕上。 #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编一个程序,将磁盘中当前目录下名为“cow1txt”的文本文件复制在同目录下,文件名改为“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 void main( ) FILE *fpd1,*fpd2; char ch; if(fpd1=fopen(d1.dat,r)=NULL) printf (“Can not open file!n”) ; exit (0); if( fpd2=fopen(d2.dat,w); printf (“Can not open file!n”) ; exit (1); while(fscanf(fpd1,%c,&ch)!=EOF) if(ch=A&ch=a&ch=z) fprintf(fpd2,%c,ch); fclose(fpd1); fclose(fpd2); 6. 编程,把文本文件d1.dat复制到d2.dat(其中空格字符不复制)。 #include void main() FILE *fpd1,*fpd2; char ch; if(fpd1=fopen(d1.dat,r)=NULL) printf (“Can not open file!n”) ; exit (0); if( fpd2=fopen(d2.dat,w)=NULL) printf (“Can not open file!n”) ; exit (1); while(fscanf(fpd1,%c,&ch)!=EOF) if(ch!= ) fprintf(fpd2,%c,ch); fclose(fpd1); fclose(fpd2); 7. 编程,把文本文件d1.dat复制到d2.dat(其中大写英文字母要转换为小写字母)。 #include void main() FILE *fpd1,*fpd2; char ch; if(fpd1=fopen(d1.dat,r)=NULL) printf (“Can not open file!n”) ; exit (0); if(fpd2=fopen(d2.dat,w)=NULL) printf (“Can not open file!n”) ; exit (1); while(fscanf(fpd1,%c,&ch)!=EOF) if(ch=A&ch=Z) ch=ch+32; fprintf(fpd2,%c,ch); fclose(fpd1); fclose(fpd2); 8. 把文本文件d1.dat复制到文本文件d2.dat中,要求仅复制d1.dat中除英文字符和 数字以外的其它内容。 #include void main() FILE *fpd1,*fpd2; char ch; if(fpd1=fopen(d1.dat,r)=NULL) printf (“Can not open file!n”) ; exit (0); if(fpd2=fopen(d2.dat,w)=NULL) printf (“Can not open file!n”) ; exit (1); while(fscanf(fpd1,%c,&ch)!=EOF) if(!(ch=A&ch=a&ch=0&ch=9) fprintf(fpd2,%c,ch); fclose(fpd1); fclose(fpd2); 9. 求出1至100之间的素数(只能被1和自身整除的数)并顺序写入文件su.dat。 #include #include void main() FILE *fp; int i,j,k=2; if(fp=fopen(su.dat,w)=NULL) printf (“Can not open file!n”) ; exit (0); fprintf(fp,%4d%4d,2,3); for(i=5;i100;i=i+2) for(j=3;jsqrt(i) fprintf(fp,%4d,i); k+; if(k%10=0) fprintf(fp,n); fclose(fp);10磁盘文件a1和a2,各自存放一个已按字母顺序排好的字符串,编程合并二个文件到a3文件中,合并后仍保持字母顺序。 #include #include void main() FILE *fp1,*fp2,*fp3; int i,j,k; char c1,c2; if(fp1=fopen(a1,r)=NULL) printf (“Can not open file!n”) ; exit (0); if( fp2=fopen(a2,r)=NULL) printf (“Can not open file!n”) ; exit (1); if(fp3=fopen(a3,w)=NULL) printf (“Can not open file!n”) ; exit (2); c1=fgetc(fp1); c2=fgetc(fp2); /* 首先从文件a1、a2中各读入一个字符分, do 别送入变量c1、c2,作循环比较 */ if(c1c2) fputc(c1,fp3);c1=fgetc(fp1); else fputc(c2,fp3); c2=fgetc(fp2); while(!feof(fp1)&!feof(fp2); /* 直到读到文件尾标志为止 */ / 若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 #include void main() FILE *fp1,*fp2; char s9; int x,sn=0, cs=0, jn=0; fp1=fopen(c.dat,r); fp2=fopen(a:score60.dat,w); fscanf(fp1,%s%d,s,&x); do sn+; cs+=x; if(x=60) jn+; fprintf(fp2,%s %dn,s,x); fscanf(fp1,%s%d,s,&x); while(!feof(fp1); printf(总人数:%d 平均成绩:%d 及格人数:%dn,sn, cs/sn, jn); fclose(fp1); fclose(fp2); 12编程序对名为“CCW.TXT”的磁盘文件中“”之前的所有字符加密,加密的方法 是每个字节的内容减10。 设计思路:从文件 CCW.TXT中读一个字符(字节),减10后写到一临时文件 TMPCCWTXT,直到读到字符。然后两文件反绕到头,从文件TMPCCWTXT 中读一个字符,写回到文件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 include tinclude void main( ) struct student int sno ; char sn20 ; int sage ; float sg7 ; 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; i100; i+) printf (学生%d:n,i+1); scanf (%d,&s.sno) ; scanf (%s,s.sn) ; scanf (%d,&s.sage) ; s. sum=0 ; for (j=0; jhs.sum) hs.sno=t.sno ; strcpy (hs.sn, t.sn) ; / 必须用strcpy( )函数复制 hs.sage=t.sage; for (j=0; j7; j+) hs.sgj=t.sgj; hs.sum=t.sum ; printf (总分最高的学生是 ); printf(学号:%d 姓名:%s 年龄:%dn, hs.sno, hs.sn, hs.sage); printf(成绩1 成绩2 成绩3 成绩4 成绩5 成绩6 成绩7总分n); for(j=0; j7; j+) printf(%5.1f, hs.sgj) ; printf(%5.1fn, hs.sum);方法二、定义一个100个元素的结构数组s,输入100个学生的信息后,一次存入磁盘二进制数据文件student.dat中。再打开该文件,读入100个学生信息到100个元素的结构数组t中。数组t中,用结构指针sp和hsp寻找总分最高的学生,使hsp指向它,并输出该学生的所有信息。void main( ) struct student int sno ; char sn20 ; int sage ; float sg7 ; float sum ; s100, t100, *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; isno) ; scanf (%s,sp-sn) ; scanf (%d,&sp-sage) ; sp-sum=0 ; for (j=0; jsgj) ; sp-sum=sp-sum+sp-sgj ; 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 isumhsum) hsnm=sp-sum; hsp=sp printf (总分最高的学生是 ); printf(学号:%d 姓名:%s 年龄:%dn, hsp-sno, hsp-sn, hsp-sage); printf(成绩1 成绩2 成绩3 成绩4 成绩5 成绩6 成绩7总分n);for(j=0; jsbj); fclose(fp); 15编一个程序,统计文本文

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论