c语言,怎么从文件读取数据到结构体,求助

下面是代码
include <stdio.h>#include <stdlib.h>#include<string.h>#define N 100//定义宏(学生人数)方便后面引用#define M 2//课程数目int choice,i,j,number;//定义全局变量FILE *fp;struct student//定义全局结构体数组{ char name[20];//姓名 int num;//学号 char sex;//性别 char classes[5];//班级 int score[M];//各科成绩}stu[N];void in();void desktop();void desktop()//初始界面,实现人机交互{ printf("****************************\n"); printf("欢迎进入C语言课程管理系统\n"); printf("1.学生信息系统\n"); printf("2.出勤登记系统\n"); printf("3.作业提交系统\n"); printf("4.成绩管理系统\n"); printf("5.系统退出\n"); printf("请输入要进入的子系统序号:\n");
}int main(){ desktop(); scanf("%d",&choice); switch(choice) { case 1:in();break; default:printf("enter data error!\n"); } return 0;}void in(){ if((fp=fopen("information.txt","r+"))==NULL) { printf("文件打开出错啦\n"); exit(0); } printf("姓名 学号 性别 班级 工数 电路\n"); i=0; while(!feof(fp))//从文件中读取数据到结构体 { fscanf(fp,"%s%d%c%s%d%d",stu[i].name,&stu[i].num,&stu[i].sex,stu[i].classes,&stu[i].score[0],&stu[i].score[1]); i++; } fclose(fp);
for(j=0;j<i;j++) { printf("%s%d%c%s%d%d\n",stu[j].name,stu[j].num,stu[j].sex,stu[j].classes,stu[j].score[0],stu[j].score[1]); }}
有txt文本,存者三个人的信息

然后我运行出来的就是这样了,求大神指导

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

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-12-16
while(!feof(fp)) { //从文件中读取数据到结构体
    fscanf(fp,"%s%d%s%d%d",stu[i].name,&stu[i].num,&stu[i].sex,stu[i].classes,
    &stu[i].score[0],&stu[i].score[1]);
    i++;
}

information.txt格式:

小红 2014003 女 一班 99 100  // 数据间用空格隔开

...............................................

追问

我把姓名和学号的顺序换了,为什么就无法输出呢?

就是什么也没有输出.

追答struct student { //定义全局结构体数组
    char name[20];//姓名
    int num;//学号
    char sex[3];     // 一个汉字需要2个字节,再给'\0'预留一个字节的空间
    char classes[5];
    double score[M]; // 成绩是浮点数,这里改为double类型
}stu[N];
while(!feof(fp)) { //从文件中读取数据到结构体
    // 注意下面的格式与你新给的文件格式是对应的,请复制粘贴
    fscanf(fp,"%d%s%s%s%lf%lf",stu[i].name,&stu[i].num,stu[i].sex,stu[i].classes,
    &stu[i].score[0],&stu[i].score[1]);
    i++;
}

本回答被提问者和网友采纳
相似回答