2

ファイルからコンマで区切られたいくつかの値を読み取る C で関数を作成しようとしています。各行には 4 つの値があり、最後の値は整数であり、それらを割り当てられたスペースに配置したいと考えています。while ループでメモリから読み込もうとすると問題ありませんが、for ループまたは関数の外部からは、ファイルの最後の行だけを複数回取得します。私はCが初めてですが、strtok()関数と関係があると思います。

これが私のコードです:

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

    typedef struct {
        char * foo;
        char * bar;
        char * baz;
        int qux;
    }structure;

    char * readFile(const char * filename, structure * array){
        const int maxstring=100;
        FILE * fr=fopen(filename,"r");
        char * rc;
        char buf[maxstring];
        while(( rc = fgets(buf, maxstring, fr) )) {
            array->foo=strtok (buf,",");
            array->bar=strtok (NULL,",");
            char *aux=strtok (NULL,",");
            array->qux=atol(strtok (buf,","));
            array->baz=strtok(aux,"\n");
            printf("%s,%s,%s,%d\n",array->foo,array->bar,
            array->baz,array->qux);
            array++;
        }
        array=array-9;
        for (int i=0;i<10;i++){
            printf("%s,%s,%s,%d\n",array->foo,array->bar,
            array->baz,array->qux);
            array++;
        }
        return "Success";
    }


    int main(){
        structure * array=malloc(100*sizeof(structure));
        readFile("repository.txt",array);
        free(array);
        return 0;
    }
4

1 に答える 1

5

問題は、によって返されたポインターを格納していることですstrtok。この関数は、元の buffer のメモリ内のポインター、つまり内のstrtokポインターを返します。そして、各反復で上書きします(経由)。bufbuffgets

この問題を解決する最も簡単な方法は、strdupによって返される値を使用することstrotkです。

char * p = strtok (buf,",");
if (p)
    array->foo = strdup(p);

あなたが保管している他のものについても同じことが言えます。それらを使い終わったら、電話することを忘れないfreeでください。

于 2013-03-03T21:41:23.887 に答える