如何将字符串和浮点数从文件存储到结构体?

问题描述

我正在尝试将字符串和浮点数从文件存储到结构体。我已经设法将浮点数存储到结构中,但字符串的工作方式不一样。

我的文件看起来像这样

Names                 weight(kg)
John Smith            56.5
Joe                   59.75
Jose                  60.0

输出

Jose                  56.5
Jose                  59.75
Jose                  60.0

这是我的代码

#include<stdio.h>
#include<stdlib.h>
#include<cs50.h>
#include<string.h>

typedef struct
{
    string name;
    float weight;

}People;

int main(void)
{
    FILE *fp1;
    fp1 = fopen("file.txt","r");

    people person[255];

    if(!fp1)
    {
        printf("ERROR opening FILE");
        exit(1);
    }
    else
    {
        // store names and weights in person.name and person.weight from file 1
        get_nameAndWeight(fp1,person);
        for (int i = 0; i < 6; i++)
        {
            printf("%s\t%.2f\n",person[i].name,person[i].weight);
        }
    }

}

void get_nameAndWeight(FILE *fp,people array[])
{
    char cur_line[255],*token;
    float weight;
    int i = 0;

    while(!feof(fp))
    {
        fgets(cur_line,sizeof(cur_line),fp);
        if(i == 0)
        {
            i++;
        }
        else
        {
            token = strtok(cur_line,"\t\n ");
            while (token != NULL)
            {
                if(atof(token) != 0)
                {
                    array[i-1].weight = atof(token);
                }

                else
                {
                    array[i].name = token;
                }
                token = strtok(NULL,"\t\n ");
            }
            i++;
        }
    }
}


我的代码有什么问题?还有其他方法可以做到这一点吗?

解决方法

请注意,strtok 不会分配任何新内存,它会修改您传入的数组。因此您的所有对象都指向同一个数组 cur_line

您应该使用 strdup() 或一些类似的函数为名称分配新的内存。类似的东西:

array[i].name = strdup(token);
,

例如你应该使用 strcpy !

你不能在 c 中只将一个字符串赋值给一个变量。您需要将源的每个字符复制到目标字符串。

我猜 strtok 返回一个 char*,所以这个 char* 是你的来源,而 name 是你的目的地。查看 strcpy 手册。

我猜你有以下 cs50 类,所以如果我没记错的话,你不必处理分配问题。 尽管如此,为您接下来的练习检查 malloc 和 strdup 函数是相关的;)