当前位置:首页 » 编程语言 » c语言从文件读取链表

c语言从文件读取链表

发布时间: 2024-12-14 08:59:29

c语言中如何将文件中的数据读取到链表中

我原来做过的,学生的成绩情况我是用链表存储(没有用数组),要把这些信息存到dat 文件中,直接用文件的写入就可以了 至于重新插入学生信息,我是直接添加到刚才那个链表的后面,然后重新保存,我就是用的这个方法。如果你需要这个代码 ,我发给你! 给我留言,反正我每天都在线的。

⑵ c语言如何将文件数据读入链表用fread

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

structreadfile
{
intn;
structreadfile*next;
};

intmain()
{
FILE*fp;
structreadfile*head,*q,*p;
intm=0,i;
structreadfilek[5];

fp=fopen("file.dat","wb");
if(fp==NULL)
{
printf("文件打开失败! ");
exit(-1);
}
for(i=0;i<5;i++)
scanf("%d",&k[i]);
for(i=0;i<5;i++)
if(fwrite(&k[i],sizeof(structreadfile),1,fp)!=1)//将数据写入文件
{
if(!feof(fp))
{
printf("文件写入失败! ");
exit(0);
}
}
fclose(fp);
if((fp=fopen("file.dat","rb"))==NULL)
{
printf("文件打开失败! ");
exit(1);
}
p=q=(structreadfile*)malloc(sizeof(structreadfile));//分配空间创建链表
if(fread(&p->n,sizeof(structreadfile),1,fp)!=1)//从文件读取一个数据到链表结点
{
if(!feof(fp))
{
printf("文件读取失败! ");
exit(2);
}
}
head=NULL;
while(i--&&i>=0)//创建链表
{
m++;
if(m==1)
head=p;
else
q->next=p;
q=p;
p=(structreadfile*)malloc(sizeof(structreadfile));
fread(&p->n,sizeof(structreadfile),1,fp);//从文件读取数据到链表结点
}
q->next=NULL;
fclose(fp);//数据已经写入到链表,可以关闭文件了
printf("链表中的内容: ");
while(head!=NULL)//输出链表中内容,验证数据已经写入到链表
{
printf("%d",head->n);
head=head->next;
}
printf("数据写入链表成功 ");

return0;
}

⑶ 用C语言将文本文件中的数据(一个个结构体类型的数据)读到链表中去,代码如何写

这是我最开始学习链表的时候写的一个很小的程序,好像不是很完善,但是大致应该没有问题,你可以参照的看看。太晚了,实在是不想写了。

#include<stdio.h>
#include<io.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#defineMAX200

structstudent
{
charno[10];//学号
charname[50];//姓名
floatscore[3];//分数
floatmath;
floateng;
floatphy;
};
structdata
{
intcount;//当前学生数组中学生的个数
structstudentstu[MAX];//学生数组
}dd;

//显示主菜单
voidmenu()
{
system("cls");//清屏
printf(" ");
printf(" ******************************* ");
printf(" ");
printf(" 学生成绩管理系统 ");
printf(" ");
printf(" [1]查看所有学生信息 ");
printf(" [2]输入学生记录 ");
printf(" [3]删除学生记录 ");
printf(" [4]修改学生记录 ");
printf(" [5]查询学生成绩(学号) ");
printf(" [6]查询成学生绩(姓名) ");
printf(" [7]查看成绩排序(学号) ");
printf(" [0]退出 ");
printf(" ");
}

//等待用户按回车后回到主菜单
voidto_menu()
{
charc1,c2;
printf(" 按回车键返回主菜单...");
scanf("%c%c",&c1,&c2);//第一个字符吸收上次的确认回车键
menu();
}
//统计信息
voidren()
{
intA=0,B=0,C=0,D=0,E=0,s;
inti;

for(i=0;i<dd.count;i++)
{
s=(int)(dd.stu[i].math/10);
switch(s)
{
case10:
case9:
A++;
break;
case8:
B++;
break;
case7:
C++;
break;
case6:
D++;
break;
default:
E++;
break;
}
}

printf("总人数:%d ",dd.count);
printf("获得“优秀”的人数:%d ",A);
printf("获得“良”的人数:%d ",B);
printf("获得“中”的人数:%d ",C);
printf("获得“及格”的人数:%d ",D);
printf("不及格的人数:%d ",E);

}

