streambuf::xsgetn和状态标志
streambuf::xsgetn and state flags
受保护的虚拟成员函数streambuf::xsgetn
使I/O流实现者能够定义一个从输入流中提取n
字符并将其存储在缓冲区中的函数。
通常,对于大多数标准流(如fstream
),此函数只需在循环中调用sbumpc
,直到返回eof
。但是,自定义流类可以覆盖此函数以执行更高效的操作,例如将数据批量复制到输出缓冲区中。
但我不明白的是,xsgetn
是如何指示已经达到EOF条件的。假设用户请求读取100个字节,但流中只剩下50个字节。假定xsgetn
应该读取50个字节,返回50
,然后将内部流状态设置为eof
。
除了xsget
是streambuf
的成员函数,它没有办法设置流状态。与可以返回EOF
的sbumpc
不同,xsgetn无法指示EOF条件发生。那么xsgetn
应该如何处理EOF条件呢?
这是我在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个字符。函数调用的结果由访问流状态的高级流操作获取,并将相应地进行设置。
相关文章:
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- OSX MetalKit CVMetalTextureCacheCreateTextureFromImage失败,状态:
- std::future_error:无关联状态
- 即使使用调试编译标志,表达式也是"optimized out"
- 在 CMake 中为每个目标设置编译器/链接器标志
- 如何避免LED在循环状态变化中闪烁?
- boost 是否有按特殊类型值编码状态"compact optional"?
- File.cpp.o:OpenPose 标志 CMakeFiles/.. 的多重定义/main.cpp.o:首先在这里定
- 为什么系统函数总是在C++中返回已转移的退出状态?
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 在轮班操作后使用携带标志
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 如何找出引入AVX标志的内容
- 如何防止另一个线程修改状态标志?
- 为什么我必须将错误状态标志设置为 goodbit 才能使其工作
- 可以清除流的单个错误状态标志
- 是否有一种直观的方式检查标志和状态
- 状态标志是如何表示的,以及如何使用位“或”来处理位标志
- streambuf::xsgetn和状态标志