第十一章文件一、单项选择题1、在进行文件操作时,写文件的一般含义是()。A)将计算机内存中的信息存入磁盘B)将磁盘中的信息存入计算机内存C)将计算机CPU中的信息存入磁盘D)将磁盘中的信息存入计算机CPU2、C语言中标准输入文件stdin是指()。A)键盘B)显示器C)鼠标D)硬盘3、系统的标准输出文件stdout是指()。A)键盘B)显示器C)鼠标D)硬盘4、在高级语言中对文件操作的一般步骤是()。A)打开文件-操作文件-关闭文件B)操作文件-修改文件-关闭文件C)读写文件-打开文件-关闭文件D)读文件-写文件-关闭文件5、要打开一个已存在的非空文件“file”用于修改,正确的语句是()。A)fp=fopen(file,r);B)fp=fopen(file,a+);C)fp=fopen(file,w);D)fp=fopen(file,r+);6、以下可作为函数fopen中第一个参数的正确格式是()。A)c:user\text.txtB)c:\user\text.txtC)c:\user\text.txtD)c:\\user\\text.txt7、若执行fopen函数时发生错误,则函数的返回值时()。A)地址值B)0C)1D)EOF8、为了显示一个文本文件的内容,在打开文件时,文件的打开方式应当时()。A)r+B)w+C)wb+D)ab+9、若要fopen函数打开一个新的二进制文件,该文件要既能读也能写,则文件方式字符串应该是()。A)ab+B)wb+C)rb+D)ab10、在C语言中,从计算机内存中将数据写入文件中,称为()。A)输入B)输出C)修改D)删除11、C语言可以处理的文件类型是()。A)文本文件和数据文件B)文本文件和二进制文件C)数据文件和二进制文件D)以上答案都不对12、下列关于文件的结论中正确的是()。A)对文件操作必须先关闭文件B)对文件操作必须先打开文件C)对文件操作顺序没有统一规定D)以上三种答案都不完全13、当顺利执行了文件关闭操作时,fclose函数的返回值是()。A)-1B)TRUEC)0D)114、使用fgetc函数,则打开文件的方式必须是()。A)只读B)追加C)读或读/写D)答案B和C正确15、若调用fputc函数输出字符成功,七返回值是()。A)EOFB)1C)0D)输出的字符16、利用fseek函数可以()。A)改变文件的位置指针B)实现文件的顺序读写C)实现文件的随机读写D)以上答案均正确17、执行fopen函数时,ferror函数的初值是()。A)TRUEB)-1C)1D)0二、填空题1、在C程序中,数据可以以________和________两种形式的代码存放。(ASCII二进制)2、若已定义pf是一个FILE类型的文件指针,已知待输出的文本文件的路径和文件名是A:;则要使佩服指向文件的打开语句是_______________________________。(pf=fopen(A:\zh04\data\txfile.dat,r);)3、若fp已经指向一个指定的文件,则将字符变量ch中的字符输出到高文件中,可以用语句有________、________、________和________。4、feof函数可以用于________和________文件,它用来判断即将读入的是否为_______,若是,函数返回值为________。(ASCII二进制文件结束标志非0)三、编程题1、某班有N个学生,每个学生有5门课的成绩。从键盘输入每个学生的学号、姓名和各门课的成绩,然后计算出每门课全班的平均成绩及每个学生的平均成绩,并将所有数据存放再磁盘文件ABC中。文件结构有编程者自己设计。解:#includestdio.hmain(){FILE*fp;intnum,mark[5],i,sum,n=0;floatav,t[5]={0};charname[20];if((fp=fopen(abd.txt,w))==NULL)/*打开数据文件*/{printf(Cannotopenfile\n);exit(0);}printf(inputnum:);scanf(%d,&num);/*输入第一各学生学号*/while(num0){printf(Inputneme:);scanf(%s,name);/*输入姓名*/printf(Inputmarksfor5course:\n);sum=0;for(i=0;i5;i++)/*输入5门课成绩*/{scanf(%d,&mark[i]);sum=sum+mark[i];t[i]=t[i]+mark[i];/*累计各课成绩总分*/}av=sum/5,n++;/*计算每个学生平均分,统计学生人数*/fprintf(fp,%5d,%s,num,name);/*学号、姓名写入文件*/for(i=0;i5;i++)/*某个学生各科成绩和平均分写入文件*/fprintf(fp,,%d,mark[i]);fprintf(fp,,%6.2f\n,av);printf(Inputnum:);scanf(%d,&num);/*输入下一个学生学号*/}fprintf(fp,\n);for(i=0;i5;i++)/*输出全班各科平均分*/fprintf(fp,%7.2f,t[i]/n);fclose(fp);}/*p360_1.c*/#defineN6#includestdio.hmain(){inti,j,n,sc[N][5];FILE*fp;charxm[10];for(i=0;iN;i++){scanf(%d%s,&n,xm);for(j=0;j5;j++)scanf(%d,&sc[i][j]);}fp=fopen(abc.txt,w);for(i=0;iN;i++)fprintf(fp,%5d%s%4d%4d%4d%4d%4d\n,n,xm,sc[i][0],sc[i][1],sc[i][2],sc[i][3],sc[i][4]);fclose(fp);}/*p360_1a.c*/#includestdio.hmain(){FILE*fp;intnum,mark[5],i,sum,n=0;floatav,t[5]={0};charname[20];if((fp=fopen(abd.txt,w))==NULL){printf(Cannotopenfile\n);exit(0);}printf(inputnum:);scanf(%d,&num);while(num0){printf(Inputneme:);scanf(%s,name);printf(Inputmarksfor5course:\n);sum=0;for(i=0;i5;i++){scanf(%d,&mark[i]);sum=sum+mark[i];t[i]=t[i]+mark[i];}av=sum/5,n++;fprintf(fp,%5d,%s,num,name);for(i=0;i5;i++)fprintf(fp,,%d,mark[i]);fprintf(fp,,%6.2f\n,av);printf(Inputnum:);scanf(%d,&num);}fprintf(fp,\n);for(i=0;i5;i++)fprintf(fp,%7.2f,t[i]/n);fclose(fp);}2.从键盘输入一文本文件,将该文本写入磁盘文件disk.txt中,统计磁盘文件中的字母、数字、空白和其它字符的个数,要求:1)将统计结果显示到屏幕上;2)将输入的文件输出到打印机上;3)将统计结果写入磁盘文件total.txt中。参考程序:(未考虑输出到打印机)/*P360_2.c*/#defineM5#defineN200#includestdio.hmain(){chars[M][N];inti,j,dd,cd,sp,other;FILE*fp1,*fp2;dd=cd=sp=other=0;fp1=fopen(disk.txt,w);for(i=0;iM;i++){gets(s[i]);fputs(s[i],fp1);for(j=0;jstrlen(s[i]);j++)if(s[i][j]='0'&&s[i][j]='9')dd++;elseif(s[i][j]='A'&&s[i][j]='Z')cd++;elseif(s[i][j]='a'&&s[i][j]='z')cd++;elseif(s[i][j]==32)sp++;elseother++;}fp2=fopen(total.txt,w);fprintf(fp2,cd=%d,dd=%d,sp=%d,other=%d\n,cd,dd,sp,other);printf(cd=%d,dd=%d,sp=%d,other=%d\n,cd,dd,sp,other);fclose(fp1);fclose(fp2);}3.已有一个存放数千种仓库物质信息的文件CK,每个信息元素含两个内容:物质编号kno和库存量KNOM。请编程通过检查全库物质的库存量,建立一个新的文件XK,它包含所有库存量大于100的物质的编号和库存量。参考程序:/*p360_3.c*/#includestdio.hmain(){intn,m;FILE*fp1,*fp2;fp1=fopen(ck.txt,r);fp2=fopen(xk.txt,w);while(feof(fp1)==0){fscanf(fp1,%d,%d,&n,&m);printf(%4d%4d\n,n,m);if(m100)fprintf(fp2,%d,%d\n,n,m);}fclose(fp1);fclose(fp2);}4、已知一个学生的数据库包含如下信息:学号(6为整数)、姓名(3个字符)、年龄(2为整数)和住址(10个字符),请编写程序由键盘输入10个学生的数据,将其输出到磁盘文件中;然后再从该文件中读取这些数据并显示在屏幕上。/*p361_4.c*/#includestdio.h#defineN5structstud{charnum[6];charname[4];intage;charaddr[10];};main(){intn=0;structstudst[N];FILE*fp;fp=fopen(xssj.txt,w+);printf(num[6],name[3],age,addr[10]:\n);while(nN){scanf(%s%s%d%s,st[n].num,st[n].name,&st[n].age,st[n].addr);fwrite(&st[n],sizeof(st[n]),1,fp);n++;}rewind(fp);n=0;while(nN){fread(&st[n],sizeof(st[n]),1,fp);printf(%s,%s,%d,%s\n,st[n].num,st[n].name,st[n].age,st[n].addr);n++;}fclose(fp);}5、已知有两个有序的整数文件F和G,请编一程序,将它们合并为一个新的有序的文件。/*p361_5.c*/#includestdio.hmain(){FILE*p1,*p2;inta[10],b[10],c[20],k,n1,n2,i,j;p1=fopen(f.txt,r);p2=fopen(g.txt,r);n1=0;fscanf(p1,%d,,&k);while(feof(p1)==0){a[n1++]=k;fscanf(p1,%d,,&k);}n2=0;fscanf(p2,%d,,&k);while(feof(p2)==0){b[n2++]=k;fscanf(p2,%d,,&k);}fclose(p1),fclose(p2);k=0;i=0;j=0;while(in1)c[k++]=a[i++];while(jn2)c[k++]=b[j++];for(i=0;in1+n2-1;i++)for(j=