C 重新分配以找到行尾,但没有得到整行?

标签 c

我有一个函数可以查找文本文件中的行数并返回这些行。我必须动态调整数组的大小。但是,当我打印它时,它只显示缓冲区中每一行的最后几个字母。我是 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);

最佳答案

每次您需要重新分配时,您会立即返回并覆盖您目前已阅读的所有内容。您需要考虑到您已阅读的字符在 *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;

关于C 重新分配以找到行尾,但没有得到整行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14637499/

相关文章:

c - 为什么我的子进程没有给我 "correct"结果?

c - 使用C进行串行通信时出错

c - 在C中,数组中可以有字符串吗?如果没有,有没有解决方法

c - 如何使用for循环初始化数组?

c - Visual Studio 2012 "Syntax Error"

c - 学习使用内在函数——使用 _mm256_sub_ps 的段错误

c - ‘;’ token 之前的错误 : expected ‘,’ , ‘)’ 或 ‘&’

c - 从 C/C++ 扫描 BLE 设备

C:连续宏不起作用

c - 免费 `mmap()-ed` 私有(private)大页面