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;
}
熱點內容