在C语言中,怎样将文本文件一行一行地存储在数组中?

ff29svar  于 2023-06-05  发布在  其他
关注(0)|答案(2)|浏览(155)

我有一个文本文件,其中包含可变长度的行,我想使用c将其存储在动态数组中。
下面是动态数组的实现:

struct array {
    char **elements;
    long size;
    long capacity;
};

void array_init(struct array *array, long capacity)
{
    array->capacity = capacity;
    array->elements = malloc(capacity * sizeof(char*));
}

void array_push_back(struct array *array, char *element)
{
    if (array->size == array->capacity) {
        array->capacity *= 2;
        array->elements = realloc(array->elements, array->capacity * sizeof(char*));
    }
    array->elements[array->size++] = element;
}

我通过以下方式阅读了该文件:

struct array array;
FILE *file = fopen(filename, "r");
const unsigned MAX_LENGTH = 256;
char buffer[MAX_LENGTH];

array_init(&array, 1000);

while (fgets(buffer, MAX_LENGTH, file))
{
     array_push_back(&array, buffer);
}

for (int i = 0; i < array.size; i++)
{
     printf(array.elements[i]);
}

printf只打印数组大小的最后一个元素。我猜这是因为我把buffer的地址分配给array.elements[i],只改变了buffer的内容。
有人能帮助正确地从文件中阅读并存储它吗?

6ovsh4lw

6ovsh4lw1#

array->elements[array->size++] = element;

您将main的 * 指针 * 一次又一次地存储到每个元素。你必须复制字符串的 content

array->elements[array->size++] = strdup(element);

或:

const size_t n = strlen(element);
array->elements[array->size] = malloc(n + 1);
memcpy(array->elements[array->size], element, n + 1);
array->size++;
ffscu2ro

ffscu2ro2#

在main中的while循环中

char buffer[MAX_LENGTH];

array_init(&array, 1000);

while (fgets(buffer, MAX_LENGTH, file))
{
     array_push_back(&array, buffer);
}

你将相同的数组buffer传递给函数array_push_back。所以函数得到一个指向数组第一个元素的指针。并且在函数内所有动态分配的指针都用这个地址设置

array->elements[array->size++] = element;

需要为每个指针动态分配一个字符数组,并将数组buffer中存储的字符串复制到动态分配的数组中。
注意这个功能

void array_init(struct array *array, long capacity)
{
    array->capacity = capacity;
    array->elements = malloc(capacity * sizeof(char*));
}

不将数据成员size初始化为传递结构的零。它保持未初始化状态。
并在该语句中的赋值的左侧和右侧使用相同的指针array->elements

array->elements = realloc(array->elements, array->capacity * sizeof(char*));

是不安全的。该函数可能返回空指针,早期分配的内存将丢失。你需要写一些像

char **tmp = realloc(array->elements, 2 * array->capacity * sizeof(char*));

if ( tmp != NULL )
{
    array->elements = tmp;
    array->capacity  *= 2;
}

相关问题