文本文件、二进制文件操作03(C)

现有一个二进制文件 E83_data.bin,文件中包含了若干学生信息, 请将文件保存至 C 盘根目录下的 cdata 文件夹。其中学生信息结构如下:
struct _student
{
char ID[15]; // 学号
char name[20]; // 姓名
int grade; // 年级
int scorces[3]; // 成绩
}
 

编写程序完成如下功能:
(1) 编写一个函数,读取二进制文件中的所有学生信息。
(2) 编写一个函数,输出所有学生信息,要求每个学生信息占一行,输出格式要求:学号(占 20 列,左对齐),姓名(占 25 列,左对齐), 年级(占 3 列,左对齐), 成绩(每个成绩占 6 列,右对齐)。
(3) 编写一个函数,对所有学生根据学生的平均成绩按照从大到小排序。
(4) 编写一个函数,将所有学生信息输出到 C 盘根目录下的 cdata 文件夹中的文本文件 E83_result.txt,要求每行输出一个学生信息,输出格式要求如下:学号(占 20 列,左对齐),姓名(占 25 列,左对齐), 年级(占 3 列,左对齐),成绩(每个成绩占 6 列,右对齐),平均成绩(占 6 列,保留 2 为小数,右对齐)。
(5) 编写一个函数,删除所有学生中平均成绩小于 score 的学生信息,其中score 由参数传入。
(6) 编写测试程序。 其中要求删除所有平均成绩小于 40 分的学生信息,并将剩下的学生信息输出到 C 盘根目录下的 cdata 文件夹中的文本文件E83_delresult.txt,要求每行输出一个学生信息,输出格式要求如下: 学号(占20 列,左对齐),姓名(占 25 列,左对齐), 年级(占 3 列,左对齐), 成绩(每个成绩占 6 列,右对齐),平均成绩(占 6 列,保留 2 为小数,右对齐)
 

/*============================================================================================================================================
*学号:1527403059
*作业:E83
*功能:(1) 编写一个函数,读取二进制文件中的所有学生信息。 
       (2) 编写一个函数,输出所有学生信息,要求每个学生信息占一行,输出格式要求:学号(占 20 列,左对齐),姓名(占 25 列,左对齐), 年级(占 3 列,
           左对齐), 成绩(每个成绩占 6 列,右对齐)。 
       (3) 编写一个函数,对所有学生根据学生的平均成绩按照从大到小排序。 
       (4) 编写一个函数,将所有学生信息输出到 C 盘根目录下的 cdata 文件夹中的文本文件 E83_result.txt,要求每行输出一个学生信息,输出格式要求如下:
           学号(占 20 列,左对齐),姓名(占 25 列,左对齐), 年级(占 3 列,左对齐), 成绩(每个成绩占 6 列,右对齐),平均成绩(占 6 列,保留 2 为小数,
		   右对齐)。 
       (5) 编写一个函数,删除所有学生中平均成绩小于 score 的学生信息,其中score 由参数传入。 
       (6) 编写测试程序。其中要求删除所有平均成绩小于 40 分的学生信息,并将剩下的学生信息输出到 C 盘根目录下的 cdata 文件夹中的文本文件
           E83_delresult.txt,要求每行输出一个学生信息,输出格式要求如下:学号(占20 列,左对齐),姓名(占 25 列,左对齐), 年级(占 3 列,左对齐), 
		   成绩(每个成绩占 6 列,右对齐),平均成绩(占 6 列,保留 2 为小数,右对齐)。 
*作者:陆胤任
*日期:2016.1.3
*===============================================================================================================================================*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct student                                     //结构体
{
	char ID[15];
	char name[20];
	int grade;
	int scorces[3];
};

struct StudentNode                                  //链表
{
	struct student data;
	double aver;
	struct StudentNode *next;
};

/*function define
*@brief:读取文件中的所有信息
*@param:char *FileName:文件名
*@reval:*head:链表头节点
*/
struct StudentNode *CreateListFromFile(char *FileName)
{
	FILE *fp;
	struct StudentNode *head,*p,*q;
	struct student t;
	int res;
	fp=fopen(FileName,"rb");                                               //检查是否打开文件失败
	if(fp==NULL)
	{
		printf("无法打开文件!\n");
		exit(0);
	}
	head=(struct StudentNode *)malloc(sizeof(struct StudentNode));        //开辟新空间
	q=head;
	while(!feof(fp))                                                     //如果未遇到文件结束标志
	{
		res=fread(&t,sizeof(struct student),1,fp);
		if(res==0)
		{
			continue;
		}
		p=(struct StudentNode *)malloc(sizeof(struct StudentNode));
		p->data=t;
		p->aver=(p->data.scorces[0]+p->data.scorces[1]+p->data.scorces[2])/3.0;    //求平均分
		q->next=p;
		q=p;
	}
	p->next=NULL;
	fclose(fp);                                                     //关闭文件
	return head;
}

