我已经研究过,如果缓冲区中没有足够的空间,ifstream::readsome(buf, size)
方法不会读取所有字节。 Exmample:
我有缓冲区:4096字节。从文件开始偏移:6个字节。
我打电话给ifstream::readsome(buf, 4097)
。
函数的结果是4090.所以如果我想读休息七个字节,我必须调用
ifstream::readsome(buf + 4090, 7)
。
问题是:为什么这个功能以这种方式实现?我没有看到任何问题来处理缓冲区超出方法ifstream::readsome(buf, size)
。
编译器:MSVC 11(VS 2012)
感谢您的回答。
答案 0 :(得分:3)
因为这是readsome
的含义。它不调用
streambuf
上的任何虚函数(可以
块);它被定义为仅返回当前字符
在缓冲区。
如果您需要更多内容,则应使用read
。
答案 1 :(得分:2)
无法保证,您的缓冲区将始终被完全填充,因此您可能只需要4090字节而不是4906字节。
来自cplusplus.com
读取缓冲区中可用的数据 从流中提取最多n个字符并将它们存储在s指向的数组中,一旦相关的流缓冲区对象(如果有)保留的内部缓冲区用完字符就停止,即使文件结尾有尚未到达。
该函数用于从某些类型的异步源读取数据,这些数据可能最终等待更多字符,因为它会在内部缓冲区耗尽时停止提取字符,从而避免潜在的延迟。
请注意,此函数依赖于与流相关联的特定流缓冲区对象的内部,其行为主要是针对标准类实现定义的。
在内部,函数通过首先构造一个sentry对象(noskipws设置为true)来访问输入序列。然后(如果好),它通过调用其成员函数in_avail来检查关联的流缓冲区对象当前可用的字符数,并通过调用sbumpc(或sgetc)来提取多达那么多字符。最后,它会在返回之前摧毁哨兵对象。
可以通过调用成员gcount来访问此函数成功读取和存储的字符数。
有关该文章,请参阅here。