- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在开发一个 basic_streambuf
来处理从/到 Winsock 套接字的读取和写入。就像 basic_filebuf
一样,我在内部使用 std::codecvt
对象将从底层套接字读取的字节转换为“socket streambuf”的 char 类型,以及将写入套接字 streambuf 的字符转换为可以写入底层套接字的字节。为此,我发现我需要为 streambuf 的读取和写入功能维护缓冲区。
我遇到的逻辑问题是,streambuf 实现旨在用于读取和写入(std::iostream
constructor 采用单个指向 streambuf 的指针),但只有一个可重写的成员函数可以为设置底层字符缓冲区而定制:setbuf
.如果我想让我的套接字流缓冲区模板的用户设置底层缓冲区,setbuf
应该设置读取缓冲区还是写入缓冲区?哪个选项更有意义?
最佳答案
std::iostream
继承自 std::istream
和 std::ostream
, 但那些实际上都继承自 std::ios
,其中包含缓冲区。因为它们实际上都继承自 std::ios
, 只有一个 std::ios
std::iostream
基地,因此只有一个内部缓冲区。
摘自 C++2011 年 2 月 11 日草案:
§ 27.6.3
The class template basic_streambuf serves as an abstract base class for deriving various stream buffers whose objects each control two character sequences:
— a character input sequence;
— a character output sequence.
§ 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> {
关于c++ - basic_streambuf::setbuf 应该设置哪个缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8144347/
我正在阅读 C++ 11 标准。 27.6.3.4.3/7 和 27.6.3.4.5/3 部分描述了函数“int_type underflow();”和“int_type overflow(int_t
我正在开发一个 basic_streambuf 来处理从/到 Winsock 套接字的读取和写入。就像 basic_filebuf 一样,我在内部使用 std::codecvt 对象将从底层套接字读取
我的问题如下:Martin York this 中的 claim , this , 和 this回答可以使用 basic_stringbuf::pubsetbuf 像这样从一段内存中读取 string
如果你看在VS2010的头文件中你会看到这个成员函数的定义为 pos_type pubseekoff(off_type _Off, ios_base::seekdir _Way,
注意:根据回复进行编辑以获得更合适的答案。 我有一个多年来制作的 C++ 模板集合,我称之为 Joop。它主要包括不完全属于“通用”类别但足够有用以至于我一直将它们放入不同项目的库,因此它们中的大多数
我有一个项目需要我将过滤器插入流中,以便根据过滤器修改传出数据。经过一些研究,似乎我想要做的是像这样创建一个 filtered_streambuf: template class filtered_
我想编写一个我自己的日志记录库,为日志条目发送到的任何地方提供抽象。 C++ 的 IO 库已经通过 std::stringstream 和 std::fstream 提供了这种抽象。我还希望能够从套接
我想继承std::basic_streambuf实现基于 TCP 连接的流缓冲区。我不明白指针的作用 eback, gptr, egptr, pbase, pptr, epptr .我将流缓冲区视为一
我有一个 std::basic_streambuf 子类,它导致所有输出都以大写形式写入,如下所示: class upper_streambuf : public std::streambuf {
我已经多次看到有关创建自定义流缓冲区的说明:您需要做的就是实现 overflow , underflow , 和 pbackfail正确地在 std::basic_streambuf 的后代中您可以创
好吧,我现在非常困惑;什么时候有人会在流上使用流缓冲区 - 或者以其他方式? 阅读 cppreference一些关于此的在线主题只会增加困惑。在我看来,std::basic_istream 是缓冲区的
我正在检查 std::basic_streambuf 类中的函数 setg()。它在文件 streambuf 中定义。 gcc版本是5.4.0 我使用的编译选项是-std=gnu++14 void s
根据 libstdc++ c++11 status page , 流缓冲区被标记为已完成。 查看 然而,gcc 4.8 附带的构造函数和复制构造函数是 private (第 799 行)。根据§ 27
我在读取通过 asyc_read() 填充的 streambuf 时遇到了一些问题。在 VS 中单步执行我的代码时,我可以看到缓冲区中有正确的数据,但是当我去读取它时: std::istream is
以这个简单的示例程序为例: // main.cpp #include #include int main(int argc, const char *argv[]) { using names
C++ 标准说 ($27.6.3.4.2) std::basic_streambuf::seekoff 和 std::basic_streambuf::seekpos 的效果都定义了分别为派生自 st
这个问题可能很愚蠢,但这是我第一次接触 gcc 文档。 我知道basic_streambuf::pubseekoff() 是模板类basic_streambuf 的公共(public)成员函数,但它没
27.6.3.4.2 Buffer management and positioning pos_type seekoff(off_type off, ios_base::seekdir way,
想必这些名字现在为了兼容性而卡住了,但为什么最初没有给它们起相似的名字呢? gptr()/pptr() 和egptr()/epptr() 是一致的,但是 eback() 特别令人困惑,gbase()
vt.给出。基本上,我正在寻找的是避免做(1)语句,因为它看起来不整洁。。另一种(近似的)解决方法是getline,但它不像stringbuf那样动态分配,因为它需要一个固定大小的缓冲区,所以在使用s
我是一名优秀的程序员,十分优秀!