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

不知道你这个问题是否已经解决, 如果还没有解决的话:

  • 以下回答来自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文件中的数据类型和格式一致。

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

这么改,供参考:

void readfile()
{
    FILE *data ;
    int  i = 0;
    char line[1024]={0}; //修改
    struct Player players[MAX];

    if((data=fopen("Player_Info.txt","r"))==NULL){
        printf("can not open file\n");
        return ;
    }
    // 跳过前4for (int j = 0; j < 4; j++) {
        fgets(line, sizeof(line), data);
    }
    while (i<=100) {
        for (int j = 0;j < 1024; j++)  line[j] = 0;
        if (fgets(line, sizeof(line), data) == NULL)  break;
        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");
    }
}