C逐行读取文件到向量

时间:2017-12-05 23:58:51

标签: c file vector

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

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

这是我的矢量结构:

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

}

并附加到vector:

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

2 个答案:

答案 0 :(得分: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字段,以便了解指向的数据量。

答案 1 :(得分:0)

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

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

line = NULL;

将行设置为NULL