gpt4 book ai didi

c - getdelim 报告的无效参数

转载 作者:太空宇宙 更新时间:2023-11-04 08:34:30 25 4
gpt4 key购买 nike

我正在尝试使用 getdelim 函数将整个文本文件的内容读入一个字符串。

这是我使用的代码:

ssize_t bytesRead = getdelim(&buffer, 0, '\0', fp);

但是这是失败的,strerror(errno) 说“错误:无效参数”

我已经查看了所有我能找到的文档,但就是无法让它正常工作,我已经尝试过 getline ,它确实有效,但我想让这个功能更好地工作。

buffer 也被初始化为 NULL 所以它似乎不是那个
fp 也没有报告任何错误并且文件可以完美打开

编辑:我的实现基于这个 stackoverflow 问题的答案 Easiest way to get file's contents in C

最佳答案

Kervate,请启用编译器警告(-Wall for gcc),并注意它们。他们很有帮助;为什么不接受所有你能得到的帮助呢?

正如 WhozCraig 和 n.m. 指出的那样在对您的原始问题的评论中,getdelim() man page显示正确的用法。

如果你想读取由 NUL 字符分隔的记录,你可以使用

FILE   *input; /* Or, say, stdin */
char *buffer = NULL;
size_t size = 0;
ssize_t length;

while (1) {
length = getdelim(&buffer, &size, '\0', input);
if (length == (ssize_t)-1)
break;

/* buffer has length chars, including the trailing '\0' */
}

free(buffer);
buffer = NULL;
size = 0;

if (ferror(input) || !feof(input)) {
/* Error reading input, or some other reason
* that caused an early break out of the loop. */
}

如果要将文件的内容读取到单个字符数组中,那么 getdelim() 是错误的函数。

相反,使用 realloc()动态分配和增长缓冲区,使用 fread() 附加到它.为了让你开始——这还不完整! -- 考虑以下代码:

FILE   *input; /* Handle to the file to read, assumed already open */
char *buffer = NULL;
size_t size = 0;
size_t used = 0;
size_t more;

while (1) {

/* Grow buffer when less than 500 bytes of space. */
if (used + 500 >= size) {
size_t new_size = used + 30000; /* Allocate 30000 bytes more. */
char *new_buffer;

new_buffer = realloc(buffer, new_size);
if (!new_buffer) {
free(buffer); /* Old buffer still exists; release it. */
buffer = NULL;
size = 0;
used = 0;
fprintf(stderr, "Not enough memory to read file.\n");
exit(EXIT_FAILURE);
}

buffer = new_buffer;
size = new_size;
}

/* Try reading more data, as much as fits in buffer. */
more = fread(buffer + used, 1, size - used, input);
if (more == 0)
break; /* Could be end of file, could be error */

used += more;
}

请注意,后一个代码段中的 buffer 不是字符串。没有终止 NUL 字符,所以它只是一个字符数组。事实上,如果文件包含二进制数据,则数组可能包含大量 NUL(\0,零字节)。假设没有错误并且所有文件都已读取(您需要检查这一点,请参阅前面的示例),buffer 包含从文件中读取的 used 字符,其中为 size 分配了足够的空间。如果 used > 0,则 size > used。如果 used == 0,则 size 可能为零,也可能不为零。

如果你想把 buffer 变成一个字符串,你需要决定如何处理可能嵌入的 \0 字节——我建议要么转换成例如空格或制表符,或移动数据以完全跳过它们 --,并在末尾添加字符串终止 \0 以使其成为有效字符串。

关于c - getdelim 报告的无效参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26836148/

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