c语⾔如何从⽂件中读取信息到链表——⽂件操作
写这篇博客原因:
c程序课设 忙的头昏脑涨,看了⼤量的博客。但是发现,⽂件操作这⽅⾯很少有简单易懂实⽤的博客。我作为⼤⼀新⽣,把⾃⼰学到的⼀点点⽂件操作功能分享⼀下。希望可以加快学者们的步伐。
源代码在最下⾯!
已更新代码 新加说明书界⾯ 修改信息功能及界⾯超帅
再次更新代码 新加了智能化功能
**1.读取⽂件信息到链表。 省去了⼿动输⼊的⿇烦
⽼师⼒推这个功能!!
2.删除读⼊的全部信息。**
与基本功能配套使⽤ 很完美
喔对了。系统可以使⽤特殊符号 记得⾃⼰尝试⼀下
还没学如何快速到达⾃⼰感兴趣的模块 不好意思。。。。
1.数据储存到⽂件
2.如何按格式读取⽂件想要的信息,常⽤于密码登录。
进⼊正题:
先看效果 是不是你们想要的。
这是写出后的两个⽂件对⽐;
左边是录⼊原数据,右边是排名计算后写⼊的数据。
上代码(可以先看下代码下⽅的分部解析)1.原始数据储存 功能函数
struct stu* p = p_Head;
char s[100]={"NAME\tNO.\t  sco1  sco2 sco3  sco4 sco5  sco6 sco7  sco8 sco9  sco10 \n"};
char s2[100]={"-----------------------------------------------------------------------------------\n"};
//打开⽂件
//定义⼀个⽂件指针p_file
FILE* p_File;//这⾥是⽂件结构体声明这⾥不展开。没有它不⾏
p_File =fopen("","w");
if(p_File ==NULL){
printf("打开⽂件失败\n");
return0;//exit (0);
}
else
//写⼊数据
{
fprintf(p_File,"%s", s);
fprintf(p_File,"%s", s2);
while(p!=NULL)
{
int i =0;
fprintf(p_File,"%s\t", p->name);
fprintf(p_File,"%d\t", p->rank);
for(i =0; i <10; i++)
{
fprintf(p_File,"%6.2f", p->score[i]);
}
fprintf(p_File,"\n");
p = p->p_next;
}
}
printf("本地保存成功\n");
//关闭⽂件
fclose(p_File);
}
⾸先看这个格式:如何实现?
先将你的格式写⼊字符串 ,⽤fprintf库函数先将你的格式所在的字符数组写⼊⽂件,然后在写⼊链表内容数据。(不⽤fwrite是因为这个是⼆进制写⼊ 写int 数据会乱码 所以没有深⼊了解)
2.排名后数据储存 功能函数
//打开⽂件
//定义⼀个⽂件指针p_file
FILE* p_File;//这⾥是⽂件结构体声明这⾥不展开。没有它不⾏
p_File =fopen("","w");
if(p_File ==NULL){
printf("打开⽂件失败\n");
return0;//exit (0);
}
else
printf("本地保存成功\n");
struct stu* p = p_Head;
char s[100]={"NAME\tNO.\t  sco1  sco2 sco3  sco4 sco5  sco6 sco7  sco8 sco9  sco10  average\n"};
char s2[100]={"---------------------------------------------------------------------------------------------\n"};
//写⼊数据
fprintf(p_File,"%s", s);
fprintf(p_File,"%s", s2);
while(p !=NULL)
{
int i =0;
fprintf格式fprintf(p_File,"%s\t", p->name);
fprintf(p_File,"%d\t", p->rank);
for(i =0; i <10; i++)
{
fprintf(p_File,"%6.2f", p->score[i]);
}
fprintf(p_File,"%6.2f\n", p->aver);
p = p->p_next;
}
//关闭⽂件
fclose(p_File);
}
这⾥的实现跟上⾯那个差不多
这个⽂件名要⾃⼰输⼊你的txt⽂件名**(txt⽂件与你的c语⾔代码源⽂件在⼀起哦!⼀个⼈多孤单!)**
⽂件⽐较乱哈哈
3.最后⼀个⽂件操作功能压轴出场:
⽂件写⼊后的读取,与密码登录系统有关。
如何正确读取你想要的数据呢。
看代码!
/* struct stu {
int rank;
char name[20];
float score[10];
float aver;
struct stu* p_next;
};
struct Stu {
int rank;
char name[20];
float score[10];
float aver;
};*/
//这⾥⽤的是第⼆个读取信息。
//第⼀个是链表节点
void Read_file(char name[])
{
int i;
struct Stu p_temp ={0," ",0,0};//这⾥⽤的是vs2019 如果代码不在⼀个⽂件内需要进⾏结构体定义;
FILE* fp;
char filename[30]={""};//z这⾥是要读取的⽂件名
if((fp =fopen(filename,"r+"))==NULL)//判断⽂件是否打开失败
{
printf("can not open!\npress any key to continue\n");
getchar();
exit(0);
}
else
{
int j;
//对⽂件读写操作⾏列。 for 循环⾏读取便读取边赋值结构体变量。
fseek(fp,173,0);//跳过开头
for(i =0; i<N; i++)
{
/
/这⾥⽐较笨拙读者看看有没有⽅法简化这⾥⽤fscanf 库函数注意 %f与f%之间是空格哦要注意这个问题写⼊⽂件的时候就是隔个空格写出格式要相同fscanf(fp,"%s %d %f %f %f %f %f %f %f %f %f %f %f\n",&p_temp.name,&p_temp.rank,&p_temp.score[0],&p_temp.score[1],&p_temp.score[2],&p_te mp.score[3],&p_temp.score[4],&p_temp.score[5],&p_temp.score[6],&p_temp.score[7],&p_temp.score[8],&p_temp.score[9],&p_temp.aver);
//是否到
//这⾥采⽤名字登录,读者可以升级为学号登录。
if(strcmp(p_temp.name, name)==0)
{
Menu_player();//这⾥是我⾃定义的界⾯函数可忽略
system("pause");//忽略
//这个是界⾯设置前⾯⼀半在主函数读者⾃⼰设计界⾯美化
//下⾯的printf 内的**      星号空格都是为了界⾯美化搞得可以不要
printf("**    姓名%s\t", p_temp.name);
printf("排名%d\t", p_temp.rank);
//⼗个评委的分数可不要
/*for (j = 0; j < 10; j++)
{
printf("%6.2f ", p_temp.score[j]);
}*/
printf("最终成绩:%6.2f      **\n", p_temp.aver);
printf("*************************************************\n");
printf("************--欢迎下年再来--*********************\n");
break;
}
}
//⽂件查相同姓名然后输出那⼀⾏内容
if(strcmp(p_temp.name, name)!=0)
printf("输⼊信息错误,或者未录⼊。");
system("pause");
system("cls");
fclose(fp);
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。