2

我有一个函数可以查找文本文件中的行数并返回这些行。我必须动态调整数组的大小。但是,当我打印它时,它只显示缓冲区内每一行的最后几个字母。我是 C 新手。这是代码的主要部分:

char * foo( char **buffer,  FILE * infile )

...

int buffSizer = 10;
*buffer = calloc( buffSizer, 1);
do { 
  char * result = fgets(*buffer, buffSizer, infile); 
  if (result == NULL){ 
    free(*buffer); 
    return(NULL); 
  } 
  char * ptr = strchr(*buffer, '\n'); 
  if (ptr){ 
    return(*buffer); 
  } 
  buffSiz = buffSizer * 2;
  *buffer = realloc(*buffer, buffSizer); 
} while (1);
4

1 回答 1

1

每次您需要重新分配时,您都会立即返回并覆盖到目前为止您已阅读的所有内容。您需要为*buffer已阅读的字符计算偏移量。

例如,您可以添加:

int offset = 0;

连同buffSiz声明一起,然后像这样使用它:

char * result = fgets(*buffer + offset, buffSiz - offset, infile); 

然后当你重新分配时,添加:

offset = buffSiz - 1; // -1 to account for null character stored by fgets()

在此行之前:

buffSiz = buffSiz * 2;

顺便说一句,*buffer在将其传递给realloc. 如果发生错误,您将泄漏原始分配并且数据将无法恢复。这个例子更安全:

char *tmp = realloc(*buffer, buffSiz);
if (!tmp)
{
    free(*buffer);
    return NULL;
}
*buffer = tmp;
于 2013-02-01T00:13:50.727 回答