c语言文件读取到结构体。。

c语言文件读取到结构体。。,第1张

给你个例子,这是我以前写的。

//*****************************

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的任意字符,贪婪性


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11460807.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存