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 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