首页 文章

从文件中读取并存储到结构数组中

提问于
浏览
0

我有一个简单的格式文件

NAME|VALUE
NAME|VALUE
NAME|VALUE

我试图读取这些,并将它们存储在一个结构数组中,结构就是这样

struct data
{
    char* name;
    char* value;
};

现在,我知道数组的大小将是3,所以我这样做了:

struct data pairs[3];

这是我的代码,因为我试图从文件中读取它:

char *tempVal;
int i =0;
    if(file != NULL)
        {
            char curLine [128];
            while(fgets(curLine, sizeof curLine, stockFile) != NULL)
            {   

                tempVal = strtok(curLine,"|");
                printf("i:%i\n",i);
                pairs[i].name= tempVal;
                printf("name at pos %i is %s\n",i, pairs[i].name);
                tempVal = strtok(NULL,"|");
                pairs[i].value= tempVal;
                printf("value at pos %i is %s\n",i, pairs[i].value);
                ++i;
            }
            fclose(file);
        }

并且每个printf语句都会打印出正确的东西,然后我尝试用这个打印数组

int j
for(j = 0; j < 3; j++)
    {   

        printf("ENTRY# %i\NAME:%s\VALUE:%s\n\n",j,pairs[j].name, pairs[j].value);
    }

对不起,缩进有点奇怪,尝试搞乱代码块,但无法让它完美 . 但是,我想知道为什么它在while循环中显示正确的东西,因为它继续,但是在它完成之后for循环显示所有三个具有相同名称的数组条目(该值对于第三个条目是正确的但是对于第一个和第二个条目,值字段包含第三个条目的正确值的一半)

谢谢!

1 回答

  • 1

    strtok() 返回的值将指向 curLine 中的一个元素,因此 struct 数组中的所有条目都将指向 curLine 中的一个元素,该元素会在每次调用 fgets() 时被覆盖(并且仅对当前迭代有效) .

    您应该在 while 期间复制 strtok() 返回的值,可能使用 strdup()

    while(fgets(curLine, sizeof curLine, stockFile) != NULL)
    {   
        tempVal = strtok(curLine,"|");
        printf("i:%i\n",i);
        pairs[i].name = strdup(tempVal);
        printf("name at pos %i is %s\n",i, pairs[i].name);
        tempVal = strtok(NULL,"|");
        pairs[i].value = strdup(tempVal);
        printf("value at pos %i is %s\n",i, pairs[i].value);
        ++i;
    }
    

    free() 以后不再需要时:

    for (j = 0; j < 3; j++)
    {
        free(pairs[j].name);
        free(pairs[j].value);
    }
    

相关问题