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

时间:2012-05-15 16:31:16

标签: c struct

我有一个简单的格式文件

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循环期间显示正确的东西,因为它继续,但是在它完成之后fo​​r循环显示所有三个具有相同名称的数组条目(该值对于第三个条目是正确的但是对于第一个和第二个条目,值字段包含第三个条目的正确值的一半)

谢谢!

1 个答案:

答案 0 :(得分:1)

strtok()返回的值将指向curLine中的元素,因此struct数组中的所有条目都将指向curLine中的元素每次调用fgets()都会覆盖它(并且只对当前迭代有效)。

您应该在strtok()期间复制while期间返回的值,可能使用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);
}