问题标签 [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.
streambuf - boost streambuf消耗和提交,它是什么
我似乎无法很好地解释 consumer() 和 commit() 的真正含义,实际上我根本不了解 streambuf。
我的理解是streambuf只是一个字符数组。但是为什么在文档中,
所以实际上有很多缓冲区?什么是“输入序列”和“输出序列”?这是另外两个缓冲区吗?
下面的代码究竟做了什么?
当我调用 b.prepare() 时,它是否为 read() 分配了一个新缓冲区来放置数据?那么数据何时从该缓冲区传输到底层的 streambuf 缓冲区?我以为是commit(),但是
所以看起来提交实际上将数据从“输出序列”移动到“输入序列”,而没有提及用于存储数据的底层缓冲区!
c++ - 我应该使用另一个的 streambuf 创建一个临时的 ostream 吗?
假设我有一个函数,它接受一个ostream &
参数o
并写入该 ostream。一个operator <<
实现将是一个很好的例子。
在函数中,我可能想在流上指定格式选项。例如,我可能希望将一个数字打印为十六进制,无论o
它在传递给函数时是如何配置的。
其次,我可能希望能够对当前的格式化标志做出假设。例如,除非我另有要求,否则能够假设数字被格式化为十进制会很好。
最后,当函数退出时,我希望格式化选项o
与调用函数之前的格式选项相同,以便对调用者保持不变。这只是对呼叫者的礼貌问题。
到目前为止,我已经通过ostringstream
在函数中创建一个 local 来实现这一点,完成我所有的工作(包括设置格式选项),并在函数末尾 发送.str()
to 。这里的 StackOverflow 问题表明比我聪明的人也采用相同的方法。 但是,让我感到困扰的是,我在 ostringstreams 中保留了这么多数据,这些数据可能会更早地发送到输出(字符串可能会变得非常大)。o
我有两个问题:
1)创建一个临时的(基于堆栈的)ostream并在该ostream 上做我的工作是否合法、惯用、良好的形式等?o.rdbuf()
我自己的测试和cppreference.com上的页面似乎表明我可以。
2)我没有考虑过另一种更好的方法吗?
c++ - 如何在不复制的情况下将 std::string 的一部分放入流缓冲区?
我最近经常使用 boost asio,我发现我正在使用std::string
s 和asio::streambuf
s 相当多。streambuf
作为解析网络数据的一部分,我发现我正在尝试在s 和string
sa之间来回获取数据。一般来说,我不想乱用“格式化 io”,所以iostream
s 不是很有用。我发现,ostream::operator<<()
尽管有官方文档,但似乎将 my string
s传递给streambuf
s 不受干扰,istream::operator>>()
破坏了 my streambuf
s 的内容(正如您所期望的那样,因为它是“格式化的”)。
在我看来,标准库确实缺少大量迭代器和流对象来处理streambuf
s 和string
s 以及未格式化的 io。例如,如果我想将 a 的子字符串string
放入 astreambuf
中,如何在不创建 的副本的情况下做到这一点string
?一个基本的全进全出转移可以像这样完成:
印刷:
如果我只想将 a 的一部分streambuf
放入字符串中,那似乎真的很难,因为istreambuf_iterator
它不是随机访问迭代器并且不支持算术:
而且似乎没有任何方法可以直接使用string::iterator
s 将 a 的一部分转储string
到 a中streambuf
:
如果我不介意格式化 io,我总是可以string
从 a 中提取部分 s ,但我愿意——格式化的 io 几乎从来都不是我想要的:streambuf
印刷:
如果我对丑陋的副本没问题,我当然可以生成一个子字符串 -std::string::iterator
是随机访问......
印刷:
stdlib 也有奇怪的独立的std::getline()
,它可以让你拉出单独的行ostream
:
打印:消息=abcdefghijk lmnopqrs tuvwxyz 1234 5678
我觉得我错过了一些罗塞塔石碑,如果我发现了它,处理起来std::string
会asio::streambuf
容易得多。是否应该放弃std::streambuf
界面并使用asio::mutable_buffer
,我可以摆脱asio::streambuf::prepare()
?
c++ - 使用 boost::asio::streambuf
寻找一个 boost::asio (和他自己的 boost) 决定编写异步服务器。为了存储传入的数据,我使用 boost::asio::streambuf。在这里我有一个问题。当我从客户端收到第二条消息时,我看到缓冲区中包含来自先前消息的数据。虽然我在输入缓冲区调用 Consume 方法。怎么了?
c++ - 带有 boost::asio::async_write 的流缓冲区
告诉我如何使用boost::asio::streambuf
with boost::asio::async_write
。我有一个连接到一个客户端的服务器应用程序。
我为每个连接创建 object tcp_connection
。
如果我需要向客户端发送多个连续消息,如何正确创建用于发送数据的缓冲区?
我是否需要同步调用 Send() 因为它们使用全局缓冲区来发送?还是我需要在调用之前创建一个单独的缓冲区async_write
?
例如,在使用 IOCP 的 Windows 中,我创建了自己的包含缓冲区的 OVERLAPPED 结构。我在调用 WSASend 之前创建一个缓冲区,并在操作完成后删除,从 OVERLAPPED 结构中提取它。即每个WSASend 都有自己的缓冲区。
怎么办boost::asio::async_write
?
我在这里上课tcp_connection
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”未定义此运算符或转换为预定义运算符可接受的类型
c++ - 重载 std::streambuf 以转义数据
std::ostream*
我有一个外部库,它能够通过传递一个指针来写入一堆数据。它以二进制格式写入
我想将此数据写入包含其他内容的文本文件中,方法是将其转换为十六进制或 base64。
由于lib写入的数据可能非常大,我想避免将数据写入内存缓冲区,然后转换为文本格式。我想即时转换。
因此,我正在寻找如何为此重载 std::streambuf 。我需要重载overflow
虚函数,我找到了必要的信息。
问题是,我应该写入文件ostream
还是直接写入streambuf
我可以使用的文件rdbuf()
?是否允许直接写入 a stream
stringbuf
?
提前致谢!
c++ - boost::asio 从 socket 读取 n 个字节到 streambuf
我有一个序列化的结构,它是通过套接字发送的。我需要分块读取它,因为它的一个字段包含剩余数据的大小:我需要读取前几个字节,找出长度并读取其余部分。这就是我得到的:
我看过
但它只能读取数据到 boost::asio::buffer。我想知道我是否可以对 boost::asio::streambuf 做同样的事情?先感谢您。
c++ - std::ofstream 中的自定义流缓冲区
我知道在 中std::ostream
,我可以streambuf
通过在构造函数中这样声明来使用自定义:
以及之后设置它(与以前相同的前两行,但将最后一行更改为:
我的问题是:我怎样才能做到这一点std::ofstream
?我希望能够覆盖方法xsgetn
并在我自己的自定义类中xsputn
实现并在我的.std::streambuf
ofstream
ofstream
c++ - 源自`boost::asio::streambuf`
我正在尝试创建我的类,它只是公共派生的,boost::asio::streambuf
并添加了一些方法:
但是当我简单地替换boost::asio::streambuf
时my_super_streambuf
出现错误:
在
我怎样才能正确地从中得出boost::asio::streambuf
?