使用 fgets 遍历文件时追加到数组
Appending to array while iterating over file using fgets
这里是C新手。
我正在尝试通过在 while
循环中使用 fgets
循环将文件内容逐行附加到数组。
当尝试访问数组时,我在访问值 array[1]
或 array[2]
上的数组时遇到分段错误。阅读 array[3]
时它确实有效。我做错了什么吗?
有人能指出我正确的方向吗?
我会在下面留下我的代码。
#include "library.h"
#include <stdio.h>
int main(int argc, char **argv) {
FILE *file = fopen("words.txt", "r");
char line[100];
char *array[] = {};
int i = 0;
while(fgets(line, sizeof(line), file) != NULL) {
i++;
array[i] = line;
}
printf("Line %d = %s\n", i , array[1]); //segmentation fault on array[1] and array[2] not on array[3]
}
您的代码有两个错误。
没有记忆array
你一直把line
的地址存入array
。你需要的是把line
的内容放到数组中。
试一试:
#define MAX_LEN 100
char line[MAX_LEN];
size_t capacity = 256;
char (*array)[MAX_LEN] = malloc(capacity * sizeof *array);
if (array == NULL)
{
// Error
// Add error handling or just:
exit(1);
}
size_t i = 0;
while(fgets(line, sizeof(line), file) != NULL)
{
if (i == capacity)
{
capacity = 2 * capacity;
char (*tmp)[MAX_LEN] = realloc(array, capacity * sizeof *array);
if (tmp == NULL)
{
// Error
// Add error handling or just:
exit(1);
}
array = tmp;
}
strcpy(array[i], line);
++i;
}
... do something with array ...
free(array);
首先,您必须对数组进行维数。否则,它将由其初始化程序确定尺寸。由于您的初始值设定项为空,因此您的数组也为空。
所以,如果你想存储一百行,你应该写:
char *array[100] = {};
(我用数组的静态维度来解释这个,因为动态分配方法有点复杂)
然后,当你写下你的行时:
array[i] = line;
你知道你在用指针工作吗?
line表示存放line行字符的缓冲区地址。然后你将变量 line 的这个地址分配给一个指针数组。
array[1] 是你的指针数组的第二个指针。 (因为数组索引在 C 中以 0 开头)
存在分段,因为您的数组包含零值,因此您无法访问第二个(不存在的)值。
此外,您始终将相同的地址(变量 line 的地址分配给数组的每个条目。
事实上你只有一个行,你在你的数组
中复制了它的地址
有多个错误会阻止您将文件的所有行存储在数组中。
我会尽快编辑此 post 以向您提供您正在尝试执行的工作的示例。
这里是C新手。
我正在尝试通过在 while
循环中使用 fgets
循环将文件内容逐行附加到数组。
当尝试访问数组时,我在访问值 array[1]
或 array[2]
上的数组时遇到分段错误。阅读 array[3]
时它确实有效。我做错了什么吗?
有人能指出我正确的方向吗? 我会在下面留下我的代码。
#include "library.h"
#include <stdio.h>
int main(int argc, char **argv) {
FILE *file = fopen("words.txt", "r");
char line[100];
char *array[] = {};
int i = 0;
while(fgets(line, sizeof(line), file) != NULL) {
i++;
array[i] = line;
}
printf("Line %d = %s\n", i , array[1]); //segmentation fault on array[1] and array[2] not on array[3]
}
您的代码有两个错误。
没有记忆
array
你一直把
line
的地址存入array
。你需要的是把line
的内容放到数组中。
试一试:
#define MAX_LEN 100
char line[MAX_LEN];
size_t capacity = 256;
char (*array)[MAX_LEN] = malloc(capacity * sizeof *array);
if (array == NULL)
{
// Error
// Add error handling or just:
exit(1);
}
size_t i = 0;
while(fgets(line, sizeof(line), file) != NULL)
{
if (i == capacity)
{
capacity = 2 * capacity;
char (*tmp)[MAX_LEN] = realloc(array, capacity * sizeof *array);
if (tmp == NULL)
{
// Error
// Add error handling or just:
exit(1);
}
array = tmp;
}
strcpy(array[i], line);
++i;
}
... do something with array ...
free(array);
首先,您必须对数组进行维数。否则,它将由其初始化程序确定尺寸。由于您的初始值设定项为空,因此您的数组也为空。
所以,如果你想存储一百行,你应该写:
char *array[100] = {};
(我用数组的静态维度来解释这个,因为动态分配方法有点复杂)
然后,当你写下你的行时:
array[i] = line;
你知道你在用指针工作吗?
line表示存放line行字符的缓冲区地址。然后你将变量 line 的这个地址分配给一个指针数组。
array[1] 是你的指针数组的第二个指针。 (因为数组索引在 C 中以 0 开头) 存在分段,因为您的数组包含零值,因此您无法访问第二个(不存在的)值。
此外,您始终将相同的地址(变量 line 的地址分配给数组的每个条目。
事实上你只有一个行,你在你的数组
中复制了它的地址有多个错误会阻止您将文件的所有行存储在数组中。
我会尽快编辑此 post 以向您提供您正在尝试执行的工作的示例。