是否有使用fread()读取的字节数限制

时间:2017-06-22 19:35:46

标签: c fread

我正在尝试将文件中的数据读入缓冲区。文件中的数据为900K字节。 (寻求文件结束和ftell())。分配要读取大小为900K + 1的数据的缓冲区(以null终止)。我的问题是fread()返回900K,但是我看到strlen(缓冲区)显示的值较小,而在最后的缓冲区中我可以看到类似“.....(截断)”的内容。为什么会这样? fread()是否存在限制,超出该限制我们无法读入缓冲区并且会截断它。也就是为什么fread()的返回值表示为900K,即使它实际上已经读得更少了。?

2 个答案:

答案 0 :(得分:0)

您的主要问题是already been answered,但值得注意的是 strlen 并非旨在衡量数组的大小,而是以NULL结尾的字符串。它可能会打印一个较低的值,因为 strlen 会返回在null-char之前出现的字符数,所以如果你的数据中有nullchars(' \ 0'), strlen 会在找到其中一个后立即停止。

您应该信任 fread 的返回值。

编辑:作为备注, fread 可以读取比请求的字节少的字节,并且可能是由错误或文件结尾引起的。您可以分别使用 ferror feof 进行检查。

答案 1 :(得分:0)

strlen在这些方面做了一些事情:

int strlen(char *str)
{
     int len = 0;
     while(*str++) len++;
     return len;
}

如果您的文件包含二进制数据(或者如果它是具有UTF编码和未使用的高位字节的文本文件)strlen将在它遇到的第一个0x00字节处停止并返回多少字节进入遇到的文件。如果您使用单字节编码(如ANSI)读取文本文件,则 将无法使用空终结符,并且调用strlen将调用未定义的行为。

如果要确定fread成功读出文件的字节数,请检查其返回值。 1

如果要在读取文件之前确定文件大小,请执行以下操作:

size_t len;
fseek(fp, 0, SEEK_END);
len = ftell(fp);
rewind(fp);

len将包含文件的大小(以字节为单位)。

1:假设您将fread调用参数2设置为每个元素1个字节,并且没有尝试读取比文件中实际更多的字节。