//查看所有学生信息
voidview_data()
{
inti;
printf("学号 姓名 数学 英语 物理");
printf(" ------------------------------------------------------------------- ");
for(i=0;i<dd.count;i++)
printf("%s %s %-7.1f %-7.1f %-7.1f ",dd.stu[i].no,dd.stu[i].name,dd.stu[i].math,dd.stu[i].eng,dd.stu[i].phy);
printf(" ------------------------------------------------------------------- ");
ren();
}


//将数据从结构体数组保存到文件中
voidsave_data()
{
FILE*fp;//文件指针
inti,k;
k=dd.count; //其实k没有什么实际的意义,直接在fwrite里使用&dd.count就可以了。
fp=fopen("D:\data.txt","w");//文件存储位置:当前文件夹
fwrite(&k,sizeof(int),1,fp);
for(i=0;i<dd.count;i++)
fwrite(&dd.stu[i],sizeof(structstudent),1,fp);
fclose(fp);
}

//输入学生记录
voidadd_data()
{
intb;
intk=dd.count;
while(k<MAX)
{
printf("请输入学生学号:");scanf("%s",dd.stu[k].no);
printf("请输入学生姓名:");scanf("%s",dd.stu[k].name);
printf("请输入数学成绩:");scanf("%f",&dd.stu[k].math);
printf("请输入英语成绩:");scanf("%f",&dd.stu[k].eng);
printf("请输入物理成绩:");scanf("%f",&dd.stu[k].phy);

dd.count++; //需要提前置0,在主函数中。
k=dd.count;
printf(" 继续添加学生信息[1-yes0-no]:");
scanf("%d",&b);
if(b==0)break;
}
save_data();
}

//将数据从文件读到结构体数组中
voidread_data()
{
FILE*fp;
inti,k;

k=0;
if((fp=fopen("D:\data.txt","r"))==NULL)//如果文件不存在
{
dd.count=0;
}
else
{
fread(&k,sizeof(int),1,fp);
dd.count=k;
for(i=0;i<k;i++)
{
fread(&dd.stu[i],sizeof(structstudent),1,fp);
}
fclose(fp);
}
}

//删除学生记录
voiddelete_data()
{
inti,k;
charno[10];
printf(" 请输入要删除学生的学号:");
scanf("%s",no);
k=-1;
for(i=0;i<dd.count;i++)
{
if(strcmp(dd.stu[i].no,no)==0)
{
k=i;
break;
}
}
if(k==-1)
{
printf(" 没有找到该学生(学号-%s)!",no);
}
else
{
//你没有写删除的操作啊
for(i=k;i<dd.count-1;i++) //将后面的数据前移一位
dd.stu[i]=dd.stu[i+1];
memset(&dd.stu[dd.count-1],0,sizeof(structstudent)); //将dd.stu[dd.count-1]数据置0
dd.count--;

save_data();
printf(" 删除学生(学号-%s)记录成功!",no);
}
}

//修改学生记录
voidedit_data()
{
inti,k;
charno[10],name[50];
printf(" 请输入要修改学生的学号:");
scanf("%s",no);
k=-1;
for(i=0;i<dd.count;i++)
{
if(strcmp(dd.stu[i].no,no)==0)
{
k=i;
break;
}
}
if(k==-1)
{
printf(" 没有找到该学生(学号-%s)!",no);
}
else
{
printf(" 请输入学生数据:");
printf(" 姓名");
printf(" -------------------------------------------------------------------- ");
scanf("%s",name);
strcpy(dd.stu[k].name,name);
save_data();
printf(" 修改学生记录(学号-%s)成功!",no);
}
}

//查询学生成绩(学号)
voidquery_data_no()
{
inti,k;
charno[10];
printf(" 请输入要查询学生的学号:");
scanf("%s",no);
k=-1;
for(i=0;i<dd.count;i++)
{
if(strcmp(dd.stu[i].no,no)==0)
{
printf(" 学号 姓名 数学 英语 物理");
printf(" ----------------------------------------------------------------- ");
k=i;
printf("%s %s %-7.1f %-7.1f %-7.1f ",dd.stu[i].no,dd.stu[i].name,dd.stu[i].math,dd.stu[i].eng,dd.stu[i].phy);
break; // 学号应该是唯一的,找到了一个就代表以后的没有了。
}
}
if(k==-1)
{
printf(" 没有找到该学生(学号-%s)!",no);
}
}

