逐行获取,然后将整行存储在C中的数组中

时间:2015-12-15 17:49:47

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

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

3 个答案:

答案 0 :(得分: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++;
} 

答案 1 :(得分:0)

这不会产生字符串数组:

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

进一步说明,对于while循环:

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

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

答案 2 :(得分:0)

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