【问题标题】:getline line by line and then store entire lines in an array in C [closed]逐行获取行,然后将整行存储在C中的数组中[关闭]
【发布时间】:2016-03-21 15:33:31
【问题描述】:

我试图将每一行分别存储在一个字符串数组中。显然,当我尝试打印 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;
}

【问题讨论】:

  • “字符串数组中的每一行单独”。是什么让您认为 single 行的 single malloc 将使 each 行的 单独 存储?
  • array 是指向char指针 数组。所以你想要array = malloc(bufsize * sizeof(char*));(不是sizeof(char))。您的 malloc 没有为 bufsize 指针分配足够的内存。
  • getline 不是标准的。使用fgets。而EOF 不一定是-1。不要在代码中使用幻数!
  • getline() 的一个方便之处在于它可以为您分配字符串...
  • 感谢您的回答,我是初学者,我的老师建议我们使用 getline,因为“它可以更好地处理大多数较大的行”。我会尝试两个!

标签: c arrays file-io getline line-by-line


【解决方案1】:

正如已经提到的,您需要为指针分配空间,而不是字符:

char **array;
array = malloc(bufsize * sizeof(char*));

您还需要为单独的行分配空间,并将行复制到其中:

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++;
} 

【讨论】:

  • 非常感谢您提供有用的建议并抽出宝贵时间。手册也给出了一些清晰的说明。
【解决方案2】:
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*));

【讨论】:

    【解决方案3】:

    这不会产生字符串数组:

    char **array;
    array = malloc(bufsize * sizeof(char));
    

    有很多资源描述了如何做到这一点。例如。 How to create a dynamic array of strings. 本质上,您需要为数组分配空间,然后为每个字符串分配空间,标准方式可能是:

    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));
    

    进一步说明,对于您的whileloop:

    while (getline(&line, &bufsize, fp)) {
    

    足够了。完成文件后,Getline 将返回 0。 Read this.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-13
      • 2011-12-04
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多