问题标签 [streambuf]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2831 浏览

streambuf - boost streambuf消耗和提交,它是什么

我似乎无法很好地解释 consumer() 和 commit() 的真正含义,实际上我根本不了解 streambuf。

我的理解是streambuf只是一个字符数组。但是为什么在文档中,

所以实际上有很多缓冲区?什么是“输入序列”和“输出序列”?这是另外两个缓冲区吗?

下面的代码究竟做了什么?

当我调用 b.prepare() 时,它是否为 read() 分配了一个新缓冲区来放置数据?那么数据何时从该缓冲区传输到底层的 streambuf 缓冲区?我以为是commit(),但是

所以看起来提交实际上将数据从“输出序列”移动到“输入序列”,而没有提及用于存储数据的底层缓冲区!

0 投票
3 回答
237 浏览

c++ - 我应该使用另一个的 streambuf 创建一个临时的 ostream 吗?

假设我有一个函数,它接受一个ostream &参数o并写入该 ostream。一个operator <<实现将是一个很好的例子。

在函数中,我可能想在流上指定格式选项。例如,我可能希望将一个数字打印为十六进制,无论o它在传递给函数时是如何配置的。

其次,我可能希望能够对当前的格式化标志做出假设。例如,除非我另有要求,否则能够假设数字被格式化为十进制会很好。

最后,当函数退出时,我希望格式化选项o与调用函数之前的格式选项相同,以便对调用者保持不变。这只是对呼叫者的礼貌问题。

到目前为止,我已经通过ostringstream在函数中创建一个 local 来实现这一点,完成我所有的工作(包括设置格式选项),并在函数末尾 发送.str()to 。这里的 StackOverflow 问题表明比我聪明的人也采用相同的方法。 但是,让我感到困扰的是,我在 ostringstreams 中保留了这么多数据,这些数据可能会更早地发送到输出(字符串可能会变得非常大)。o

我有两个问题:

1)创建一个临时的(基于堆栈的)ostream并在该ostream 上做我的工作是否合法、惯用、良好的形式等?o.rdbuf()我自己的测试和cppreference.com上的页面似乎表明我可以。

2)我没有考虑过另一种更好的方法吗?

0 投票
1 回答
1693 浏览

c++ - 如何在不复制的情况下将 std::string 的一部分放入流缓冲区?

我最近经常使用 boost asio,我发现我正在使用std::strings 和asio::streambufs 相当多。streambuf作为解析网络数据的一部分,我发现我正在尝试在s 和stringsa之间来回获取数据。一般来说,我不想乱用“格式化 io”,所以iostreams 不是很有用。我发现,ostream::operator<<()尽管有官方文档,但似乎将 my strings传递给streambufs 不受干扰,istream::operator>>()破坏了 my streambufs 的内容(正如您所期望的那样,因为它是“格式化的”)。

在我看来,标准库确实缺少大量迭代器和流对象来处理streambufs 和strings 以及未格式化的 io。例如,如果我想将 a 的子字符串string放入 astreambuf中,如何在不创建 的副本的情况下做到这一点string?一个基本的全进全出转移可以像这样完成:

印刷:

如果我只想将 a 的一部分streambuf放入字符串中,那似乎真的很难,因为istreambuf_iterator它不是随机访问迭代器并且不支持算术:

而且似乎没有任何方法可以直接使用string::iterators 将 a 的一部分转储string到 a中streambuf

如果我不介意格式化 io,我总是可以string从 a 中提取部分 s ,但我愿意——格式化的 io 几乎从来都不是我想要的:streambuf

印刷:

如果我对丑陋的副本没问题,我当然可以生成一个子字符串 -std::string::iterator 随机访问......

印刷:

stdlib 也有奇怪的独立的std::getline(),它可以让你拉出单独的行ostream

打印:消息=abcdefghijk lmnopqrs tuvwxyz 1234 5678

我觉得我错过了一些罗塞塔石碑,如果我发现了它,处理起来std::stringasio::streambuf容易得多。是否应该放弃std::streambuf界面并使用asio::mutable_buffer,我可以摆脱asio::streambuf::prepare()

