- 上一篇 软考软件设计师课后练习题:第七章习题及解答 [2007-2-9 11:17:27]
| 微软MCSE2003:Security | 微软MCSE2003+MCDBA |
| Cisco网络工程师CCNA | 华为认证网络工程师(HCNE) |
| CorelDRAW 12 官方认证 | Adobe平面设计师(ACCD) |
| AutoCAD(2006)认证专家 | Adobe网络设计师(ACCD) |
| 软件加密与解密工程师培训 | 网络应用工程师 |
| 国家信息化网络安全工程师 | CEAC网络应用工程师 |
8.1 单项选择题
1.若与文件型指针中相关联的文件的当前读位置已到了文件的末尾,则函数feof(fp)的返回值是( )
①0 ②-l
③非零值 ④NULL
【解】当调用fopen函数时,系统将为实参文件设定一个存放文件读写控制信息的控制块。该控制块记录有关文件持征、使用方式,当前读写位置等文件状态,并将该控制块的指针返回,作为文件指针变量的值。以后程序通过该指针调用函数时,系统能访问到这个控制块,利用该文件控制块中的控制信息,正确完成文件的读或写。所以文件指针并不真正指向文件当前读写位置,但通过文件指针,系统能在文件控制块中访问文件的当前读写位置。若某文件与文件指针中相关联着,该文件的当前读写位置在文件的末尾时,函数调用feof(fp)的返回值是一个非零值。所以正确解答是③。
2.下列语句中,将C定义为文件型指针的是( )
① FILE c; ② FILE *c; ③ file c; ④ file *c;
【解】如上题所述,文件控制块的类型已由系统命名为FILE。所以定义文件指针变量是C,就得用代码:“FILE *c;”。所以正确解答是②。
3.标准库函数fputs(pl,p2)的功能是( )
①从pl指向的文件中读一个字符率存入p2指向的内存
②从p2指向的文件中读一个字符串存入pl指向的内存
③从pl指向的内存中的一个字符串输出到p2指向的文件
④从p2指向的内存中的一个字符串输出到pl指向的文件
【解】标准函数调用fputs(p1,p2)完成的功能是将由字符指针pl所指的字符串内容输出到与文件指针p2相关联的文件中,即将从pl所指的内存中的字符串内容输出到p2所指向的文件中。所以正确解答是③。
8.2 填充题
1."FILE *p"的作用是定义一个______,其中的"FILE"是在________头文件中定义的。
【解】代码"FILE *p"的作用是定义一个文件指针变量,其中的FILE是在标准输入输出头文件stdio.h中定义的。
2.在对文件进行操作的过程中,若要求文件的现行位置回到文件的开头,应当调用的函数是_______函数。
【解】若要让文件随机地从某个现行位置回到文件的开头,可调用库函数rewind( )。
3.下面的程序用来统计文件中字符的个数,请填空。
# include
# include
main()
{ FILE *fp;
long num=0;
if(( fp =fopen("fname.day","r"))== NULL)
{ printf("Cann’t open file! \n"); etit(0); }
while________ { fgetc(fp); num++; }
printf("num =%d \n". num);
fclose(fp);
}
【解】若要统计文件中的字符个数,程序设计一个计数器,并预置该计数器为0值,并打开文件。在正确打开情况下,接着是一个循环。循环在文件未结束的情况下,反复读人字符,并增加字符计数器。所以循环条件可写成:!feof(fp)。程序有一个错误,由于num变量的类型是long型的,输出它的值应在格式符d之前加上格式修饰符’l’,不加这个修饰符只有在long型与int型实现相同的系统才是正确的。另外,要统计文件的长度,最好用二进制方式打开,通过读入的字节数求出文件的长。这是因为正文文件方式打开时,文件中的双字符(回车字符和换行字符)读入后将被当作一个字符存储,二进制方式不进行这样的转换。
8.3 程序分析题
1.读程序,写功能。
# include
# include
main()
{ FILE *f1,* f2;
int k;
if(( f1= fopen("c:\\tc \\ pl.c","r" )== NULL)
{ printf("Can not open file! \n");
exit(0);
}
if((f2= fopen("a:\\ pl.c","w" ))== NULL)
{ printf("Can not open file! \n" );
exit(0) ;
}
for( k=1;k<=l000;k++)
{ if( feof(f1)) break;
fputc( fgetc(f1), f2);
}
fclose(f1);
fclose(f2);
}
【解】程序首先以读方式打开文件pl.c,以写方式打开文件P2.c。程序在文件pl.c未结束之前读入l000个字符复制到文件p2.c。然后关闭这两个文件。所以程序的功能是将文件pl.c的前l000个字符复制到文件p2.c。子目录字符’\’在C语言中作为转义字符的引导字符,若在字符串中要用这个字符,必须双写该字符。如C盘根目录tc子目录文件p1.c,在C程序中应写成字符串"c:\\tc \\pl.c。
2.假定在当前盘当前目录下有2个文本文件,其名称和内容如下:
文件名 al.txt a2.txt
内容 121314 # 252627#
写出运行下列程序后的输出。
# include
# include
void fc( FILE *);
main()
{ FILE *fp;
if( fP= fopen("al.txt", "r"))== NULL)
{ printf("Can not open file! \n");
exit(l);
}
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(fp1)
FILE *fpl;
{ char c;
while((c=fgetc(fpl))!=’#’) putchar(c);
}
【解】程序以读方式打开文件a1.txt,若能正常打开,则调用函数fc。接着同样地,以读方式打开文件a2.txt,若能正常打开,也调用函数fc。函数企从指定的文件读入字符,在读入字符不是字符’#’情况下循环,将读人字符输出。对于文件a1.txt,程序输出121314,对于文件a2.txt,程序输出252627。所以程序输出121314252627。
8.4 程序设计题
1.编一个程序,从键盘输入200个字符,存入名为"f1.txt"的磁盘文件中。
【解】要将从键盘输入的字符写到指定的文件,程序要定义一个文件指针变量,并以写方式打开指定的文件,然后是一个循环,反复从键盘读人字符,将读人字符复制到文件。程序如下:
# include
# include
FILE * fp;
void main()
{ int i, ch;
if(( fp =fopen("f1.txt","w"))== NULL) {
prinit("Can’t open file %s.\n","f1.txt"); exit(0);
}
printf("Enter 200 characters. \n");
for( i = 1;i<=200;i++) {
ch= getchar();
if( ch== EOF) break;
fputc( ch,fp);
}
fclose(fp);
}
2.从上一题中建立的名为"f1.txt"的磁盘文件中读取120个字符,并显示在屏幕上。
【解】要从指定文件读入字符显示,要以读方式打开,并用循环控制从文件读人字符。程序如下:
# include
# include
FILE * fp;
void main()
{ int i;
if(( fp =fopen("f1.txt","r" ))== NULL) {
printf("Can’t open file %s.\n","f1.txt" ); exit(0);
}
for(i=l; i<=120; i++ ) {
if(feof(fp)) break;
putchar( fgetc(fp));
}
fclose(fp);
printf("\n");
}
3.编一个程序,将磁盘中的当前目录下名为"ccw1.txt" 的文本文件复制在同一目录下,文件名改为"ccw2.txt"。
【解】程序需要两个文件指针变量,一个对应读文件,另一个对应写文件。并分别用读和写方式打开两个文件。接着是以读文件状态作为循环控制条件,在读文件还未结束下循环,反复读人字符,并将读人字符复写到写文件中。程序如下:
# include
# include
FILE * rp, * wp;
void main()
{ int c;
if((rp= fopen("ccw1.txt","r"))== NULL) {
printf("Can’t open file %s.\n","ccwl.txt"); exit(0);
}
if((wp= fopen("ccw2.txt","w"))== NULL) {
printf("Can’t open file %s.\n","ccw2.txt"); exit(0);
}
while((c= fgetc(rp))!= EOF)
fputc( c,wp);
fclose(wp);
fclose(rp);
}
4.编程序,对名为"CCW.TXT"的磁盘文件中"@"之前的所有字符加密,加密方法是每个字节的内容减10。
【解】程序从文件读出字符,在字符"@"未出现之前,将读出字符作加密处理后回写。加密循环受文件结束或当前字符是"@"字符控制。程序如下:
# include
# include
# define DALTA 10
FILE * rp;
void main()
{ int c;
if(( rp = fopen("ccw.txt","r+")) ==NULL ) {
printf("Can’t open file %s.\n","ccw.txt"); exit(0);
}
while(( c= fgetc(rp))!= EOF) {
if( c ==’@’) break;
c+= DALTA;
fseek( rp,-1L,1 );
fputc( c, rp);
fseek( rp,OL,l);
}
fclose(rp);
}
5.编程序,对上一题中名为"CCW.TXT"的磁盘文件中"@"之前的所有字符解密并显示。
【解】要编写的程序完成与上一程序功能相反的工作,将上述程序中的DALTA定义成一10即可。完整程序略。
6.输入100个学生的信息(含学号、姓名、年龄、七门课程成绩、总分),其中学生的总分由程序计算产生。先将学生信息存入磁盘二进制数据文件student.dat中。然后再读取该文件,寻找总分最高的学生并输出该生的所有信息。
【解】程序要定义一个结构,逐一输入学生信息,并完成学生的总分计算,将学生信息存到该结构中,然后将该结构信息存入文件。设学生信息的输入以学生的学号为负数结束。然后,程序再用循环从这文件读入学生信息,将其中总分更高的学生信息存入另一结构中。循环结束后,结构中存储的就是总分最高学生的信息。最后,显示这总分最高的学生信息。程序如下:
# include
# include
# include
struct stu {
long no;
char name[20];
int age;
int score[7];
int total;
} student, maxs;
FILE *fp;
void main()
{ char buf[120];int total,i,t;long lt;
if((fp= fopen("student.dat","wb"))== NULL) {
printf("Can’t open file %s.\n","student.dat" );exit(0);
}
printf("输入学生的学号、姓名、年龄、七门课程成绩(学号小于0结束) \n");
while(1) {
scanf("%ld", <); student.no = lt;
if(student.no< 0) break;
scanf("%s", buf); strncpy( student.name, buf,19);
scanf("%d", &t); student.age = t;
for( total = 0, i = 0; i < 7;i++) {
scanf("%d", &t); student.score[i]= t;
total+= t;
}
student.total= total;
fwrite(char *) & student,sizeof student, 1, fp);
}
fclose(fp);
if((fp = fopen("student.dat","rb"))== NULL) {
printf("Can’t open file %s.\n","student.dat");exit(0);
}
maxs.total=-100;
While( !feof(fp)) {
fread((char *) & student,sizeof student,l,fp);
if( student.total> maxs.total) maxs=student;
}
fclose(fp);
printf("总分最高的学生信息:\n");
printf("学号:%ld", maxs.no);
printf(" \t姓名:%s",maxs,name);
printf("\t年龄::%d\n成绩:", maxs.age)
for( i=0; i< 7; i++)
printf("m",maxs.score[i]);
printf("\nTOTAL = %d\n", maxs. total);
}
站内检索: |
|