逐行获取行,然后将整行存储在 C 中的数组中
getline line by line and then store entire lines in an array in C
我试图将每一行分别存储在一个字符串数组中。它不像我写的那样工作,显然当我尝试打印 array[0] 时我得到的是文本文件的最后一行。但是当我在 while 循环中打印变量 "line" 时,我可以打印文本文件中的每一行,但我似乎只能存储 txt 文件的最后一行。
这可以吗?或者这是 getline 的限制..?
int main()
{
FILE * fp;
char *line;
ssize_t read;
size_t bufsize = 32;
int i=0;
char **array;
array = malloc(bufsize * sizeof(char));
line = malloc(bufsize * sizeof(char));
fp = fopen("testing.txt", "r");
while ((getline(&line, &bufsize, fp)) != -1) {
printf("%s", line);
array[i] = line;
i++;
}
fclose(fp);
printf("%s", array[0]);
return 0;
}
这不会生成字符串数组:
char **array;
array = malloc(bufsize * sizeof(char));
有大量资源描述了如何执行此操作。例如。 How to create a dynamic array of strings.
本质上,您需要为数组分配 space,然后为每个字符串分配 space,标准方法可能是:
char **arrayOfStrings;
unsigned int numberOfElements = 20, sizeOfEachString = 100;
arrayOfStrings = malloc(numberOfElements * sizeof(char*));
for (int i = 0; i < numberOfElements ; i++)
arrayOfStrings[i] = malloc(sizeOfEachString * sizeof(char));
进一步说明,对于您的 while
循环:
while (getline(&line, &bufsize, fp)) {
足够了。完成文件后,Getline 将 return 0。 Read this.
char **array;
array = malloc(bufsize * sizeof(char));
array[i] = line;
我认为你的问题出在数组上,你确实在为数组而不是数组[i]动态分配内存。
while ((getline(&line, &bufsize, fp)) != -1) {
array[i]=malloc(sizeof(char) * (bufsize+1));
printf("%s", line);
array[i] = line;
i++;
}
这应该可以解决问题
测试程序后编辑:
array = malloc(bufsize * sizeof(char));
应该是
array = malloc(bufsize * sizeof(char*));
如前所述,您需要为指针分配 space,而不是字符:
char **array;
array = malloc(bufsize * sizeof(char*));
您还需要为单独的行分配 space,并将行复制到其中:
while ((getline(&line, &bufsize, fp)) != -1) {
printf("%s", line);
array[i] = malloc(strlen(line) + 1);
strcpy(array[i], line);
i++;
}
您的代码中的一个错误是所有 array[i]
都指向变量 line
中的同一个字符串,每个循环周期由 getline()
重新填充。
阅读有关 getline 的手册可能会有用。它允许自己分配字符串,但不要忘记使用 free()。
array[0] = NULL;
while ((getline(&array[i], &bufsize, fp)) != -1) {
printf("%s", array[i]);
array[i + 1] = NULL;
i++;
}
我试图将每一行分别存储在一个字符串数组中。它不像我写的那样工作,显然当我尝试打印 array[0] 时我得到的是文本文件的最后一行。但是当我在 while 循环中打印变量 "line" 时,我可以打印文本文件中的每一行,但我似乎只能存储 txt 文件的最后一行。
这可以吗?或者这是 getline 的限制..?
int main()
{
FILE * fp;
char *line;
ssize_t read;
size_t bufsize = 32;
int i=0;
char **array;
array = malloc(bufsize * sizeof(char));
line = malloc(bufsize * sizeof(char));
fp = fopen("testing.txt", "r");
while ((getline(&line, &bufsize, fp)) != -1) {
printf("%s", line);
array[i] = line;
i++;
}
fclose(fp);
printf("%s", array[0]);
return 0;
}
这不会生成字符串数组:
char **array;
array = malloc(bufsize * sizeof(char));
有大量资源描述了如何执行此操作。例如。 How to create a dynamic array of strings. 本质上,您需要为数组分配 space,然后为每个字符串分配 space,标准方法可能是:
char **arrayOfStrings;
unsigned int numberOfElements = 20, sizeOfEachString = 100;
arrayOfStrings = malloc(numberOfElements * sizeof(char*));
for (int i = 0; i < numberOfElements ; i++)
arrayOfStrings[i] = malloc(sizeOfEachString * sizeof(char));
进一步说明,对于您的 while
循环:
while (getline(&line, &bufsize, fp)) {
足够了。完成文件后,Getline 将 return 0。 Read this.
char **array;
array = malloc(bufsize * sizeof(char));
array[i] = line;
我认为你的问题出在数组上,你确实在为数组而不是数组[i]动态分配内存。
while ((getline(&line, &bufsize, fp)) != -1) {
array[i]=malloc(sizeof(char) * (bufsize+1));
printf("%s", line);
array[i] = line;
i++;
}
这应该可以解决问题
测试程序后编辑:
array = malloc(bufsize * sizeof(char));
应该是
array = malloc(bufsize * sizeof(char*));
如前所述,您需要为指针分配 space,而不是字符:
char **array;
array = malloc(bufsize * sizeof(char*));
您还需要为单独的行分配 space,并将行复制到其中:
while ((getline(&line, &bufsize, fp)) != -1) {
printf("%s", line);
array[i] = malloc(strlen(line) + 1);
strcpy(array[i], line);
i++;
}
您的代码中的一个错误是所有 array[i]
都指向变量 line
中的同一个字符串,每个循环周期由 getline()
重新填充。
阅读有关 getline 的手册可能会有用。它允许自己分配字符串,但不要忘记使用 free()。
array[0] = NULL;
while ((getline(&array[i], &bufsize, fp)) != -1) {
printf("%s", array[i]);
array[i + 1] = NULL;
i++;
}