哪个缓冲区应该由basic_streambuf :: setbuf设置?

时间:2011-11-15 22:58:10

标签: c++ io winsock streambuf

我正在使用basic_streambuf来处理从Winsock套接字读取和写入。就像basic_filebuf一样,我在内部使用std::codecvt对象将从底层套接字读取的字节转换为“socket streambuf”的char类型,以及将写入套接字streambuf的字符转换为字节可以写入底层套接字。为了做到这一点,我发现我需要为streambuf的读写功能维护缓冲区。

我遇到的逻辑问题是streambuf实现旨在用于读取和写入(std::iostream constructor采用单指针到streambuf),但只有一个可覆盖的成员函数可以自定义以设置基础char缓冲区:setbuf。如果我想允许套接字streambuf模板的用户设置底层缓冲区,那么setbuf应该设置读缓冲区还是写缓冲区?哪个选项更有意义?

2 个答案:

答案 0 :(得分:2)

std::iostream继承自std::istreamstd::ostream,但那些都是从包含缓冲区的std::ios虚拟继承的。由于它们都是从std::ios虚拟继承的,因此std::ios只有std::iostream个基数,因此只有一个内部缓冲区。

来自C ++ 2011年2月11日草案:

§27.6.3

  

类模板basic_streambuf用作派生各种的抽象基类   流缓冲区,其对象各自控制两个字符序列:
   - 字符输入序列;
   - 字符输出序列。

§27.7.2

namespace std {  
template <class charT, class traits = char_traits<charT> >  
class basic_istream : virtual public basic_ios<charT,traits> {

§27.7.3

namespace std {  
template <class charT, class traits = char_traits<charT> >  
class basic_ostream : virtual public basic_ios<charT,traits> {

答案 1 :(得分:1)

标准流只有两个指定的行为与setbuf。第一个是setbuf(0,0)可能没有效果,第二个是basic_filebuf,其中,如果在任何IO之前调用setbuf(0,0),那么IO是无缓冲的。否则结果是实现定义的。所以,只需对您的实现做有意义的事情,然后记录下来。