//查询学生成绩(姓名)
voidquery_data_name()
{
inti,k;
charname[10];
printf(" 请输入要查询学生的姓名:");
scanf("%s",name);
k=-1;
for(i=0;i<dd.count;i++)
{
if(strcmp(dd.stu[i].name,name)==0)
{
printf(" 学号 姓名 数学 英语 物理");
printf(" ----------------------------------------------------------------- ");

k=i;
printf("%s %s %-7.1f %-7.1f %-7.1f ",dd.stu[i].no,dd.stu[i].name,dd.stu[i].math,dd.stu[i].eng,dd.stu[i].phy);
break;
}
}
if(k==-1)
{
printf(" 没有找到该学生(姓名-%s)!",name);
}
}

//排序(学号)
voidsort_data_no(structdataBuff)
{
inti;
intj;
intk;
inth;
structstudenttemp;
FILE*fp;
if((fp=fopen("D:\data.txt","w+"))==NULL)
{
printf("cannotopenfile! ");
exit(0);
}
printf("请输入要查询的科目:1-数学,2-英语,3-物理:");
scanf("%d",&k);

switch(k)
{
case1:
for(i=0;i<Buff.count-1;i++)
for(j=i+1;j<Buff.count;j++)
if(Buff.stu[i].math>Buff.stu[j].math)
{
temp=Buff.stu[i];
Buff.stu[i]=Buff.stu[j];
Buff.stu[j]=temp;
}
printf("名次 学号 姓名 数学 ");
for(i=0;i<Buff.count;i++)
printf("%d %s %s %-7.1f ",i+1,Buff.stu[i].no,Buff.stu[i].name,Buff.stu[i].math);
break;
case2:
for(i=0;i<Buff.count-1;i++)
for(j=i+1;j<Buff.count;j++)
if(Buff.stu[i].eng>Buff.stu[j].eng)
{
temp=Buff.stu[i];
Buff.stu[i]=Buff.stu[j];
Buff.stu[j]=temp;
}
printf("名次 学号 姓名 英语 ");
for(i=0;i<Buff.count;i++)
printf("%d %s %s %-7.1f ",i+1,Buff.stu[i].no,Buff.stu[i].name,Buff.stu[i].eng);
break;
case3:
for(i=0;i<Buff.count-1;i++)
for(j=i+1;j<Buff.count;j++)
if(Buff.stu[i].phy>Buff.stu[j].phy)
{
temp=Buff.stu[i];
Buff.stu[i]=Buff.stu[j];
Buff.stu[j]=temp;
}
printf("名次 学号 姓名 物理 ");
for(i=0;i<Buff.count;i++)
printf("%d %s %s %-7.1f ",i+1,Buff.stu[i].no,Buff.stu[i].name,Buff.stu[i].phy);
break;
default:
printf("输入错误!");
exit(0);
}

printf("请按任意键继续....");
getch();

fclose(fp);
}

//主函数
voidmain()
{
intfun;
dd.count=0;
read_data();
menu();
while(1)
{
printf("请输入功能号[0-7]:");//这里不需要什么&fun,
scanf("%d",&fun);
switch(fun)
{
case1:view_data();break;//查看所有学生信息
case2:add_data();break;//输入学生记录
case3:delete_data();break;//删除学生记录
case4:edit_data();break;//修改学生记录
case5:query_data_no();break;//查询学生成绩(学号)
case6:query_data_name();break;//查询成学生绩(姓名)
case7:sort_data_no(dd);break;//查看成绩排序(学号)//直接将结构体dd发送过去就可以了
case0:break;//退出
}
if(fun==0)break;
to_menu();
}

return;
}
热点内容
哪里有安卓开发外包 发布:2024-12-14 11:36:48 浏览:303
腾讯云云服务器登录失败 发布:2024-12-14 11:22:40 浏览:139
linux文件夹路径 发布:2024-12-14 11:21:11 浏览:526
为什么登录个税总说我密码错误 发布:2024-12-14 11:11:59 浏览:626
红米如何root安卓手机 发布:2024-12-14 11:06:08 浏览:593
access数据库读写 发布:2024-12-14 11:06:05 浏览:908
安卓手机发烫是什么引起的 发布:2024-12-14 11:03:15 浏览:735
三星安全文件夹里的文件在哪里 发布:2024-12-14 11:01:03 浏览:355
服务器如何做域名转发 发布:2024-12-14 10:51:56 浏览:158
java对话框选择 发布:2024-12-14 10:51:22 浏览:295