【C语言】文件的存放、读取、利用文件创建链表、链表排序以及将其写入文件

文件的存放、读取、利用文件创建链表、链表排序以及将其写入文件

(笔记!)

功能:

  • void createFile(char *FName); //创建文件,存放结构体数据
  • void readFile(char *FName); //从文件读出数据到结构体
  • struct Jd *createchain(char *FName); //利用文件创建链表
  • void printchain(struct Jd *head); //输出链表所有结点数据
  • void sortchain(struct Jd *head); //根据地址对链表进行排序
  • void writeToFile(struct Jd *head, char *FName); //把链表结点数据写往文件

主要代码如下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct STU
{
	char name[20];
	int num;
	int age;
	char addr[20];
};
struct Jd
{
	struct STU student;
	struct Jd *next;
};

void createFile(char *FName);					//创建文件,存放结构体数据
void readFile(char *FName);						//从文件读出数据到结构体
struct Jd *createchain(char *FName);			//利用文件创建链表
void printchain(struct Jd *head);				//输出链表所有结点数据
void sortchain(struct Jd *head);				//根据地址对链表进行排序
void writeToFile(struct Jd *head, char *FName);	//把链表结点数据写往文件

int main(void)
{
	struct Jd *head = NULL;
	char FileName[128] = {'\0'};
	
	strcpy(FileName,"stu.dat");
	createFile(FileName);
	readFile(FileName);
	
	head = createchain(FileName);
	printf("* * * * * 未排序的链表数据 * * * * * \n");
	printchain(head);
	
	sortchain(head);
	printf("* * * * * 根据地址排序后的链表数据 * * * * * \n");
	printchain(head);
	
	strcpy(FileName, "paixu.dat");
	writeToFile(head,FileName);
	readFile(FileName);
	
	return 0;
}

void createFile(char *FName)
{
	int i = 1;
	struct STU stud;
	FILE *fp;
	
	if ( (fp = fopen(FName, "wb")) == NULL )	//利用FName的字符串作文件名
	{
		printf("cannot open file\n");
		exit(0);
	}
	
	while ( i!=0 )
	{
		printf("enter data of student:\n");
		printf("姓名:");
		scanf("%s", stud.name);
		printf("学号:");
		scanf("%d", &stud.num);
		printf("年龄:");
		scanf("%d", &stud.age);
		printf("地址:");
		scanf("%s", stud.addr);
		if ( fwrite(&stud,sizeof(struct STU),1,fp) != 1 )	//把一个结构体数据写到文件中,并判断是否真实写入
		{
			printf("file write error\n");
		}
		printf("还需要输入新的学生数据(1=继续,0=退出)");
		scanf("%d", &i);
	}
	fclose(fp);

}

void readFile(char *FName)
{
	struct STU stud;
	FILE *fp;
	if ( (fp = fopen(FName, "rb")) == NULL )
		exit(0);
	
	printf("* * * * * %s 文件中的记录数据 * * * * * \n", FName);
	//从文件里读出一个结构体数据,知道读不出一个完整的结构体数据
	while ( fread(&stud,sizeof(struct STU),1,fp) == 1 )
	{
		printf("%-20s %4d %4d %-20s\n", stud.name, stud.num, stud.age, stud.addr);
	}
	fclose(fp);
}

struct Jd *createchain(char *FName)
{
	FILE *fp;
	struct Jd *pt, *pEnd, *head = NULL;
	struct STU stud;
	
	if ( (fp=fopen(FName,"rb")) == NULL )
	{
		exit(0);
	}
	
	while ( fread(&stud, sizeof(struct STU), 1, fp) == 1 )	//从文件里读出一个结构体数据
	{
		pt = (struct Jd *)malloc(sizeof(struct Jd));	//创建链表结点空间
		pt->student = stud;	//把前面读出的结构体数据赋值给结点的student成员
		if ( head == NULL )
		{
			head = pEnd = pt;
			pt->next = NULL;
		}
		else	//在尾部插入结点
		{
			pEnd->next = pt;	//将新结点链入链表
			pt->next = NULL;	//将新结点的next指针置空,标识成尾结点
			pEnd = pt;			//让pEnd指向尾结点,为下一次插入做准备
		}
	}
	fclose(fp);
	return head;
}

void printchain(struct Jd *head)
{
	struct STU stud;
	while ( head != NULL )	//从头结点开始输出,直到链表最后的尾结点
	{
		stud = head->student;
		printf("%-20s %4d %4d %-20s\n", stud.name, stud.num, stud.age, stud.addr);
		head = head->next;
	}
	
}

void sortchain(struct Jd *head)	//根据addr的值从小到大的排序
{
	struct Jd *pt1, *pt2, *pt;
	struct STU temp;
	
	for ( pt1 = head; pt1->next != NULL; pt1 = pt1->next )
	{
		pt = pt1;
		for ( pt2 = pt1->next; pt2 != NULL; pt2 = pt2->next )
		{
			if ( strcmp(pt->student.addr,pt2->student.addr) > 0 )
				pt = pt2;
		}
		if ( pt != pt1 )
		{
			temp = pt1->student;
			pt1->student = pt->student;
			pt->student = temp;
		}
	}
}

void writeToFile(struct Jd *head, char *FName)
{
	FILE *fp;
	struct Jd *pt;
	if ( (fp = fopen(FName,"wb")) == NULL)
	{
		exit(0);
	}
	pt = head;
	//依次把链表结点的学生信息写往文件中,直到输出链表最后一个结点
	while ( pt != NULL )
	{
		fwrite(&(pt->student), sizeof(struct STU), 1, fp);	//只将链表中学生信息写入
		pt = pt->next;
	}
	fclose(fp);
}
  • 7
    点赞
  • 132
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值