我试图使用getdelim
函数将整个文本文件的内容读入字符串。
下面是我使用的代码:
ssize_t bytesRead = getdelim(&buffer, 0, '\0', fp);
但是这是失败的,因为
strerror(errno)
说“错误:无效参数”我已经看过了所有我能做的文档,但是我不能让它工作,我试过getline,它确实可以工作,但是我想让这个函数更好地工作。
缓冲区也初始化为空,所以看起来不是这样
fp也没有报告任何错误,文件完全打开
编辑:我的实现基于这个stackoverflow问题的答案Easiest way to get file's contents in C
最佳答案
Kervate,请启用编译器警告(-Wall
对于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
结尾的字符串以使其成为有效字符串。