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); } |