1

如果缓冲区中没有足够的空间,我已经调查过该方法ifstream::readsome(buf, size)不会读取所有字节。示例:

我有缓冲区:4096 字节。从文件开始的偏移量:6 个字节。我打电话 ifstream::readsome(buf, 4097)

函数的结果是 4090。所以如果我想读取剩下的七个字节,我必须调用

ifstream::readsome(buf + 4090, 7).

问题是:为什么这个功能会以这种方式实现?我没有看到处理超出内部方法的缓冲区的任何问题ifstream::readsome(buf, size)

编译器:MSVC 11(VS 2012)

谢谢你的回答。

4

2 回答 2

3

因为这就是 的意思readsome。它不会调用streambuf可能会阻塞)上的任何虚函数;它被定义为仅返回当前在缓冲区中的字符。

如果您需要更多,那么您应该使用read.

于 2013-04-03T10:18:41.307 回答
2

不能保证您的缓冲区将始终被完全填满,因此您可能真的只有 4090 字节而不是 4906 字节。

cplusplus.com


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

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

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

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

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


看到这里的文章。

于 2013-04-03T10:20:18.763 回答