我试图从文件读取数据到缓冲区。文件中的数据是900K字节。 (试图结束文件和ftell())。分配要读取大小为900K + 1的数据的缓冲区(以空终止)。我的问题是,fread()返回900K,但我看到strlen(缓冲区)它显示较小的值,并在缓冲区最后我可以看到像“.....(截断)”的东西。这是为什么? fread()有没有限制,我们无法读入缓冲区,它会截断它。另外为什么fread()的返回值说900K,尽管实际上它读取的更少。是否有使用fread读取的字节限制()
回答
您的主要问题有already been answered,但值得注意的是strlen不是用来测量数组的大小,而是用一个以NULL结尾的字符串。它可能会打印一个较低的值,因为strlen返回出现在空字符之前的字符数,因此如果您的数据中有空字符('\ 0'),则strlen会在找到他们。
您应该信赖fread的返回值。
编辑:作为一个说明,的fread可以读取比请求更少的字节,并且可以通过错误或文件的端部引起的。您可以分别使用ferror和feof进行检查。
好的。我认为不要将它与strlen()进行比较,因为它可能包含二进制数据。但我的这个问题还没有得到解答:为什么数据在缓冲区中出现这样的结果:06/21/17 21:41:21 paper ...“(截断) – user7375520
strlen
做沿着这些路线的东西:
int strlen(char *str)
{
int len = 0;
while(*str++) len++;
return len;
}
如果你的文件包含二进制数据(或者如果它是一个UTF编码和未使用的高位字节的文本文件)strlen
会停在第一0x00
字节它会遇到并返回遇到的文件中的多少个字节。如果你阅读一个像ANSI这样的单字节编码的文本文件,将不会有为的空终止符,并且调用strlen
将调用未定义的行为。
如果要确定fread
成功读取文件的字节数,请检查其返回值。
如果你想读文件前确定文件的大小,这样做:
size_t len;
fseek(fp, 0, SEEK_END);
len = ftell(fp);
rewind(fp);
len
将包含该文件的字节大小。
1:假设您用参数2组称为fread
每件1个字节,并没有尝试读取更多的字节比实际上是在文件中。
我的确如此了解文件大小,我也没有把它与strlen()比较,因为它可能包含二进制数据。但是我的这个问题还没有得到解答:为什么缓冲区中的数据如下所示: 06/21/17 21:41:21 paper ...“(截断) – user7375520
- 1. fread循环不读取所有字节,为什么字节被反转?
- 2. 错误而读取下使用的fread
- 3. 是否有输出的字符限制
- 4. 堆栈大小的最大使用限制是否有限制?
- 5. PHP:字节的数量FREAD
- 6. 使用readline读取的限制数量
- 7. SslStream读取所有字节
- 8. 逐字节比较文件还是读取所有字节?
- 9. 是否有可以用scipy.io.readsav读取的最大文件大小限制?
- 10. 尝试从二进制文件读取数字(fread,fwrite)
- 11. 使用C#字节读取字节数组我使用C#
- 12. 使用FREAD有效地读取数据稀疏
- 13. CQL列表值是否真的限制为65535字节?
- 14. Wordpress - wp_list_pages - 是否有限制?
- 15. OpenFileDialog.Filenames是否有限制?
- 16. 使用Expat控制一次读取()的字节数
- 17. 如何限制在.NET中使用StreamReader.ReadLine()读取的字符数?
- 18. AVAudioEngine可以创建的节点数是否有限制?
- 19. ejabberd节点的数量是否有限制?
- 20. 张量流的csv文件读取器中的num_epochs是否有限制string_input_producer()?
- 21. 是否有可以通过HTTP读取的响应大小的限制
- 22. 用python读取MNIST字节
- 23. 使用glReadPixels读取纹理字节?
- 24. 当使用流的读取字节我读什么样的字节
- 25. 发送给java servlet的字节长度是否有任何限制
- 26. 什么是读取从SQL Server使用SqlDataReader的(C#)字节数
- 27. Windows服务是否限制从%WINDIR%(C:\ Windows)读取?
- 28. 使用fread抑制错误
- 29. 使用CAPTCHA限制节点
- 30. 如何用fread读取二进制文件()
'strlen'无法评估二进制数组的大小。如果数据中有零,则停在那里。如果没有,那么...... boom(未定义行为) –
文件数据中是否有零字节?字符串停在第一个字符串处。 –
文件不是空终止的,它们不一定是文本。不要试图像这样对待他们。 fread()已经读取了比您所看到的更多的字节;文件中明显存在二进制数据,并且数据中的空字符使strlen()认为它已到达结尾。二进制!=文本,二进制数据不能使用像strlen()这样的字符函数来处理。 –