//键盘输入多个学生信息存入指定文件stu.dat中
//将文件中信息输出显示
//利用文件信息生成链表并输出
//将链表结点按addr从小到大排序并输出
//排序后的链表数据写道文件paixu.dat里
//将paixu.dat文件内容输出
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 3
struct Student //结构体
{
char name[20];
int num;
int age;
char addr[20];
};
struct Lian //对应链表
{
struct Student L;
struct Lian *next;
};
int main()
{
struct Student S;
FILE *fp;
fp=fopen("stu","wb+"); //以二进制方式打开文件进行读写功能
if(fp==NULL)
{
printf("No Open!!\n");
exit(0);
}
int i=0;
while(i<N)
{
printf("请输入第%d位同学的信息:",++i);
scanf("%s%d%d%s",S.name ,&S.num ,&S.age ,S.addr );
fwrite(S.name ,sizeof(struct Student),1,fp); //读入文件,注意这里S.name表示开始地址,地址连续,因此把该结构体内容写入文件
}
rewind(fp); //文件指针回到开始位置进行读功能
i=0;
struct Lian *head=NULL,*p,*p1; //输出信息同时链表创建
printf("文件内容如下:\n");
while(i<N) //输出文件信息并创建链表
{
p=(struct Lian *)malloc(sizeof(struct Lian));
printf("第%d位同学的信息:",++i);
fread(S.name ,sizeof(struct Student),1,fp); //从文件中读入数据存放进结构体,地址连续,因此对应内容放入对应结构体
printf("%s,%d,%d,%s\n",S.name ,S.num ,S.age ,S.addr );
p->L =S;
p->next =NULL;
if(head==NULL)
{
head=p;
p1=p;
}
else
{
p1->next =p;
p1=p;
}
}
printf("链表内容如下:\n");
p=head;
while(p!=NULL) //输出链表
{
printf("%s,%d,%d,%s\n",p->L.name ,p->L.num ,p->L.age ,p->L.addr );
p=p->next ;
}
//链表排序
struct Student temp;
p=head;
p1=p1->next ;
while(p1!=NULL)
{
if(strcmp(p1->L.addr,p->L .addr ) <0)
{
temp=p->L ;
p->L =p1->L ;
p1->L =temp;
}
p=p->next ;
p1=p1->next ;
}
fclose(fp);
//写入新文件
FILE *fp1;
fp1=fopen("paixu","wb+");
if(fp1==NULL)
{
printf("No Open!!\n");
exit(0);
}
p=head;
while(p!=NULL)
{
fwrite(p->L .name ,sizeof(struct Student),1,fp1);
p=p->next ;
}
rewind(fp1);
printf("排序后写入文件内容如下:\n");
i=0;
while(i<N)
{
i++;
fread(S.name ,sizeof(struct Student),1,fp1);
printf("%s,%d,%d,%s\n",S.name ,S.num ,S.age ,S.addr );
}
return 0;
}
// fread(S.name ,sizeof(struct Student),1,fp); //从这里知道结构体内存连续存放,printf("%s,%d,%d,%s\n",S.name ,S.num ,S.age ,S.addr );
//键盘输入多个学生信息存入指定文件stu.dat中
于 2022-10-04 14:57:39 首次发布