–233–第第1010章章文件文件习题一、单选题。(在以下每一题的四个选项中,请选择一个正确的答案。)【题10.1】B【题10.2】B【题10.3】A【题10.4】C【题10.5】B【题10.6】A【题10.7】B【题10.8】C【题10.9】C【题10.10】A二、判断题。(判断下列各叙述的正确性,分别在()内标记√或×。)【题10.11】×【题10.12】×【题10.13】×【题10.14】√【题10.15】√【题10.16】√【题10.17】√【题10.18】√【题10.19】√【题10.20】×三、填空题。(请在下面各叙述的空白处填入合适的内容。)【题10.21】键盘C语言程序设计教程–234–【题10.22】0【题10.23】使位置指针重新返回文件的开头【题10.24】从文件fp中读取长度不超过n-1的字符串存入指针str指向的内存【题10.25】从键盘中读取字符【题10.26】标准输入/输出【题10.27】文件出错【题10.28】将位置指针从当前位置向前移动100个字节【题10.29】打开【题10.30】取文件指针的当前位置四、程序填空题。(请在下面程序空白处填入合适的语句。)【题10.31】!feof(fp)【题10.32】bi.dat,w【题10.33】wb;&j;fp五、编程题。(对下面的问题编写程序并上机验证。)【题10.34】在文本文件file1.txt中有若干个句子,现在要求把它们按每行一个句子的格式输出到文本文件file2.txt中。#includestdio.h#includestdlib.h#includeconio.hmain(){FILE*fp1,*fp2;charch;if((fp1=fopen(file1.txt,r))==NULL){printf(\nCannotopenfile!\n);getch();exit(1);}if((fp2=fopen(file2.txt,w))==NULL){printf(\nCannotopenfile!\n);getch();exit(1);}第10章文件操作–235–while((ch=fgetc(fp1))!=EOF){fputc(ch,fp2);if(ch=='.')fputc('\n',fp2);}fclose(fp1);fclose(fp2);}【题10.35】统计文本文件file.txt中所包含的字母、数字和空白字符的个数。#includestdio.h#includestdlib.h#includeconio.hmain(){FILE*fp;charch;intx1=0,x2=0,x3=0;if((fp=fopen(file.txt,r))==NULL){printf(\nCannotopenfile!\n);getch();exit(1);}while((ch=fgetc(fp))!=EOF){if((ch='A'&&ch='Z')||(ch='a'&&ch='z'))x1++;if(ch='1'&&ch='9')x2++;if(ch==''||ch=='\t'||ch=='\n')x3++;}fclose(fp);printf(File.txtcontains%dletters,%dnumbersand%dblanks!\n,x1,x2,x3);}【题10.36】将磁盘文件f1.txt和f2.txt中的字符按从小到大的顺序输出到磁盘文件f3.txt中。#includestdio.h#includestdlib.h#includeconio.hmain(){FILE*fp;C语言程序设计教程–236–charch[200],c;inti=0,j,n;if((fp=fopen(f1.txt,r))==NULL){printf(\nCannotopenfile!\n);getch();exit(1);}while((c=fgetc(fp))!=EOF)ch[i++]=c;fclose(fp);if((fp=fopen(f2.txt,r))==NULL){printf(\nCannotopenfile!\n);getch();exit(1);}while((c=fgetc(fp))!=EOF)ch[i++]=c;fclose(fp);n=i;for(i=1;in;i++)for(j=0;jn-i;j++)if(ch[j]ch[j+1]){c=ch[j];ch[j]=ch[j+1];ch[j+1]=c;}if((fp=fopen(f3.txt,w))==NULL){printf(\nCannotopenfile!\n);getch();exit(1);}for(i=0;in;i++)fputc(ch[i],fp);fclose(fp);}第10章文件操作–237–【题10.37】统计磁盘文件file.txt中的单词个数。分析:如果在一个“空白字符”(包括空格、换行和制表符)或标点符号(常用的有英文句号、逗号、问号和感叹号)后出现一个非空白字符,就说明出现了一个单词。设两个变量count和white,count用来记录单词的个数,初值为0;white值为0,代表当前位置上是非空白字符,即使下一个读入的是非空白字符,也只能说明它属于同一个单词内的字符;white值为非0,代表当前位置上是空白字符或标点符号,如果下一个字符为非空白字符就表示“新单词开始”。white的初值置为1,以便能正确统计第1个单词(认为第1个非空白字符在空白字符或标点符号之后),循环读入字符,若读入的不是空白字符或标点符号,而white为非0值,就使count加1,white置为0。#includestdio.h#includestdlib.h#includeconio.hmain(){FILE*fp;charch;intwhite=1,count=0;if((fp=fopen(file.txt,r))==NULL){printf(\nCannotopenfile!\n);getch();exit(1);}while((ch=fgetc(fp))!=EOF)switch(ch){case'':case'\t':case'\n':case'.':case',':case'?':case'!':white++;break;default:if(white){white=0;count++;}}fclose(fp);C语言程序设计教程–238–printf(File.txtcontains%dwords!\n,count);}【题10.38】有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件C中。#includestdio.hmain(){FILE*fp;inti,j,n,ni;charc[160],t,ch;if((fp=fopen(A,r))==NULL){printf(fileAcannotbeopened\n);exit(0);}printf(\nAcontentsare:\n);for(i=0;(ch=fgetc(fp))!=EOF;i++){c[i]=ch;putchar(c[i]);}fclose(fp);ni=i;if((fp=fopen(B,r))==NULL){printf(fileBcannotbeopened\n);exit(0);}printf(\nBcontentsare:\n);for(i=0;_____________;i++){c[i]=ch;putchar(c[i]);}fclose(fp);n=i;for(i=0;in;i++)for(j=i+1;jn;j++)if(c[i]c[j]){t=c[i];c[i]=c[j];c[j]=t;}printf(\nCfileis:\n);fp=fopen(C,w);for(i=0;in;i++){putc(_________,fp);putchar(c[i]);第10章文件操作–239–}fclose(fp);}【题10.39】编写程序,将一个文本文件的内容连接到另一个文本文件的末尾。#includestdio.h#includestdlib.hvoidmain(intargc,char*argv[]){FILE*fp1,*fp2;chars[80];if((fp1=fopen(argv[1],a))==NULL)abort();if((fp2=fopen(argv[2],r))==NULL)abort();while((fgets(s,80,fp2))!=NULL)fputs(s,fp1);fputc(0x1a,fp1);printf(ok!);fclose(fp1);fclose(fp2);}【题10.40】设计disp程序,此程序的用法如下:disp文件1,文件2,…,文件n它将依次显示上述所有文件的内容,相邻文件之间空两行。#includestdio.h#includestdlib.hvoidmain(intargc,char*argv[]){FILE*fp;inti;charch;for(i=1;iargc;i++){if((fp=fopen(argv[i],r))==NULL)abort();while((ch=fgetc(fp))!=EOF)fputc(ch,stdout);fclose(fp);printf(\n);C语言程序设计教程–240–}}【题10.41】编写程序,将磁盘中当前目录下名为“file1.txt”的文本文件复制在同一目录下,文件名改为“file2.txt”。#includestdio.h#includestdlib.hvoidmain(intargc,char*argv[]){FILE*in,*out;charch;if(argc3)abort();if((in=fopen(file1.txt,r))==NULL){printf(Noopenthisfile!);abort();}if((out=fopen(file2.txt,w))==NULL){printf(Noopenthisfile!);abort();}while((ch=fgetc(in))!=EOF)fputc(ch,out);fputc(0x1a,out);puts(Onefilecopied!);fclose(in);fclose(out);}【题10.42】将10名职工的数据从键盘输入,然后送到磁盘文件worker.rec中保存。设职工数据包括职工号、姓名、工资。再从磁盘读入这些数据,并依次显示在屏幕上(要求用fread()函数和fwrite()函数),试编写程序。#includestdio.h#includestdlib.h#defineN10voidmain(){structworkrd{charid[5];charname[10];intsalary;};第10章文件操作–241–structworkrds[N];inti;FILE*fp;for(i=0;iN;i++){printf(Inputrecord:);scanf(%s%s%d,s[i].id,s[i].name,&s[i].salary);printf(\n);}if((fp=fopen(worker.dat,wb))==NULL){printf(Filenotopen.);abort();}for(i=0;iN;i++)fwrite(&s[i],sizeof(structworkrd),1,fp);fclose(fp);if((fp=fopen(worker.rec,rb))==NULL){printf(Filenotopen.);abort();}for(i=0;iN;i++){fread(&s[i],sizeof(structworkrd),1,fp);printf(%s%s