创建文件,对文件进行打开、关闭、读写等基本操作

文件读写:创建文件,对文件进行打开、关闭、读写等基本操作。
题目描述:
1、有n个学生,每个学生有3门课程的成绩,从键盘输入n个学生的学号、姓名、成绩等数据,并保存在“stu”文件中。
2、从文件中读入学生数据(包括学号、姓名、3门课程成绩),计算出平均成绩,将原有数据和计算出的平均成绩存放在磁盘文件“stu”中。
3、能在屏幕上输出文件中所有数据。

算法描述:本题运用模块化设计来实现功能。首先定义一个结构体用来存储学生信息,然后就是定义的各个函数的声明。通过主函数定义一个结构数组以及调用各个函数。然后是从键盘分别输入n个学生的学号、姓名以及m门课程的成绩到结构体数组stu中,定义一的函数实现对每个学生三科分数求均分的功能。接着就是输出n个学生的学号、姓名以及m门课程的成绩到文件student.txt中。首先以写的形式打开文件,设置完全缓存模式,然后将数据写入文件,最后关闭文件。然后从文件中读取学生的学号、姓名及成绩到结构体数组stu中并返回学生数。最后输出n个学生的学号、姓名、性别、出生日期、m门课程的成绩及平均分到屏幕上。

//创建文件,对文件进行打开、关闭、读写等基本操作
#include  <stdio.h>
#include  <stdlib.h>
#define N 30

typedef struct                               //引用typedef语句,这样在定义STUDENT类型语句时就可以不包含关键字struct
{
	long  studentID;			             //学号 
	char  studentName[10];	                 //姓名 
	int	  score[3];		                     //3门课程的成绩
	float aver;                              //3门课程的平均分
}STUDENT;
//函数声明
void InputScore(STUDENT stu[], int n, int m);//输入学生信息
void AverScore(STUDENT stu[], int n, int m); //求出学生平均分
void WritetoFile(STUDENT stu[], int n);      //将学生信息写入文件
int  ReadfromFile(STUDENT stu[]);            //从文件读取学生信息
void PrintScore(STUDENT stu[], int n, int m);//输出学生信息

int main(void)
{
	STUDENT stu[N];                          //最多的学生人数
	int n, m = 3;                            //n为学生人数;m为三门科目成绩
	printf("How many student?");
	scanf("%d", &n);
	InputScore(stu, n, m);
	AverScore(stu, n, m);
	WritetoFile(stu, n);
	n = ReadfromFile(stu);
    char *filename = "student.txt";
	remove(filename);
	PrintScore(stu, n, m);
	
    return 0;
}
//从键盘输入n个学生的学号、姓名以及m门课程的成绩到结构体数组stu中
void InputScore(STUDENT stu[], int n, int m)
{
	int i, j;
	for (i=0; i<n; i++)
	{
		printf("Input record %d:\n", i+1);
		scanf("%ld", &stu[i].studentID);
		scanf("%s", stu[i].studentName);
		for (j=0; j<m; j++)
		{
			scanf("%d", &stu[i].score[j]);
		}
	}
}
//计算n个学生的m门课程的平均分,存入数组aver中
void AverScore(STUDENT stu[], int n, int m)
{
	int i, j, sum[N];
	for (i=0; i<n; i++)
	{
		sum[i] = 0;
		for (j=0; j<m; j++)
		{
			sum[i] = sum[i] + stu[i].score[j];
		}
		stu[i].aver = (float)sum[i]/m;
	}
}
//输出n个学生的学号、姓名以及m门课程的成绩到文件student.txt中
void WritetoFile(STUDENT stu[], int n)
{
	FILE *fp;
	if ((fp = fopen("student.txt","w")) == NULL)   //以写方式打开文本文件
	{
		printf("Failure to open student.txt!\n");
		exit(0);
	}
	setvbuf(fp,NULL,_IOFBF,BUFSIZ);                //设置完全缓存模式
	
	fwrite(stu, sizeof(STUDENT), n, fp);           //按数据块写文件
	fclose(fp);
}
//从文件中读取学生的学号、姓名及成绩到结构体数组stu中并返回学生数
int ReadfromFile(STUDENT stu[])
{
	FILE *fp;
	int i;
	if ((fp = fopen("student.txt","r")) == NULL)  //以读方式打开文本文件
	{
		printf("Failure to open student.txt!\n");
		exit(0);
	}
    setvbuf(fp,NULL,_IOFBF,BUFSIZ);               //设置完全缓存模式
	
	for (i=0; !feof(fp); i++)
	{
		fread(&stu[i], sizeof(STUDENT), 1, fp);  //按数据块读文件
	}
	fclose(fp);
	printf("Total students is %d.\n", i-1);     //返回文件中的学生记录数
	return i-1;                                 //返回文件中的学生记录数
}
//输出n个学生的学号、姓名、性别、出生日期、m门课程的成绩及平均分到屏幕上
void PrintScore(STUDENT stu[], int n, int m)
{
	int i, j;
	for (i=0; i<n; i++)
	{
		printf("%10ld%8s",stu[i].studentID, stu[i].studentName);
		for (j=0; j<m; j++)
		{
			printf("%4d", stu[i].score[j]);
		}
		printf("%6.1f\n", stu[i].aver);         //字段宽度为6;保留小数点后1位
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值