受保护的虚拟成员函数streambuf::xsgetn使I/O流实现者能够定义一个函数,该函数从输入流中提取n字符并将它们存储在缓冲区中。
通常,对于大多数标准流(如fstream ),该函数只需在循环中调用sbumpc,直到返回eof为止。但是,自定义流类可以重写此函数以执行更有效的操作,例如将数据批量复制到输出缓冲区。
但我不明白的是,xsgetn是如何表示已经达到EOF条件的。假设用户请求读取100个字节,但流中只剩下50个字节。据推测,xsgetn应该读取50个字节,返回50,然后将内部流状态设置为eof。
除了xsget是streambuf的一个成员函数之外,它无法设置流状态。与可以返回sbumpc的EOF不同,xsgetn无法指示发生了EOF条件。那么xsgetn应该如何处理EOF条件呢?
发布于 2015-03-04 21:27:54
这就是我在libstdc++上发现的:
template<typename _CharT, typename _Traits>
streamsize basic_streambuf<_CharT, _Traits>::xsgetn(char_type* __s, streamsize __n) {
streamsize __ret = 0;
while (__ret < __n) {
const streamsize __buf_len = this->egptr() - this->gptr();
if (__buf_len) {
const streamsize __remaining = __n - __ret;
const streamsize __len = std::min(__buf_len, __remaining);
traits_type::copy(__s, this->gptr(), __len);
__ret += __len;
__s += __len;
this->__safe_gbump(__len);
}
if (__ret < __n) {
const int_type __c = this->uflow();
if (!traits_type::eq_int_type(__c, traits_type::eof())) {
traits_type::assign(*__s++, traits_type::to_char_type(__c));
++__ret;
} else
break;
}
}
return __ret;
}当提取的字符少于所请求的字符数时,此函数将调用uflow()以获得更多字符。如果该函数返回Traits::eof(),那么它将返回是否提取了0个字符。函数调用的结果由访问流状态的高级流操作获取,并将相应地设置它。
https://stackoverflow.com/questions/28864251
复制相似问题