Nruonan 2023-05-19 22:27 采纳率: 0%
浏览 25

c读取txt到结构体数组,结果输出全为0

c读取txt到结构体数组,结果输出全为0

FILE *data ;
    int i=0;
    char line[100];
    
    struct Player players[MAX];
    if((data=fopen("Player_Info.txt","r"))==NULL){
        printf("can not open file\n");
        return ;
    }
    // 跳过前4行
    for (int j = 0; j < 4; j++) {
        fgets(line, sizeof(line), data);
    }
    while (i<=100) {
       
                 sscanf(line, "%d        %s   %d        %d        %d        %d        %d        %d        %d        %d        %d        %d        %d",
              &players[i].id, players[i].name, &players[i].gender,
               &players[i].scores[0], &players[i].scores[1],
               &players[i].scores[2], &players[i].scores[3],
               &players[i].scores[4], &players[i].scores[5],
               &players[i].scores[6], &players[i].scores[7],
               &players[i].scores[8], &players[i].scores[9]);
               
        i++;
    }

    fclose(data);
    // 输出读取到的数据
    for (int j = 0; j < i; j++) {
        printf("%d %s %d ", players[j].id, players[j].name, players[j].gender);
        for (int k = 0; k < 10; k++) {
            printf("%d ", players[j].scores[k]);
        }
        printf("\n");
    }

img

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-05-20 08:16
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    • 以下回答来自chatgpt:

      针对问题描述中的具体情境,参考资料中给出了两种解决方法:

      1. 将数据按行读取并写入到结构体数组中。
      2. 按照固定格式读取指定的数据,比如Marker #0后面的三个坐标信息。

      针对问题描述,我们可以从两个方向入手:

      1. 看看你的代码中是否存在问题,造成输出全是0的情况。
      2. 如果代码本身没有问题,考虑是不是从txt文件读取的数据格式不对,需要将数据按照一定的格式读取。

      下面会分别针对这两个方向给出建议和代码实现。

      方向一:检查代码是否存在问题

      如果你在代码中已经按照参考资料中的方式读取txt文件,并将读取的数据存储在结构体数组中,但是输出的结果全是0,那么可以考虑以下问题:

      1. 读取的数据是否为空?也就是说,读取的每个结构体数组元素中的数值是否为0,或者是没有读取到任何数据。
      2. 结构体数组中的数据是否被正确地存储?也就是说,读取的数据是否按照你所期望的方式存储在结构体数组中?

      解决方案:

      1. 首先,可以在结构体数组中输出每个元素中的数值,检查读取是否成功。如果成功,应该能够看到每个元素中有正确的数值。
      2. 确认结构体数组中的每个元素的变量名与txt文件中的每个数据列对应。如果存在不对应的情况,需要更改代码,保证读取到的数据能够正确地存储到结构体数组中。

      示例代码:

      #include<stdio.h>
      #include<stdlib.h>
      
      //定义一个结构体
      struct test{
          int num;
          double value;
      };
      
      int main(){
          int len=5;
          struct test mydata[len];
          FILE* fp;
          fp=fopen("test.txt","r");
          //确保文件读取成功
          if(fp==NULL){
              printf("无法读取文件!");
              return 0;
          }
          //循环读取数据并存储到结构体数组中
          for(int i=0;i<len;i++){
              fscanf(fp,"%d%lf",&mydata[i].num,&mydata[i].value);
              printf("第%d个元素中的num:%d,value:%lf\n",i,mydata[i].num,mydata[i].value);
          }
          fclose(fp);
          return 0;
      }
      

      方向二:处理txt文件中的数据格式

      如果你的代码实现看起来没有问题,但是输出的结果仍然全是0,那么可以考虑是不是读取的数据格式有问题,导致无法正确地存储到结构体数组中。比如,读取的数据没有按照你所期望的格式进行输出。

      如果你在读取txt文件时,遇到了像参考资料中描述的问题,需要按照固定格式读取指定的数据,那么可以采用参考资料中提供的方式进行处理。

      解决方案:

      1. 根据txt文件中数据的具体格式,采用fgets函数逐行读取数据,并使用sscanf函数对字符串进行解析。
      2. 确认sscanf函数的格式字符串与txt文件中数据的格式一致,否则可能导致数据读取失败。
      3. 使用数组或动态内存分配解决存储数据的问题。

      示例代码:

      #include<stdio.h>
      #include<stdlib.h>
      
      //定义一个包含3个坐标的结构体
      struct coordinate{
          double x;
          double y;
          double z;
      };
      
      int main(){
          //定义读取数据的变量
          char line[100];
          char label[30];
          char markers[5][30]={"","Marker#0:","Marker#1:","Marker#2:","Marker#3:"};
          double coord[3];
          int marker_idx=-1;
          //定义存储数据的数组或指针
          struct coordinate mydata[4];
          //动态分配内存的方式存储
          //struct coordinate* mydata=(struct coordinate*)malloc(sizeof(struct coordinate)*4);
          //打开文件,按行读取数据
          FILE* fp;
          fp=fopen("test.txt","r");
          //确保文件读取成功
          if(fp==NULL){
              printf("无法读取文件!");
              return 0;
          }
          while(fgets(line,100,fp)){
              //获取数据标签,判断是否为marker
              sscanf(line,"%s",&label);
              for(int i=1;i<=4;i++){
                  if(!strcmp(label,markers[i])){
                      marker_idx=i;  //记录当前marker的编号
                      break;
                  }
              }
              //如果当前标签为坐标数据,则解析该行数据并存储到数组中
              if(marker_idx>0){
                  sscanf(line,"%*s (%lf,%lf,%lf)",&coord[0],&coord[1],&coord[2]);
                  mydata[marker_idx].x=coord[0];
                  mydata[marker_idx].y=coord[1];
                  mydata[marker_idx].z=coord[2];
              }
          }
          fclose(fp);
          //输出读取到的数据
          for(int i=0;i<4;i++){
              printf("Marker #%d的三个坐标信息:(%lf,%lf,%lf)\n",i,mydata[i].x,mydata[i].y,mydata[i].z);
          }
          //释放动态分配的内存
          //free(mydata);
          return 0;
      }
      

      总结:

      1. C语言读取txt文件需要用到的库函数包括fopen、fgets、fscanf和sscanf等。
      2. 在读取数据时,根据数据的具体格式和存储方式选择最合适的读取方式。
      3. 确保读取数据的存储变量和txt文件中的数据类型和格式一致。

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 5月19日

悬赏问题

  • ¥15 matlab做ba模型让其在ba和er规则下生长
  • ¥50 有偿!centos curl port设置问题
  • ¥15 请问Quartus的Verilog代码怎么写?
  • ¥100 Mac 版foxmail 收邮件问题
  • ¥15 QWebEngineView
  • ¥15 如何使用shufflenet进行手写数字识别
  • ¥20 微信小程序播放直播流
  • ¥15 关于迷宫自走单片机循迹小车的知识
  • ¥15 python使用selenium工具爬取网站的问题
  • ¥15 visual studio中c语言用ODBC链接SQL SERVER