我有一个简单的格式文件
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循环显示所有三个具有相同名称的数组条目(该值对于第三个条目是正确的但是对于第一个和第二个条目,值字段包含第三个条目的正确值的一半)
谢谢!
答案 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);
}