为了账号安全,请及时绑定邮箱和手机立即绑定

关于fread函数,当文件流缓冲中剩余长度小于需要读取的长度时的问题 ?有知道的吗?

关于fread函数,当文件流缓冲中剩余长度小于需要读取的长度时的问题 ?有知道的吗?

C PHP
翻翻过去那场雪 2021-10-21 21:15:42
当输入文件为二进制,长度远大于4096的时候。由于文件流缓冲默认为4095.那么假设已经读取了4080个字节之后,即fp_in->_cnt的值为15,再使用fread(g_buffer, 1, 20, fp_in);函数打算一次性读出20个字节时,程序异常,fread执行时报Access Violation.有高手帮忙解释下吗?按道理说,文件流缓冲中剩余长度不足的时候,应该会自动从外存文件中一次性读入4096个字节到缓冲中才对呀,有高手帮忙指点下吗?
查看完整描述

2 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

fread在fp_in缓冲区中剩余字节为0的时候才会产生一个异常让内核去处理,内核收到这个异常,就会读取文件,将fp_in的缓冲区重新填满。
也就是说:如果只剩下15个了,你要读20个,那么就会先读15个到g_buffer里,然后产生一个异常,内核重新填满缓冲区,然后再从缓冲区里读5个字节。

查看完整回答
反对 回复 2021-10-24
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

你一顿能吃四两饭,你现在已经吃了三两了,现在又有四两摆在你的面前,你不能一次把这四两又吃下去的。
程序同理,fread函数的原型如下:
size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
只能读到等于buffer指向的内存区的大小的count的。

查看完整回答
反对 回复 2021-10-24
  • 2 回答
  • 0 关注
  • 407 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信