鱼C论坛

 找回密码
 立即注册
查看: 1936|回复: 4

求助大佬们一个fscanf()有关的问题

[复制链接]
发表于 2021-3-11 12:05:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. typedef struct date
  4. {
  5.     int day;
  6.     int month;
  7.     int year;
  8. };//结构体名的定义 自定义类型符

  9. typedef struct student
  10. {
  11.     int num;
  12.     char name[20];
  13.     struct date birthday;

  14. }studnet;
  15. struct student *pstu;
  16. student stu;
  17. pstu = &stu;



  18. void FindByNum()
  19. {
  20.     FILE *fp;
  21.     int num;
  22.     int find = 0;
  23.     printf("按学号查找数据:");
  24.     fp = fopen("C:\\Users\\yyp\\Desktop\\t4.txt","r+");
  25.     if(fp == 0)
  26.     {
  27.         printf("Error!\n");
  28.         exit(0);
  29.     }
  30.     else
  31.     {
  32.         printf("请输入学号:\n");
  33.         scanf("%d",&num);
  34.     }
  35.     while(!feof(fp))
  36.     {
  37.         fscanf(fp,"%d%s%d%d%d\n",&pstu->num,pstu->name,&pstu->birthday.year,&pstu->birthday.month,&pstu->birthday.day);
  38.         if(num == pstu->num)
  39.         {
  40.             printf("学号:%d\n",pstu->num);
  41.             printf("名字:%s\n",pstu->name);
  42.             printf("生日:%d-%d-%d\n",pstu->birthday.year,pstu->birthday.month,pstu->birthday.day);
  43.             printf("\n");
  44.             find = 1;
  45.         }
  46.     }
  47.     if(!find)
  48.     {
  49.         printf("查无此人!\n");
  50.     }
  51.     fclose(fp);


  52. }
复制代码



代码如上,不明白的地方就是输入了一个学号之后,因为有个!feof(fp),所以fscanf()会持续执行到文件最后,也就是把所有的数据存储到结构体之中,

那找的话应该是怎么操作?下面再判断if ,加入输入的学号存在相等,那么输出的怎么保证是对应这个学号的信息呢。这里是书上的一个学生信息系统,有点懵
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-3-11 12:31:55 | 显示全部楼层
         这个文件是分行的,每行一个记录,fscanf() 会每次一行地逐行读取文件数据,当这个条件
  1.         if(num == pstu->num)
复制代码

         得到满足的时候,那么,就足以肯定,这条记录一定是这个学号学生的信息。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-11 17:49:52 From FishC Mobile | 显示全部楼层
jackz007 发表于 2021-3-11 12:31
这个文件是分行的,每行一个记录,fscanf() 会每次一行地逐行读取文件数据,当这个条件

       ...

fscanf不应该是把数据存储到结构体之中吗?那根据while代码,不是所有的都存储完毕,才执行if语句吗,我是这样想的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-11 18:22:27 | 显示全部楼层
  1. while(!feof(fp))
  2.     {
  3.         fscanf(fp,"%d%s%d%d%d\n",&pstu->num,pstu->name,&pstu->birthday.year,&pstu->birthday.month,&pstu->birthday.day);
  4.         if(num == pstu->num)
  5.         {
  6.             printf("学号:%d\n",pstu->num);
  7.             printf("名字:%s\n",pstu->name);
  8.             printf("生日:%d-%d-%d\n",pstu->birthday.year,pstu->birthday.month,pstu->birthday.day);
  9.             printf("\n");
  10.             find = 1;
  11.         }
  12.     }
复制代码


fscanf遇到空格和换行结束 ,所以指挥读取到一名学生的信息
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-11 19:53:16 From FishC Mobile | 显示全部楼层
547658697 发表于 2021-3-11 18:22
fscanf遇到空格和换行结束 ,所以指挥读取到一名学生的信息

所以这就是那个换行符的作用吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-6 19:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表