C语言练习与思考9 题目及答案Word下载.docx
《C语言练习与思考9 题目及答案Word下载.docx》由会员分享,可在线阅读,更多相关《C语言练习与思考9 题目及答案Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
(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:
user\text.txt(B)c:
\user\text.txt
(C)"
c:
\user\text.txt"
(D)"
\\user\\text.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)NULL
1.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-1NewStringReadAndWrite.c
/*
purpose:
Writeandreadstringforfile
author:
ZhangWeigang
created:
2008/10/0110:
36:
28
*/
stdlib.h>
string.h>
intmain(void)
{
FILE*fp;
charstr[81],strNew[81],*pCh;
intnResult,nLen;
fp=fopen("
hit.txt"
w+"
/*创建文件hit.txt并打开*/
if(NULL==fp)
{
printf("
Openfilehit.txterror\n"
exit(-1);
}
printf("
Pleaseinputastring:
\n"
gets(str);
/*获取键盘输入字符串*/
nLen=strlen(str);
/*计算字符串长度*/
nResult=fputs(str,fp);
/*把字符串写入文件中*/
if(EOF==nResult)
Writestringtohit.txterror\n"
Writestringtofilecompletely\n"
fseek(fp,0L,SEEK_SET);
/*文件内部读写位置指针重新定位到文件头*/
pCh=fgets(strNew,nLen+1,fp);
/*从文件中读取字符串*/
if(NULL==pCh)
Readstringfromhit.txterror\n"
puts(pCh);
/*输出字符串到屏幕,此处也可把pCh替换成strNew*/
fclose(fp);
return0;
}
(2)编写一个文件复制程序,要求从命令行参数中直接获取源文件名和目的文件名。
程序清单4-2FileCopy.c
Copyafile
49:
32
intmain(intargc,char*argv[])
FILE*fpSource,*fpDest;
charch;
intnNum=0;
if(argc!
=3)/*判断命令行参数输入是否正确*/
Pleaseusethisprogramlike:
FileCopySourceFileNameDestinationFileName\n"
fpSource=fopen(argv[1],"
/*打开复制源文件*/
if(NULL==fpSource)
Opensourcefileerror\n"
fpDest=fopen(argv[2],"
/*创建并打开复制目标文件*/
if(NULL==fpDest)
Opendestinationfileerror\n"
ch=fgetc(fpSource);
/*从源文件中读入字符*/
while(!
feof(fpSource))/*判断当前读入字符是否为文件结束符*/
fputc(ch,fpDest);
/*把当前字符写入到目标文件中*/
nNum++;
/*统计复制字节数*/
ch=fgetc(fpSource);
Copied%dbytes.\n"
nNum);
FileCopySuccessfully!
fclose(fpSource);
/*关闭文件*/
fclose(fpDest);
(3)通过命令行参数给定2个文件的文件名,要求把第二个文件的内容原封不动的写入到第一个文件的尾部,并且不能破坏第一个文件原有数据。
程序清单4-3FileCat.c
Appendafiletoanotherfile
2008/10/0111:
29:
42
Appendthesecondfiletothefirstfile.\n"
FileCatSourceFileNameDestinationFileName\n"
fpDest=fopen(argv[1],"
a+"
/*以追加读/写方式打开第一个文件*/
fpSource=fopen(argv[2],"
/*以只读方式打开第二个文件*/
/*统计追加字节数*/
Appended%dbytes.\n"
FileAppendSuccessfully!
(4)给定一文本文件和一个字符,要求编程实现把该文件中包含有此指定字符的所有数据行打印出来并按原有样式写入到一个新的文本文件中保存起来。
程序清单4-4CharSearch.c
Searchacharacterinafile
2008/10/0209:
58:
/*
功能:
从文件中读取一行字符,存放到指定内存区域
参数:
文件指针fp,字符指针buffer
返回值:
返回所读取的文件行的字符数
intreadLine(FILE*fp,char*buffer)
charcharacter;
inti=0;
do
character=fgetc(fp);
/*从文件中读取单个字符*/
buffer[i]=character;
/*字符存放到缓冲区中*/
++i;
/*计数*/
}while(character!
='
\n'
&
!
feof(fp));
/*遇到换行符或文件结束符停止循环*/
buffer[i-1]='
\0'
;
/*给buffer添加空字符构成字符串*/
return(i-1);
/*返回所读取的字符数*/
在字符串中查找指定字符
字符ch,字符指针buffer
若字符串中存在该字符,则返回1;
否则返回0
intsearch(charch,char*buffer)
inti=0,result=0;
while('
=*(buffer+i))/*遇空字符停止循环*/
if(ch==*(buffer+i))
{
result=1;
break;
}
i++;
returnresult;
FILE*fpSearch,*fpSave;
charch,filename[50],savename[50],buffer[500];
intnNum=0,line=0;
Pleaseinputthecharacterthatyouwanttosearch:
ch=getchar();
/*输入指定字符*/
getchar();
/*消除"
脏"
回车符影响*/
Pleaseinputthefilename:
gets(filename);
/*输入文件名*/
Pleaseinputthesaveasfilename:
gets(savename);
/*输入要另存为的文件名*/
fpSearch=fopen(filename,"
if(NULL==fpSearch)
Openthesearchfileerror\n"
fpSave=fopen(savename,"
if(NULL==fpSave)
Openthesaveasfileerror\n"
while
(1)
nNum=readLine(fpSearch,buffer);
/*读取文件内的一行字符*/
if(0==nNum)/*若所读取的字符数为0,则说明已无文件行可读,停止循环*/
else
line++;
if(search(ch,buffer))/*在字符串中查找指定字符*/
{
printf("
FileLine%d:
%dcharacters.\n"
line,nNum);
/*输出行号和所包含字符数*/
%s\n\n"
buffer);
/*输出所读取的文件行字符串*/
fputs(buffer,fpSave);
/*把所读取的文件行字符串写入到另存为的文件只能够*/
fputc('
fpSave);
/*输出换行符到另存为的文件中*/
}
}
FilesavaasSuccessfully!
fclose(fpSearch);
/*关闭文件*/
fclose(fpSave);
(5)编程统计一个文本文件中所包含的字母、数字和其他字符的个数。
程序清单4-5Stat.c
Staticcharacternumbersinafile
2008/10/0211:
38:
02
charch,filename[50];
intnCharNum=0,nDigitalNum=0,nOtherNum=0;
/*输入文件名*/
fp=fopen(filename,"
Openthefileerror\n"
ch=fgetc(fp);
/*读取文件中字符*/
if((ch>
='
a'
&
ch<
z'
)||(ch>
A'
Z'
))/*字母*/
nCharNum++;
elseif((ch>
0'
9'
))/*数字*/
nDigitalNum++;
else/*其他字符*/
nOtherNum++;
}while(!
------------------------------------\n"
/*输出结果*/
Characterstaticinfile%s:
filename);
Characters:
%d\n"
nCharNum);
Digitals:
nDigitalNum);
Other:
nOtherNum);
/*关闭文件*/
(6)某个文本文件包含了若干家庭的所有家庭成员的年龄,其中同一个家庭所有成员的年龄都位于同一行,由单个空格分隔,家庭成员数不固定。
例如,下面的数据
514924
363573
2525
描述了三个家庭的成员年龄,其中第1个家庭有成员3个,第2个家庭有成员4个,第3个家庭有成员2个。
编写一个程序,计算并输出用这种文件表示的每个家庭所有成员的平均年龄。
提示:
在文本文件中,回车换行符用‘\n’表示。
应该一行一行的从文件中读出数据进行处理。
程序清单4-6Average.c
Calculatetheaverageageforafileline
48:
36
math.h>
全数字字符串转换为整数
字符串长度len,字符指针str
返回转换所得的整数
intstr2int(intlen,char*str)
inti,num=0;
for(i=0;
i<
len;
i++)
num+=(*(str+i)-'
)*(int)pow(10,len-i-1);
returnnum;
从字符串中得到所有年龄值并计算平均年龄值
字符指针buffer
返回平均年龄值
floataverage(char*buffer)
inti=0,j;
int