鱼C论坛

 找回密码
 立即注册
查看: 463|回复: 5

[已解决]文件操作1

[复制链接]
发表于 2020-6-5 09:09:26 | 显示全部楼层 |阅读模式

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

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

x
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define max 10
  4. typedef struct student stu;
  5. struct student
  6. {
  7.         char num[10];
  8.         char name [20];
  9.         int s1,s2,s3;
  10. };

  11. void Printmnue();
  12. void readdata(FILE *fp,stu s[max],int *n);
  13. void writedata(FILE *fp,stu[max],int n);


  14. int main()
  15. {

  16.         int choice;
  17.         int i,n;
  18.         stu s[max];
  19.         char yorn;
  20.         FILE *fp;
  21.         fp=fopen("学生信息.txt","r");
  22.         if(fp==NULL)
  23.         {
  24.         printf("文件打开失败\n");
  25.         exit (0);
  26.         }                                             
  27.         else
  28.                 readdata(fp,s,&n);
  29.         for(i=0;i<n;i++)
  30.         {
  31.         printf("%s %s %d %d %d\n",s[i].num ,s[i].name ,s[i].s1 ,s[i].s2 ,s[i].s3 );
  32.         }
  33. fclose(fp);
  34. while (1)
  35. {       
  36.         Printmnue();
  37.    printf("请输入你的选择(1-7)\n");
  38.   scanf("%d", &choice);
  39.   switch (choice)
  40.   {
  41.      case 1:
  42.            
  43.      break;
  44.      case 2:
  45.       break;
  46.      case 3:
  47.       break;
  48.      case 4:
  49.       break;
  50.      case 5:
  51.       break;
  52.      case 6:
  53.       break;
  54.      case 7:
  55.      {
  56.       exit(0);
  57.          break;
  58.      }
  59.   }
  60.      char YesOrNo;
  61.      YesOrNo =getchar() ;
  62.      if (YesOrNo == 'y' || YesOrNo == 'Y')
  63.       continue;
  64.      else
  65.       break;
  66. }
  67. system("pause");
  68.   return 0;

  69. }
  70. void Printmnue()
  71. {

  72. printf("1.添加学生数据\n");
  73. printf("2.删除数据\n");
  74. printf("3.排序\n");
  75. printf("4.成绩查询\n");
  76. printf("5.更改学生数据\n");
  77. printf("6.显示学生信息\n");
  78. printf("7.退出\n");
  79. }
复制代码



一个学生成绩系统的框架,学生信息数据已经在路径中提前保存好了,txt格式如下:
001 王一 98 99 85
002 王二 95 78 99
003 王三 85 86 88
004 王四 94 86 82

请问怎么调用函数readdata,能把数据对应读到结构体中,然后用printf函数打印出来呢?T T
最佳答案
2020-6-5 10:18:23
  1. ifstream ifs(_F_STOCK);        //输入方式打开文件

  2.         char buf[1024] = {0};
  3.         ls.clear();
  4.         //取出表头
  5.         ifs.getline(buf, sizeof(buf));

  6.         while(!ifs.eof())        //没到文件结尾
  7.         {
  8.                 student tmp;

  9.                 ifs.getline(buf, sizeof(buf));        //读取一行

  10.                 char *sst = strtok(buf, "|");        //以"|"分隔
  11.                 if(sst != NULL)
  12.                 {
  13.                         num = sst;
  14.                 }
  15.                 else
  16.                 {
  17.                         break;
  18.                 }

  19.                 sst = strtok(NULL, "|");
  20.                 tmp.name = sst;        //名字

  21.                 sst = strtok(NULL, "|");
  22.                 tmp.s1 = atoi(sst);       

  23.                 sst = strtok(NULL, "|");
  24.                 tmp.s2 = atoi(sst);
  25.                
  26.                 sst = strtok(NULL, "|");
  27.                 tmp.s3 = atoi(sst);

  28.                 ls.push_back(tmp);        //放在链表的后面
  29.         }
复制代码


这是我以前写的读取文件,你可以试着参考一下,我文件里各项是用“|”分隔的,所以strtok里的第二个参数是“|”,你的是空格,所以用空格就行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-5 09:23:01 | 显示全部楼层
void readdata(FILE *fp,stu s[max],int *n)
{
    for(int i=0;fscanf(fp,"%s%s%d%d%d",s[i].num,s[i].name,s[i].s1,s[i].s2,s[i].s3)!=EOF&&i<10;i++)
    ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-5 09:23:56 | 显示全部楼层
看一下这个吧https://blog.csdn.net/xiaopang_yan/article/details/51956405,我也不太清楚,文件我不太懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-5 09:29:52 | 显示全部楼层
每一条记录的区分都是以'\n'为准的,字段与字段间也是通过空格划分的;
整个文件结束以EOF为标志。
所以思路可以通过文件内容中换行符的判断实现每条记录读取,通过空格【或换行符(单条记录最后一个字段)或结束符EOF(最后那个可能是EOF)]判断单个字段的长度,
写入对应结构体即可,还有注意点:数值如果是字符型就需要进行一定手段转换;比如通过数组暂存然后按位取出按照ASCII码转换,按权相加再赋值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-5 10:18:23 | 显示全部楼层    本楼为最佳答案   
  1. ifstream ifs(_F_STOCK);        //输入方式打开文件

  2.         char buf[1024] = {0};
  3.         ls.clear();
  4.         //取出表头
  5.         ifs.getline(buf, sizeof(buf));

  6.         while(!ifs.eof())        //没到文件结尾
  7.         {
  8.                 student tmp;

  9.                 ifs.getline(buf, sizeof(buf));        //读取一行

  10.                 char *sst = strtok(buf, "|");        //以"|"分隔
  11.                 if(sst != NULL)
  12.                 {
  13.                         num = sst;
  14.                 }
  15.                 else
  16.                 {
  17.                         break;
  18.                 }

  19.                 sst = strtok(NULL, "|");
  20.                 tmp.name = sst;        //名字

  21.                 sst = strtok(NULL, "|");
  22.                 tmp.s1 = atoi(sst);       

  23.                 sst = strtok(NULL, "|");
  24.                 tmp.s2 = atoi(sst);
  25.                
  26.                 sst = strtok(NULL, "|");
  27.                 tmp.s3 = atoi(sst);

  28.                 ls.push_back(tmp);        //放在链表的后面
  29.         }
复制代码


这是我以前写的读取文件,你可以试着参考一下,我文件里各项是用“|”分隔的,所以strtok里的第二个参数是“|”,你的是空格,所以用空格就行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-5 10:20:06 | 显示全部楼层
上面那个是在我原来的代码的基础上按你的需求改了一下内容,但不是完全适用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 01:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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