ifstream :: readsome问题。缓冲超过

时间:2013-04-03 10:12:07

标签: c++ buffer

我已经研究过,如果缓冲区中没有足够的空间,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)

感谢您的回答。

2 个答案:

答案 0 :(得分:3)

因为这是readsome的含义。它调用 streambuf上的任何虚函数(可以 块);它被定义为仅返回当前字符 在缓冲区。

如果您需要更多内容,则应使用read

答案 1 :(得分:2)

无法保证,您的缓冲区将始终被完全填充,因此您可能只需要4090字节而不是4906字节。

来自cplusplus.com


读取缓冲区中可用的数据  从流中提取最多n个字符并将它们存储在s指向的数组中,一旦相关的流缓冲区对象(如果有)保留的内部缓冲区用完字符就停止,即使文件结尾有尚未到达。

该函数用于从某些类型的异步源读取数据,这些数据可能最终等待更多字符,因为它会在内部缓冲区耗尽时停止提取字符,从而避免潜在的延迟。

请注意,此函数依赖于与流相关联的特定流缓冲区对象的内部,其行为主要是针对标准类实现定义的。

在内部,函数通过首先构造一个sentry对象(noskipws设置为true)来访问输入序列。然后(如果好),它通过调用其成员函数in_avail来检查关联的流缓冲区对象当前可用的字符数,并通过调用sbumpc(或sgetc)来提取多达那么多字符。最后,它会在返回之前摧毁哨兵对象。

可以通过调用成员gcount来访问此函数成功读取和存储的字符数。


有关该文章,请参阅here