0 投票
1 回答
21236 浏览

c++ - 使用 boost::asio::streambuf

寻找一个 boost::asio (和他自己的 boost) 决定编写异步服务器。为了存储传入的数据,我使用 boost::asio::streambuf。在这里我有一个问题。当我从客户端收到第二条消息时,我看到缓冲区中包含来自先前消息的数据。虽然我在输入缓冲区调用 Consume 方法。怎么了?

0 投票
2 回答
3371 浏览

c++ - 带有 boost::asio::async_write 的流缓冲区

告诉我如何使用boost::asio::streambufwith boost::asio::async_write。我有一个连接到一个客户端的服务器应用程序。

我为每个连接创建 object tcp_connection

如果我需要向客户端发送多个连续消息,如何正确创建用于发送数据的缓冲区?

我是否需要同步调用 Send() 因为它们使用全局缓冲区来发送?还是我需要在调用之前创建一个单独的缓冲区async_write

例如,在使用 IOCP 的 Windows 中,我创建了自己的包含缓冲区的 OVERLAPPED 结构。我在调用 WSASend 之前创建一个缓冲区,并在操作完成后删除,从 OVERLAPPED 结构中提取它。即每个WSASend 都有自己的缓冲区。

怎么办boost::asio::async_write

我在这里上课tcp_connection

0 投票
2 回答
4794 浏览

c++ - 如何将streambuf复制到无符号字符数组?

如何将 streambuf 中的数据复制到无符号字符数组?下面的代码有编译器错误:

编译器错误是(在最后一行):

错误 C2784: 'std::basic_istream<_Elem,_Traits> &std::operator >>(std::basic_istream<_Elem,_Traits> &&,_Elem *)' : 无法推断 'std::basic_istream<_Elem, _Traits> &&' from 'boost::asio::streambuf' 1> D:\program\Microsoft Visual Studio 10.0\VC\include\istream(987) : 见 'std::operator >>' 的声明

错误 C2676:二进制“>>”:“boost::asio::streambuf”未定义此运算符或转换为预定义运算符可接受的类型

0 投票
0 回答
185 浏览

c++ - 重载 std::streambuf 以转义数据

std::ostream*我有一个外部库,它能够通过传递一个指针来写入一堆数据。它以二进制格式写入

我想将此数据写入包含其他内容的文本文件中,方法是将其转换为十六进制或 base64。

由于lib写入的数据可能非常大,我想避免将数据写入内存缓冲区,然后转换为文本格式。我想即时转换。

因此,我正在寻找如何为此重载 std::streambuf 。我需要重载overflow虚函数,我找到了必要的信息。

问题是,我应该写入文件ostream还是直接写入streambuf我可以使用的文件rdbuf()?是否允许直接写入 a stream stringbuf

提前致谢!

0 投票
1 回答
23948 浏览

c++ - boost::asio 从 socket 读取 n 个字节到 streambuf

我有一个序列化的结构,它是通过套接字发送的。我需要分块读取它,因为它的一个字段包含剩余数据的大小:我需要读取前几个字节,找出长度并读取其余部分。这就是我得到的:

我看过

但它只能读取数据到 boost::asio::buffer。我想知道我是否可以对 boost::asio::streambuf 做同样的事情?先感谢您。

0 投票
1 回答
788 浏览

c++ - std::ofstream 中的自定义流缓冲区

我知道在 中std::ostream,我可以streambuf通过在构造函数中这样声明来使用自定义:

以及之后设置它(与以前相同的前两行,但将最后一行更改为:

我的问题是:我怎样才能做到这一点std::ofstream?我希望能够覆盖方法xsgetn并在我自己的自定义类中xsputn实现并在我的.std::streambufofstreamofstream

0 投票
2 回答
582 浏览

c++ - 源自`boost::asio::streambuf`

我正在尝试创建我的类,它只是公共派生的,boost::asio::streambuf并添加了一些方法:

但是当我简单地替换boost::asio::streambufmy_super_streambuf出现错误:

我怎样才能正确地从中得出boost::asio::streambuf