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 ループは同じ名前を持つ 3 つの配列エントリすべてを表示します (3 番目のエントリの値は正しいですが、 1 番目と 2 番目のエントリの値フィールドには、3 番目のエントリの正しい値の半分が含まれます)

ありがとう!

4

1 に答える 1

1

から返される値はstrtok()の要素を指すため、curLineの配列内のすべてのエントリは のstruct要素を指し、 をcurLine呼び出すたびに上書きされますfgets()(現在の繰り返しでのみ有効です)。

おそらく以下を使用しstrtok()て、から返された値のコピーを作成する必要があります。whilestrdup()

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);
}
于 2012-05-15T16:34:09.773 に答える