提问人:ssuukk 提问时间:12/27/2022 更新时间:12/27/2022 访问量:69
覆盖 istream get(char)
Overriding istream get(char)
问:
我正在实现一些非常具体的 I/O 流,其中之一,一个输入流,它有时才有可用的数据(想想你在打开时轮询数据的某种套接字)。我的流基于继承自 basic_iostream 的类,并在内部使用继承自 basic_filebuf 的缓冲区。所以我的 filebuf 有一种特殊的方式来发出信号,表明在调用 underflow 时没有可用的数据。我认为这是个好主意,因为从技术上讲,它不是 EOF,除非频道真的关闭了。这种状态基本上是说 - “现在没有数据,但渠道是开放的,所以你可以继续问,它最终可能会到达”。
问题是在函数内部检查,它看起来并不完全像应该被覆盖(也许我错了)。traits_type::eof()
get(char)
但无论如何 - 发出这种状态信号的最佳方式是什么?如果出现这种状态,我会在缓冲区的下溢方法中知道它......
答:
1赞
Victor Gubin
12/27/2022
#1
对于这个建议,你可以使用一个用户定义的char_traits,并将其作为模板参数放在你的,即像这样的东西:basic_filebuf
#include <fstream>
#include <limits>
struct my_char_traits : public std::char_traits<char>
{
typedef std::char_traits<char>::int_type int_type;
static constexpr int_type eof() noexcept
{
return std::numeric_limits<int_type>::min();
}
};
class my_buff: std::basic_filebuf<char, my_char_traits>
{
};
评论
0赞
ssuukk
12/28/2022
好吧,听起来很有希望。我使用 my_char_traits 作为缓冲区类的模板参数,添加了一个 nda(无可用数据)fn,它只返回一个魔术 int。那么,当 underflow 返回 nda() 返回的这个神奇值时,std::istream::get 究竟会发生什么?
0赞
Victor Gubin
12/28/2022
阅读以下手册 en.cppreference.com/w/cpp/io/basic_istream/get Return value 1) the extracted character or Traits::eof() 2-6) *this
0赞
Victor Gubin
12/28/2022
无论如何,如果您正在研究异步 API,即想要读取数据何时可用,您最好完全忘记流 API。也就是说,这只能是从异步 API 到同步的填充码,因此 istream 的末端实际上不会释放您的套接字或管道,steam API 是严格同步的。否则,你最好使用 Asio 或发明一些延续风团,如 github.com/incoder1/IO/blob/refactor/examples/......
评论
cin
get