C语言程序设计应用练习与思考题目及答案.doc_第1页
C语言程序设计应用练习与思考题目及答案.doc_第2页
C语言程序设计应用练习与思考题目及答案.doc_第3页
C语言程序设计应用练习与思考题目及答案.doc_第4页
C语言程序设计应用练习与思考题目及答案.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

第9章 数据永久性存储练习与思考 91.1 填空题假设在程序中有这样一些语句:#include FILE *fp1, *fp2;char ch, str100;int nNumRead=-1;fp1 = fopen(test1.txt, r);fp2 = fopen(test2.txt, w);并且,假设两个文件都被成功打开,请完成下面代码的空格部分:a) ch = fgetc(_fp1_);/* 读取文件test1.txt中字符 */b) fprintf(_fp2_, %cn, _ch_); /* 把ch写入文件test2.txt中 */c) fclose(_fp2_); /* 关闭文件test2.txt */d) while(!_feof(fp1)_)fscanf(fp1, _”%c”_, _&ch_); /* 依次读入文件test1.txt中所有字符 */e) nNumRead = fread(_str_,_sizeof(char)_, 1, fp1);f) fseek(fp1, _0L_, _SEEK_END/2_); /* 将文件内部读写位置指针定位到文件尾*/1.2 选择题(1) 在C语言中对文件操作的一般步骤是( A )。(A) 打开文件操作文件关闭文件(B) 操作文件修改文件关闭文件(C) 读写文件打开文件关闭文件(D) 读文件写文件关闭文件(2) fscanf()函数的正确调用形式为( B )。(A) fscanf(fp, 格式字符串, 读入变量列表);(B) fscanf(文件指针, 格式字符串, 读入变量列表);(C) fscanf(格式字符串, 文件指针, 读入变量列表);(D) fscanf(格式字符串, 读入变量列表, fp);(3) 已知函数的调用形式:fread(buffer, size, count, fp); 其中buffer代表的是( C )。(A) 一个整型变量,代表要读入的数据项总数(B) 一个文件指针,指向要读入的文件(C) 一个指针,指向要存放读入数据的地址(D) 一个存储区,存放要读入的数据项(4) 以下可作为函数fopen中的第一参数的是( D )。(A) c:usertext.txt (B) c:usertext.txt(C) c:usertext.txt (D) c:usertext.txt(5) 若执行fopen函数发生错误,则函数的返回值是( B )。(A) 地址值 (B) NULL (C) 1 (D) EOF(6) 函数调用语句:fseek(fp, -10L, 2);的功能是( B )。(A) 将文件内部读写位置指针移到离当前位置10个字节处(B) 将文件内部读写位置指针移到文件尾前面10个字节处(C) 将文件内部读写位置指针移到文件头后面10个字节处(D) 将文件内部读写位置指针移到文件尾后面10个字节处(7) 函数fputc()调用成功时其返回值为( D )。(A) EOF(B) 1(C) 0(D) 所写入的字符(8) 当打开的文件被成功关闭后,函数fclose()返回( B )。(A) -1(B) 0(C) TRUE(D) 1(9) 当文件内部读写位置指针指向文件尾时,函数feof()返回( B )。(A) EOF(B) 非零值(C) 0(D) NULL1.3 简答题(1) 如果对fopen()函数的返回值不进行错误检查,可能会出现什么后果?为了程序的可靠性,是否需要对程序中所有的文件操作函数调用进行错误检查和处理?答案要点:(1) 如果fopen()函数操作错误,没有正确地按照指定方式打开文件,则后续所有文件操作均不能正确进行,程序会崩溃掉;(2) 因为文件操作的对象是外存上的文件,因此存在一定的偶然性,随时可能会出错,所以可靠的程序应该对所有文件操作进行检查判断其是否被正确执行并预设有相应的应对措施。(2) 以“a+”、“r+”、“w+”模式打开的文件都是可读可写的。哪种模式更适合用来改变文件中已有的内容?答案要点:相对来说,“r+”更适合用来改变文件中的内容,“r+”方式打开时,文件内部读写位置指针指向文件头,可以通过文件随机定位函数fseek()来把文件内部读写位置指针移到指定位置修改文件内容;而“a+”方式适合于给文件追加数据,文件打开时文件内部读写位置指针指向文件尾。当然“a+”方式也可以随机定位修改文件内容;而“w+”方式打开时,若文件已存在,则会破坏文件内原有的所有内容,因此不适合用来修改已有文件内容。1.4 编程题(1) 修改本章中程序清单9-3中StringWriteAndRead.c,使之只用打开文件和关闭文件各1次。程序清单 4-1 NewStringReadAndWrite.c/* purpose: Write and read string for file author: Zhang Weigang created: 2008/10/01 10:36:28 */#include #include #include int main(void)FILE *fp;char str81, strNew81, *pCh;int nResult, nLen;fp = fopen(hit.txt, w+);/* 创建文件hit.txt并打开 */if (NULL= fp)printf(Open file hit.txt errorn);exit(-1);printf(Please input a string:n);gets(str); /* 获取键盘输入字符串 */nLen = strlen(str);/* 计算字符串长度 */nResult = fputs(str, fp);/* 把字符串写入文件中 */if(EOF = nResult)printf(Write string to hit.txt errorn);exit(-1);printf(Write string to file completelyn);fseek(fp, 0L, SEEK_SET);/* 文件内部读写位置指针重新定位到文件头 */pCh = fgets(strNew, nLen+1, fp);/* 从文件中读取字符串 */if(NULL = pCh)printf(Read string from hit.txt errorn);exit(-1);puts(pCh);/* 输出字符串到屏幕,此处也可把pCh替换成strNew */fclose(fp);return 0;(2) 编写一个文件复制程序,要求从命令行参数中直接获取源文件名和目的文件名。程序清单 4-2 FileCopy.c/* purpose: Copy a fileauthor: Zhang Weigangcreated: 2008/10/01 10:49:32 */#include #include int main(int argc, char *argv)FILE *fpSource, *fpDest;char ch;int nNum=0;if(argc != 3)/* 判断命令行参数输入是否正确 */printf(Please use this program like:n);printf(FileCopy SourceFileName DestinationFileNamen);exit(-1);fpSource = fopen(argv1, r);/* 打开复制源文件 */if (NULL= fpSource)printf(Open source file errorn);exit(-1);fpDest = fopen(argv2, w);/* 创建并打开复制目标文件 */if (NULL= fpDest)printf(Open destination file errorn);exit(-1);ch = fgetc(fpSource);/* 从源文件中读入字符 */while(!feof(fpSource)/* 判断当前读入字符是否为文件结束符 */fputc(ch, fpDest);/* 把当前字符写入到目标文件中 */nNum+;/* 统计复制字节数 */ch = fgetc(fpSource);printf(Copied %d bytes.n, nNum);printf(File Copy Successfully!n);fclose(fpSource);/* 关闭文件 */fclose(fpDest);return 0;(3) 通过命令行参数给定2个文件的文件名,要求把第二个文件的内容原封不动的写入到第一个文件的尾部,并且不能破坏第一个文件原有数据。程序清单 4-3 FileCat.c/* purpose: Append a file to another fileauthor: Zhang Weigangcreated: 2008/10/01 11:29:42 */#include #include int main(int argc, char *argv)FILE *fpSource, *fpDest;char ch;int nNum=0;printf(Append the second file to the first file.n);if(argc != 3)/* 判断命令行参数输入是否正确 */printf(Please use this program like:n);printf(FileCat SourceFileName DestinationFileNamen);exit(-1);fpDest = fopen(argv1, a+);/* 以追加读/写方式打开第一个文件 */if (NULL= fpDest)printf(Open source file errorn);exit(-1);fpSource = fopen(argv2, r);/* 以只读方式打开第二个文件 */if (NULL= fpSource)printf(Open destination file errorn);exit(-1);ch = fgetc(fpSource);/* 从源文件中读入字符 */while(!feof(fpSource)/* 判断当前读入字符是否为文件结束符 */fputc(ch, fpDest);/* 把当前字符写入到目标文件中 */nNum+;/* 统计追加字节数 */ch = fgetc(fpSource);printf(Appended %d bytes.n, nNum);printf(File Append Successfully!n);fclose(fpDest);/* 关闭文件 */fclose(fpSource);return 0;(4) 给定一文本文件和一个字符,要求编程实现把该文件中包含有此指定字符的所有数据行打印出来并按原有样式写入到一个新的文本文件中保存起来。程序清单 4-4 CharSearch.c/* purpose: Search a character in a fileauthor: Zhang Weigangcreated: 2008/10/02 09:58:42 */#include #include /*功能: 从文件中读取一行字符,存放到指定内存区域参数: 文件指针fp,字符指针buffer返回值:返回所读取的文件行的字符数*/int readLine(FILE *fp, char *buffer)char character;int i=0;docharacter = fgetc(fp);/* 从文件中读取单个字符 */bufferi=character;/* 字符存放到缓冲区中 */+i;/* 计数 */while (character!=n& !feof(fp);/* 遇到换行符或文件结束符停止循环 */bufferi-1=0;/* 给buffer添加空字符构成字符串 */return (i-1);/* 返回所读取的字符数 */*功能: 在字符串中查找指定字符参数: 字符ch,字符指针buffer返回值:若字符串中存在该字符,则返回1;否则返回0*/int search(char ch, char *buffer)int i = 0, result = 0;while(0 != *(buffer+i)/* 遇空字符停止循环 */if(ch = *(buffer+i)result = 1;break;i+;return result;int main(void)FILE *fpSearch, *fpSave;char ch, filename50, savename50, buffer500;int nNum=0, line=0;printf(Please input the character that you want to search:n);ch = getchar();/* 输入指定字符 */getchar();/* 消除脏回车符影响 */printf(Please input the filename:n);gets(filename);/* 输入文件名 */printf(Please input the saveas filename:n);gets(savename);/* 输入要另存为的文件名 */fpSearch = fopen(filename, r);if (NULL= fpSearch)printf(Open the search file errorn);exit(-1);fpSave = fopen(savename, w+);if (NULL= fpSave)printf(Open the saveas file errorn);exit(-1);while(1)nNum = readLine(fpSearch, buffer);/* 读取文件内的一行字符 */if(0 = nNum)/* 若所读取的字符数为0,则说明已无文件行可读,停止循环 */break;elseline+;if(search(ch, buffer)/* 在字符串中查找指定字符 */printf(File Line %d: %d characters.n, line, nNum);/* 输出行号和所包含字符数 */printf(%snn, buffer);/* 输出所读取的文件行字符串 */fputs(buffer, fpSave);/* 把所读取的文件行字符串写入到另存为的文件只能够 */fputc(n, fpSave);/* 输出换行符到另存为的文件中 */printf(File savaas Successfully!n);fclose(fpSearch);/* 关闭文件 */fclose(fpSave);return 0;(5) 编程统计一个文本文件中所包含的字母、数字和其他字符的个数。程序清单 4-5 Stat.c/* purpose: Static character numbers in a fileauthor: Zhang Weigangcreated: 2008/10/02 11:38:02 */#include #include int main(void)FILE *fp;char ch, filename50;int nCharNum=0, nDigitalNum=0, nOtherNum=0;printf(Please input the filename:n);gets(filename);/* 输入文件名 */fp = fopen(filename, r);if (NULL= fp)printf(Open the file errorn);exit(-1);doch = fgetc(fp);/* 读取文件中字符 */if(ch = a & ch = A & ch = 0 & ch = 9)/* 数字 */nDigitalNum+;else/* 其他字符 */nOtherNum+;while(!feof(fp);printf(-n);/* 输出结果 */printf(Character static in file %s:n, filename);printf(Characters: %dn, nCharNum);printf(Digitals: %dn, nDigitalNum);printf(Other: %dn, nOtherNum);fclose(fp);/* 关闭文件 */return 0;(6) 某个文本文件包含了若干家庭的所有家庭成员的年龄,其中同一个家庭所有成员的年龄都位于同一行,由单个空格分隔,家庭成员数不固定。例如,下面的数据51 49 2436 35 7 325 25描述了三个家庭的成员年龄,其中第1个家庭有成员3个,第2个家庭有成员4个,第3个家庭有成员2个。编写一个程序,计算并输出用这种文件表示的每个家庭所有成员的平均年龄。提示:在文本文件中,回车换行符用n表示。应该一行一行的从文件中读出数据进行处理。程序清单 4-6 Average.c/* purpose: Calculate the average age for a file lineauthor: Zhang Weigangcreated: 2008/10/02 11:48:36 */#include #include #include /*功能: 从文件中读取一行字符,存放到指定内存区域参数: 文件指针fp,字符指针buffer返回值:返回所读取的文件行的字符数*/int readLine(FILE *fp, char *buffer)char character;int i=0;docharacter = fgetc(fp);/* 从文件中读取单个字符 */bufferi=character;/* 字符存放到缓冲区中 */+i;/* 计数 */while (character!=n& !feof(fp);/* 遇到换行符或文件结束符停止循环 */bufferi-1=0;/* 给buffer添加空字符构成字符串 */return (i-1);/* 返回所读取的字符数 */*功能: 全数字字符串转换为整数参数: 字符串长度len,字符指针str返回值:返回转换所得的整数*/int str2int(int len, char *str)int i, num=0;for(i=0; ilen; i+)num += (*(str+i) - 0)*(int)pow(10, len-i-1);return num;/*功能: 从字符串中得到所有年龄值并计算平均年龄值参数: 字符指针buffer返回值:返回平均年龄值*/float average(char *buffer)int i=0, j;int sum=0, num=0;char tmp10;float result = 0.0;while(1)/* 依据空格字符把字符串分割成只包含数字的子串 */j=0;dotmpj = *(buffer+i);j+;i+;while( !=*(buffer+i) & 0 != *(buffer+i);tmpj=0;num+;/* 统计家庭成员数 */sum += str2int(j, tmp);/* 把数字字串转换成整数并进行年龄值累加 */if(0 = *(buffer+i)/* 遇空字符停止循环 */break;i+;result = (float)sum/num;/* 计算平均年龄值 */printf(Number of family member: %dtSum of age: %dn, num, sum);return result;int main(int argc, char *argv)/* 通过命令行参数获取文件名 */FILE *fp;char buffer100;int nNum=0, line=0;if(argc != 2)/* 判断命令行参数输入是否正确 */printf(Please use this program like:n);printf(Average FileNamen);exit(-1);fp = fopen(argv1, r);if (NULL= fp)printf(Open the age file errorn);exit(-1);while(1)nNum =

温馨提示

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

评论

0/150

提交评论