使用C,函数 fread 可以用来读取空终止字符串吗?
我必须读取一个以ip开头的文件作为4个无符号字符,后跟一个描述空终止字符串数的整数。之后,我需要在另一个ip列表开始之前读取字符串直到最后一个字符串。
非常感谢您的帮助
修改 我需要检测空字符并停止继续
答案 0 :(得分:5)
fread
不会停止以任何分隔符'\0'
或其他方式阅读。它试图读取所请求的确切字节数,并且只有在遇到文件结束或读取错误时才会提前停止。
在符合POSIX 2008标准的系统上,getdelim
功能提供了一种简单的方法,直到'\0'
"。否则,您将遇到调用getc
或类似的循环。
答案 1 :(得分:3)
我认为回答这个问题的最好方法是:"有点"。请fread()
读取空终止字符串吗?当然,fread()
只是将文件中的数据作为字节读取。但是,你不能要求它读取下一个以空字符结尾的字符串,因为它不知道或不关心字符串。
您需要在阅读后进行一些处理,以确定字符串的结束位置以及您阅读的内容。这可能是一个不错的策略 - 读取一些文件,检查您读取了多少字符串,并在需要时再次阅读。但是,这确实会使事情变得复杂,就像在你不想读的字符串之后有更多的数据一样。
更简单的方法是使用fgetc()
循环,例如:
for (int n = 0; n < strings_to_read; n++) {
int ch, i = 0;
while ((ch = fgetc(fp)) != '\0' && ch != EOF) {
str[n][i++] = ch;
}
str[n][i] = '\0';
}
减去一些额外的调整以确保正确分配内存,正确处理EOF等,这种方法可以让你很容易地读取字符串。
答案 2 :(得分:1)
受FatalError's answer的启发,请在下面找到稍微更有效(在声明方面)的版本,同时处理可能由于阅读或损坏的文件(根据OP的规范)引入的错误:
for (size_t n = 0; n < strings_to_read; ++n)
{
int ch = EOF;
do
{
size_t i = 0;
ch = fgetc(fp);
/* Error handling: */
if (EOF == ch)
{
/* Getting EOF means end of file (unexpected, from the OP's specifications) or an error. */
if (ferror(fp))
{
perror("fgetc() failed");
}
else
{
fprintf("Unexpected end of file.\n");
}
exit(EXIT_FAILURE);
}
str[n][i++] = ch;
} while ('\0' != ch)
}
答案 3 :(得分:0)
是。 fread
只会从文件中读取字节,包括空终止符,直到它到达文件末尾。
编辑:
至于在空终止符处停止,其他答案已经解决了你的编辑问题,所以我不会重新哈希它!