/*function define
*@brief:显示文件内容到屏幕上
*@param:struct StudentNode *Head:链表头节点
*@reval:void
*/
void DisplayList(struct StudentNode *Head)
{
	struct StudentNode *p;
	p=Head->next;
	while(p!=NULL)                                                  //输出内容
	{
		printf("%-20s%-25s%-3d%6d%6d%6d%6.2lf\n",p->data.ID,p->data.name,p->data.grade,p->data.scorces[0],p->data.scorces[1],p->data.scorces[2],p->aver);
		p=p->next;
	}
	printf("\n");
}

/*function define
*@brief:对数据进行排序
*@param:struct StudentNode *Head:链表头节点
*@reval:void
*/
void SortList(struct StudentNode *Head)
{
	struct StudentNode *pi,*pj,*pmax;
	struct student temp;
	double aver;
	pi=Head->next;
	while(pi->next!=NULL)                                 //选择排序法
	{
		pmax=pi;
		pj=pi->next;
		while(pj!=NULL)
		{
			if(pmax->aver<pj->aver)
			{
				pmax=pj;
			}
			pj=pj->next;
		}
		if(pmax!=pi)
		{
			temp=pmax->data;
			aver=pmax->aver;

			pmax->data=pi->data;
			pmax->aver=pi->aver;

			pi->data=temp;
			pi->aver=aver;
		}
		pi=pi->next;
	}
}

/*function define
*@brief:删除节点
*@param:struct StudentNode *Head:链表头节点
        double Score:参数传递的分数
*@reval:void
*/
void DeleteNode(struct StudentNode *Head,double Score)
{
	struct StudentNode *p,*q;
	q=Head;
	p=Head->next;
	while(p!=NULL)
	{
		if(p->aver<=Score)
		{
			q->next=p->next;
			free(p);
			p=q->next;
		}
		else
		{
			q=p;
			p=p->next;
		}
	}
}

/*function define
*@brief:将文件内容保存在指定文件中
*@param:char *FileName:文件名
        struct StudentNode *Head:链表头节点
*@reval:void
*/
void WriteInfoToFile(char *FileName,struct StudentNode *Head)
{
	FILE *fp;
	struct StudentNode *p;
	fp=fopen(FileName,"w");
	if(fp==NULL)
	{
		printf("打开文件失败!\n");
		exit(0);
	}
	p=Head->next;
	while(p!=NULL)
	{
		fprintf(fp,"%-20s%-25s%-3d%6d%6d%6d%6.2lf\n",p->data.ID,p->data.name,p->data.grade,p->data.scorces[0],p->data.scorces[1],p->data.scorces[2],p->aver);
		p=p->next;
	}
	fprintf(fp,"\n");                           //格式化输出换行符
	fclose(fp);
}

/*function define
*@brief:释放节点
*@param:struct StudentNode *Head:链表头节点
*@reval:void
*/
void free_node(struct StudentNode *head)
{
	struct StudentNode *p,*q;
	p=head;
	while(NULL!=p)
	{
		q=p;
		p=p->next;
		free(q);
	}
}

int main()                                                  //主函数
{
	struct StudentNode *head;
	head=CreateListFromFile("C:\\cdata\\E83_data.bin");
	printf("文件读取完成后学生信息如下:\n");
	DisplayList(head);
	SortList(head);
	printf("排序后学生的信息如下:\n");
	DisplayList(head);
	WriteInfoToFile("C:\\cdata\\E83_result.txt",head);
	DeleteNode(head,40.0);
	WriteInfoToFile("C:\\cdata\\E83_delresult.txt",head);
	free_node(head);                                         //释放节点
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ukco_well/article/details/82218920