3

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

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

4

2 回答 2

2

std::iostream继承自std::istreamstd::ostream,但实际上两者都继承std::ios,其中包含缓冲区。由于它们实际上都继承自std::ios,因此只有一个std::ios的基数std::iostream,因此只有一个内部缓冲区。

来自 C++11 Feb 2011 草案:

§ 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> {
于 2011-11-15T23:10:22.547 回答
1

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

于 2011-11-17T16:46:42.517 回答