第十章 (答案仅供参考),有问题大家可以在评论区一起讨论。
10.2//用Windows的记事本编辑一个文本文件,编写程序读取该文件中的数据,并在屏幕上显示;
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp;
char name[20];
char ch;
printf("请输入文件名称:\n");
scanf("%s",name);
fp=fopen(name,"r");
if(fp==NULL)
{
printf("File can not be opened!\n");
exit(0);//返回程序;
}
ch=fgetc(fp);//以字符方式从文件中读取一个字符;
while(ch!=EOF)//若读取到末尾,解fgetc()返回EOF(-1);
{
putchar(ch);//将字符送往屏幕;
ch=fgetc(fp);//从文件读取下一个字符;
}
putchar('\n');
fclose(fp);//关闭文件;
return 0;
}
10.3//将一个文本文件的内容复制到另一个文本文件中,文本文件的名字从键盘输入;
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp1,*fp2;
char data;//一个内存数据域
char c;
char name1[21],name2[21];
printf("请输入要读的文件名:\n");
scanf("%s",name1);
fp1=fopen(name1,"w");
//fp1=fopen("student.txt","w");
if(fp1==NULL)
{
printf("File can not be opened!\n");
exit(0);//返回程序;
}
scanf("%c",&c);
while(c!='$')
{
fputc(c,fp1);
scanf("%c",&c);
}
fclose(fp1);
//fp1=fopen("student.txt","rb");
//fp2=fopen("stu.txt","wb");
fp1=fopen(name1,"rb");//以二进制打开文件,供读
printf("请输入要写的文件名:\n");
scanf("%s",name2);
fp2=fopen(name2,"wb");//以二进制打开文件,供写
if(fp1==NULL||fp2==NULL)
{
printf("File can not be opened!\n");
exit(0);//返回程序;
}
fread(&data,sizeof(char),1,fp1);//从fp1中对一个字节的内容到变量data;
while(!feof(fp1))//所要读的文件未读完,feof()返回值为0;
{
fwrite(&data,sizeof(char),1,fp2);//将变量data的内容复制到fp2中;
fread(&data,sizeof(char),1,fp1);//从fp1中在读一个字节的内容到变量data
}
fclose(fp1);
fclose(fp2);
return 0;
}
10.4//输入五个学生信息,(姓名,年龄,数学,英语,语文),将学生信息存入名为"student.txt"文本文件中,
//每个学生占一行,各个数据之间用空格分隔,写文件采用fprintf()函数;
#include<stdio.h>
#include<stdlib.h>
#define N 5
struct STU
{
char name[21];
int age;
float score[3];//三门课成绩;
};
int main()
{
struct STU stu[N];
FILE *fp;
int i,s;
fp=fopen("student.txt","w");
if(fp==NULL)
{
printf("File can not be opened!\n");
exit(0);//返回程序;
}
for(i=0;i<N;i++)
{
printf("%d_student information:\n姓名 年龄 数学 英语 语文\n",i+1);
/*从键盘读入一个结构体数据到变量;*/
scanf("%s %d %f %f %f",stu[i].name,&stu[i].age,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
fprintf(fp,"%s %d %4.2f %4.2f %4.2f\n",stu[i].name,stu[i].age,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
}
fclose(fp);
/*
fp=fopen("student.txt","r");
printf("students information:\n姓名 年龄 英语 数学 语文\n");
//利用fscanf()从文件读出学生信息,利用返回值判断是否读出成功,(成功则返回fscanf以赋值变量的个数
//负责返回EOF(-1)
for(i=0;i<N;i++)
{
s=fscanf(fp,"%s %d %f %f %f",stu[i].name,&stu[i].age,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
if(s==5)//fscanf返回值(以赋值变量个数)
{
printf("%s %3d %5.2f %5.2f %5.2f\n",stu[i].name,stu[i].age,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
}
}
fclose(fp);
*/
return 0;
}
10.5/*将第四题文件中的数据读出来并求出平均成绩,按平均成绩从高到低显示学生信息(读文件采用fscanf()函数)*/
#include<stdio.h>
#include<stdlib.h>
#define N 5
struct STU
{
char name[21];
int age;
float score[3];//三门课成绩;
float avg;//平均成绩
};
int main()
{
struct STU stu[N],t;
FILE *fp;
int i,j,s;
float sum;
fp=fopen("student.txt","r");
if(fp==NULL)
{
printf("File can not be opened!\n");
exit(0);//返回程序;
}
printf("students information:\n姓名 年龄 英语 数学 语文\n");
//利用fscanf()从文件读出学生信息,利用返回值判断是否读出成功,(成功则返回fscanf以赋值变量的个数
//负责返回EOF(-1)
for(i=0;i<N;i++)
{
sum=0;
s=fscanf(fp,"%s %d %f %f %f",stu[i].name,&stu[i].age,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
if(s==5)//fscanf返回值(以赋值变量个数)
{
printf("%s %3d %5.2f %5.2f %5.2f\n",stu[i].name,stu[i].age,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
for(j=0;j<3;j++)
{
sum=sum+stu[i].score[j];
}
stu[i].avg=sum/3;
}
}
for(i=0;i<N;i++)
{
printf("平均成绩:%.2f ",stu[i].avg);
}
for(i=0;i<N;i++)//比较排序法
{
for(j=i+1;j<N;j++)
{
if(stu[i].avg<stu[j].avg)
{
t=stu[i];
stu[i]=stu[j];
stu[j]=t;
}
}
}
printf("排序后的信息:\n姓名 年龄 英语 数学 语文 平均成绩\n");
for(i=0;i<N;i++)
{
printf("%6s %2d %6.2f %6.2f %6.2f %6.2f\n",stu[i].name,stu[i].age,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].avg);
}
fclose(fp);
return 0;
}
10.6//定义一个结构体类型,其成员变量分别用来描述商品的名称,单价,数量,金额。输入n个商品的信息,将其保存到二进制文件中。
#include<stdio.h>
#include<stdlib.h>
#define N 5
struct Product
{
char name[21];//名称
float price;//单价
int num;//数量
float money;//金额
};
int main()
{
struct Product p[N];
int i,n;
char a[21];//用来存放文件地址;
FILE *fp;
printf("please input product numbers(1~%d):\n",N);
scanf("%d",&n);
if(n<=0||n>N)
{
printf("please input again!\n");
exit(0);
}
printf("please input text site:\n");
scanf("%s",a);//二进制文件以dat为文件名后缀;
fp=fopen(a,"wb");
if(fp==NULL)
{
printf("File can not be opened!\n");
exit(0);//返回文件
}
for(i=0;i<n;i++)
{
printf("please input %d product information:\n名称 单价 数量\n",i+1);
scanf("%s %f %d",p[i].name,&p[i].price,&p[i].num);
p[i].money=p[i].price*p[i].num;
fwrite(&p[i],sizeof(struct Product),1,fp);
}
fclose(fp);
fp=fopen(a,"rb");//以二进制打开文件供读;
printf("product information:\n名称 单价 数量 金额\n");
for(i=0;i<n;i++)
{
while(fread(&p[i],sizeof(struct Product),1,fp)==1)//返回值为数据块的个数,说明还有内容
{
printf("%3s %3.2f %3d %3.2f\n",p[i].name,p[i].price,p[i].num,p[i].money);
}
}
fclose(fp);
return 0;
}
10.7//将第六题的商品信息文件读出并显示,要求在显示数据时,首先按照金额从高到低排序,若金额相同,在按产品单价从高到低排序;
#include<stdio.h>
#include<stdlib.h>
#define N 5
struct Product
{
char name[21];//名称
float price;//单价
int num;//数量
float money;//金额
};
int main()
{
struct Product p[N],t;
int i,j,n;
char a[21];//用来存放文件地址;
FILE *fp;
printf("please input text site:\n");
scanf("%s",a);//二进制文件以dat为文件名后缀;
fp=fopen(a,"rb");
if(fp==NULL)
{
printf("File can not be opened!\n");
exit(0);//返回文件
}
printf("product information:\n名称 单价 数量 金额\n");
/*for(i=0;i<N;i++)
{
if(fread(&p[i],sizeof(struct Product),1,fp)==1)//返回值为数据块的个数,说明还有内容
{
printf("%6s %3.1f %2d %4.2f\n",p[i].name,p[i].price,p[i].num,p[i].money);
}
if(feof(fp))//feof()判断文件是否读
{
break;
}
}*/
for(i=0;i<N;i++)
{
if(feof(fp))
{
break;
}
fread(&p[i],sizeof(struct Product),1,fp);
}
n=i-1;//n表示的是结构体变量(数据块)的个数,i-1是因为feof函数会在文件内容输入完后在循环一次才结束,
for(i=0;i<n;i++)//比较排序法
{
for(j=i+1;j<n;j++)
{
if(p[i].money<p[j].money)//比较金额
{
t=p[i];
p[i]=p[j];
p[j]=t;
}
else if(p[i].money==p[j].money&&p[i].price<p[j].price)//比较价格
{
t=p[i];
p[i]=p[j];
p[j]=t;
}
}
}
printf("product finally information:\n名称 单价 数量 金额\n");
for(i=0;i<n;i++)
{
printf("%6s %3.1f %2d %4.2f\n",p[i].name,p[i].price,p[i].num,p[i].money);
}
fclose(fp);
return 0;
}
|