gpt4 book ai didi

c - 获取 FILE 行 *

转载 作者:行者123 更新时间:2023-11-30 15:34:28 27 4
gpt4 key购买 nike

我正在尝试学习 C(这太难了......)所以我想编写一个获取文件行的​​例程。我创建了这个函数:

int c;
int buflen = 100;
if((*buffer = malloc(sizeof(char) * buflen)) == NULL) {
DXLogWarn("Not enough memory");
return;
}

char * dst = *buffer;
char * end = *buffer + buflen - 1;
while ((c = getc(fp)) != EOF) {
if (c == '\n') {
break;
}
if (dst < end) {
*dst++ = c;
}
}
*dst = '\0';

哪个有效啊!但现在我想,我可以重新分配缓冲区并继续直到“\n”,而不是切割字符串的最后一部分。所以我把它改成这样:

void fget_line(FILE *fp, char **buffer) {
int c;
int buflen = 10;
if((*buffer = malloc(sizeof(char) * buflen)) == NULL) {
DXLogWarn("Not enough memory");
return;
}

char * dst = *buffer;
char * end = *buffer + buflen - 1;
while ((c = getc(fp)) != EOF) {
if (c == '\n') {
break;
}

if (dst < end) {
*dst++ = c;
} else {
buflen *= 2;
*buffer = realloc(*buffer, buflen * sizeof(char));
if (*buffer == NULL) {
DXLogError("Err");
return;
}
}

}
*dst = '\0';
}

这给了我一个错误:malloc:*对象0x10a8001b8的错误:已释放对象的校验和不正确 - 对象可能在释放后被修改。*在malloc_error_break中设置断点进行调试

我不明白。我做错了什么?

最佳答案

一开始你会这样做:

char * dst = *buffer;
char * end = *buffer + buflen - 1;

这将 dst 和 end 设置为缓冲区内的正确位置。然后重新分配缓冲区:

*buffer = realloc(*buffer, buflen * sizeof(char));

这会导致缓冲区获得一个可能与之前不同的新值。因此,您还必须将 dstend 更新为缓冲区内的新位置。

更改end很容易,但由于不断更改dst,因此很难计算新值。因此,不改变指针,只将偏移量存储在整数中可能会更容易。像这样的东西:

int pos=0;
while ((c = getc(fp)) != EOF) {
if (c == '\n') {
break;
}

if (pos >= buflen-1) {
buflen *= 2;
*buffer = realloc(*buffer, buflen * sizeof(char));
if (*buffer == NULL) {
DXLogError("Err");
return;
}
}

(*buffer)[pos] = c;
pos++;
}
(*buffer)[pos] = '\0';

我还更改了上面的 if 语句,因为您没有存储导致重新分配的字符。

关于c - 获取 FILE 行 *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23262112/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com