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