//*****************************
typedef
struct
student
/*定义数据结构*/
{
int
num
char
name[11]
int
score[4]
struct
student
*next
}lklist
//*******************************
int
read_f(lklist
*head)
/*
没有数据则返回0,有数据则返回1
*/
{
lklist
*temp,*p=head
FILE
*stu_f
if((stu_f=fopen("student.dat","rb+"))==NULL)
{
return(0)
}
else
{
temp=(lklist
*)malloc(sizeof(lklist))
while(fscanf(stu_f,"%5d%11s%6d%6d%6d%6d",&temp->num,temp->name,&temp->score[0],&temp->score[1],&temp->score[2],&temp->score[3])!=EOF)
{
p->next=temp
temp->next=NULL
p=temp
temp=(lklist
*)malloc(sizeof(lklist))
}
fclose(stu_f)
free(temp)
return(1)
}
}
//*******************************
int
save_f(lklist
*head)
/*
head为头指针储存失败返回0,成功返回1
*/
{
lklist
*temp
FILE
*stu_f
if((stu_f=fopen("student.dat","wb+"))==NULL)
{
return(0)
}
else
{
temp=head->next
while(temp!=NULL)
{
fprintf(stu_f,"%5d%11s%6d%6d%6d%6d",temp->num,temp->name,temp->score[0],temp->score[1],temp->score[2],temp->score[3])
temp=temp->next
}
fclose(stu_f)
return(1)
}
}
C 结构体
实现读取文件并保存到结构体代码:
#include<stdio.h>
#include<stdlib.h>
//文件 *** 作格式化读取保存到结构体数组
#defineBUFSIZE1000
structdata
{
charG[4];
floatXs;//起点坐标
floatYs;
floatE;
};
intmain()
{
FILE*fp;
inti,j,r_n=0;
charbuf[BUFSIZE],c;
//打开文件
fp=fopen("E:\\line.txt","r");
if(fp==NULL)
{
printf("Cannotopenfile!\n");
return1;
}
//计算文件中数据的行数
while(!feof(fp))
{c=fgetc(fp);
if(c=='\n')
r_n++;
}
printf("r_n=%d\n",r_n);
rewind(fp);//将指针重置到第一行
structdata*line1=NULL;
line1=(structdata*)malloc(sizeof(structdata)*(r_n+1));//创建一个结构体含有(r_n+1)个数据
for(i=1;i<=r_n;i++)
{
fgets(buf,BUFSIZE,fp);//一次读取一行
sscanf(buf,"%sX%fY%fE%f",&line1[i].G,&line1[i].Xs,&line1[i].Ys,&line1[i].E);//分别跳过XYE读取数据
}
//关闭文件
fclose(fp);
for(i=1;i<=r_n-1;i++)
{
printf("\n%s%.3f%.3f%.3f",line1[i].G,line1[i].Xs,line1[i].Ys,&line1[i].E);
}
free(line1);//释放
return0;
}
运行效果:
扩展资料:函数sscanf(),它是C语言中从一个字符串中读进与指定格式相符的数据的函数。
函数原型:
intsscanf(stringstr,stringfmt,mixedvar1,mixedvar2...);
intscanf(constchar*format[,argument]...);
sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。
其中的format可以是一个或多个{%[*][width][{h|l|I64|L}]type|''|'\t'|'\n'|非%符号}
注:
1、*亦可用于格式中,(即%*d和%*s)加了星号(*)表示跳过此数据不读入.(也就是不把此数据读入参数中)
2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。
3、width表示读取宽度。
4、{h|l|I64|L}:参数的size,通常h表示单字节size,I表示2字节size,L表示4字节size(double例外),l64表示8字节size。
5、type:这就很多了,就是%s,%d之类。
6、特别的:%*[width][{h|l|I64|L}]type表示满足该条件的被过滤掉,不会向目标参数中写入值
支持集合 *** 作:
%[a-z]表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)
%[aB']匹配a、B、'中一员,贪婪性
%[^a]匹配非a的任意字符,贪婪性
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)