endenvfirst 2022-03-20 09:29 采纳率: 100%
浏览 63
已结题

为什么fscanf不能把数据读到结构体中去,求解答

#include"stdio.h"
typedef struct Stu
{
int no;
char name[6];
int grade;
}sstu,*psstu;

int main(int argc, char const *argv[])
{
FILE *in,*out;
char str[100];
int n,i,sum=0;
float ave;
while ((in=fopen("a.txt","r+"))==NULL)
{
printf("不能打开源文件\n");
}
while ((out=fopen("b.txt","w+"))==NULL)
{
printf("不能打开目标文件\n");
}
while (fgets(str,100,in))
{
fputs(str,out);
}
fseek(in,0,2);
n=ftell(in);
printf("%d\n",n);
printf("%d\n",sizeof(struct Stu));
n=n/sizeof(struct Stu);
printf("有%d个学生的数据\n",n);
struct Stu t[n];
for(i=0;i<n;i++)
{
fscanf(in,"%d %s %d",&t[i].no,t[i].name,&t[i].grade);
}
for ( i = 0; i < n; i++)
{
printf("%d\t",t[i].grade);
}
for ( i = 0; i < n; i++)
{
sum=sum+t[i].grade;
}
ave=sum/n;
printf("平均成绩是%d",ave);
fclose(in);
fclose(out);
return 0;
}

txt文件的格式是这样的:
3011 张三 91
3012 李四 96
3013 王五 98
3014 赵六 55

  • 写回答

2条回答 默认 最新

  • 九月de️云 2022-03-20 10:31
    关注
    1. 通过文件大小(字节数)来判断记录个数是不正确的,这对文件格式要有非常严格的要求,比如姓名都是2个字,分数不能是100分或低于10分(占用字节数不一样,导致每条记录大小不一样)
    2. struct Stu 的大小包含了一些padding 的大小,大小应该是4+8+4 = 16个字节,所以用文件大小/sizeof(struct Stu)很难得到正确的记录数
    3. 可以通过读文件有多少行来判断有多少个记录,然后对每次读入的一行进行sscanf
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月28日
  • 已采纳回答 3月20日
  • 创建了问题 3月20日

悬赏问题

  • ¥15 ecplise在连接数据库时显示加载驱动成功但是数据库连接失败
  • ¥15 visionmaster启动失败,提示为“机器不满足授权而被禁用”
  • ¥50 用logisim设计16位单时钟周期cpu
  • ¥15 IDEA中圈复杂度如何具体设置
  • ¥50 labview采集不了数据
  • ¥15 Multisim红外倒车雷达仿真中距离问题
  • ¥15 请上面代码做什么处理或什么混淆
  • ¥15 英雄联盟自定义房间置顶
  • ¥15 W5500网线插上无反应
  • ¥15 如何用字典的Key,显示在WPF的xaml中