我有一个文本文件,其中包含可变长度的行,我想使用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
的内容。
有人能帮助正确地从文件中阅读并存储它吗?
2条答案
按热度按时间6ovsh4lw1#
您将
main
的 * 指针 * 一次又一次地存储到每个元素。你必须复制字符串的 content。或:
ffscu2ro2#
在main中的while循环中
你将相同的数组
buffer
传递给函数array_push_back
。所以函数得到一个指向数组第一个元素的指针。并且在函数内所有动态分配的指针都用这个地址设置需要为每个指针动态分配一个字符数组,并将数组
buffer
中存储的字符串复制到动态分配的数组中。注意这个功能
不将数据成员
size
初始化为传递结构的零。它保持未初始化状态。并在该语句中的赋值的左侧和右侧使用相同的指针
array->elements
。是不安全的。该函数可能返回空指针,早期分配的内存将丢失。你需要写一些像