实验13 文件的使用
任务1 文件的读、写操作
1.建立一个名为abc的文件,并将从键盘输入的字符存入该文件,当键盘输入结束时关闭该文件,填空完成下面程序。
#include <stdio.h>
main( )
{ FILE *fp;
char ch;
fp= fopen ("abc", "w" );
do {
ch=getchar ( );
fputc ( ch, fp);
} while ( ch!= EOF);
fclose (fp);
}
2.从键盘输入一个以“#”为结束标志的字符串,将它存入指定的文件中,填空完成下面程序。
#include<stdio.h>
main( )
{
FILE *fp;
char ch,fn[10];
printf("\nInput the file name: ");
scanf("%s", fn);
if( ( fp=fopen(fn,"w") )==NULL)
{
printf("\nCannot create file");
exit(1);
}
ch=getchar( );
while ( (ch=getchar())!='#' )
fputc(ch, fp);
close(fp);
}
3.文件复制,文件名来自main( )函数,填空完成下面程序。
#include<stdio.h>
void file_copy(FILE *fout, FILE *fin)
{ char k;
do{
k=fgetc( fin );
if(feof(fin))
break;
fputc( k,fout );
}while( 1 );
}
void main(int argc, char *argv[ ])
{ FILE *fp1, *fp2;
if( argc !=3) return;
if((fp1=fopen(argv[2], "rb"))==NULL) return;
fp2= fopen(argv[1],"wb") ;
file_copy (fp2,fp1);
fclose(fp1);
fclose(fp2);
}
任务2 文件综合程序设计
设计创建原始成绩表b1.txt,从文件b1.txt中取出成绩,排序后,按降序存放b2.TXT中,并输出前五名成绩报表。
参考代码如下:
#include "stdio.h"
#define N 10
struct student
{
int num;
char name[20];
int score[3];
float average;
};
void sort(struct student stu[]);
void print(FILE *fp, struct student stu[]);
void printtopfive(FILE *fp, struct student stu[]);
void main( )
{
struct student s[N];
int i;
FILE *fp1,*fp2;
char ch;
if((fp1=fopen("c:\\b1.txt","r"))==NULL)
{
printf("不能打开文件c:\\b1.txt");
exit(1);
}
if((fp2=fopen("c:\\b2.txt","w"))==NULL)
{
printf("不能打开文件c:\\b2.txt");
exit(1);
}
for(i=0;i<N;i++)
{
fscanf(fp1,"%d%s%d%d%d",&s[i].num,s[i].name,&s[i].score[0],
&s[i].score[1],&s[i].score[2]);
s[i].average=(s[i].score[0]+s[i].score[1]+s[i].score[2])/3.0;
}
fprintf(fp2,"原始成绩报表\n");
print(fp2,s);
sort(s);
fprintf(fp2,"排序之后的成绩报表\n");
print(fp2,s);
fprintf(fp2,"前五名成绩报表\n");
printtopfive(fp2,s);
}
void sort(struct student stu[])
{ int i,k,j;
struct student t;
for(i=0;i<N-1;i++)
{ k=i;
for(j=i+1;j<N;j++)
{ if(stu[k].average<stu[j].average)k=j; }
if(k!=i)
{
t=stu[i];
stu[i]=stu[k];
stu[k]=t;
}
}
}
void print(FILE *fp, struct student stu[])
{
int i;
fprintf(fp,"StudentID StudentName Score1 Score2 Score3 Average\n");
for(i=0;i<N;i++)
fprintf(fp,"%-10d%-12s%8d%8d%8d%8.1f\n",stu[i].num,stu[i].name,
stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].average);
}
void printtopfive(FILE *fp, struct student stu[])
{
int i;
fprintf(fp,"StudentName Average\n");
for(i=0;i<5;i++)
fprintf(fp,"%-12s%8.1f\n",stu[i].name,stu[i].average);
}