C读取一个文件,逐行到向量

问题描述 投票:0回答:2

我刚开始用C编码。我已经实现了一个向我追加字符串时似乎正在工作的向量,但是一旦我从文件中读取,我似乎一次又一次得到最后一个字符串。从我可以看到它似乎它使用相同的地址,因此我一次又一次得到相同的线。

但我似乎无法找到问题的解决方案,希望你能帮忙。

这是我的矢量结构:

void vector_init(Vector *vector){
    vector -> size = 0;
    vector -> capacity = 20;
    vector -> data = malloc(sizeof(void *) * vector -> capacity);

}

并附加到矢量:

void vector_push(Vector *vector, void *value){
    vector_double_capacity(vector);
    vector -> data[vector -> size ++] = value;
}

这是我在主要功能中所做的事情:

int main(int argc, char *argv[]) {

    Vector someVector;
    vector_init(&someVector);

    FILE *fp;
    void *line = NULL;
    size_t len = 0;
    fp = fopen(argv[1], "r");

    if (fp == NULL)
        exit(EXIT_FAILURE);

    while (getline(&line, &len, fp) != -1){
        vector_push(&someVector, line);
    }

    fclose(fp);
    printf("\n");

    vector_push(&someVector, "blah");
    vector_push(&someVector, "test");
    vector_push(&someVector, "some random txt");
    vector_push(&someVector, "yollo");
    vector_push(&someVector, "something");

    for (int i = 0; i < someVector.size; i++)
        printf("\nvalue is : %s", (char *) vector_get_element(&someVector, i));

    return 0;
}

我的get_element函数:

void *vector_get_element(const Vector *vector, size_t index){
    if (index >= vector -> size || index < 0){
        printf ("Index %d out of bounds", (int) index);
    }
    return vector -> data[index];
}

这是我的输出:

value is : terminal
value is : terminal
value is : terminal
value is : terminal
value is : blah
value is : test
value is : some random txt
value is : yollo
value is : something
Process finished with exit code 0
c file vector
2个回答
0
投票

您需要复制添加到矢量中的数据。

void vector_push(Vector *vector, void *value, size_t bytes){
    vector_double_capacity(vector);
    void *copy = malloc(bytes);
    memcpy(copy, value, bytes);
    vector -> data[vector -> size ++] = copy;
}

你必须用类似的东西来称呼它

vector_push(&someVector, line, 1 + strlen( line ) );

保持向量的明显目的是保持指向任何类型的数据而不仅仅是NUL终止的字符串。您可能还想在结构中添加size字段,以便了解指向的数据量。


0
投票

我发现了另一个简单的方法。

while (getline(&line, &len, fp) != -1){
   vector_push(&someVector, line);
}

line = NULL;

通过将line设置为NULL

© www.soinside.com 2019 - 2024. All rights reserved.