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