提升 streambuf 并编写奇怪的行为

Posted

技术标签:

【中文标题】提升 streambuf 并编写奇怪的行为【英文标题】:Boost streambuf and write weird behaviour 【发布时间】:2016-05-27 16:25:17 【问题描述】:

我使用streambuf作为串口通信的存储

io_service io;
serial_port sp(io);
sp.open("COM4");
sp.set_option( serial_port_base::baud_rate( 115200 ) );
sp.set_option( serial_port_base::character_size( 8 ) );
sp.set_option( serial_port_base::stop_bits( serial_port_base::stop_bits::one )  );
sp.set_option( serial_port_base::parity( serial_port_base::parity::none ) );
sp.set_option( serial_port_base::flow_control( serial_port_base::flow_control::none )   );
boost::asio::streambuf buffer;
// Fill buffer here
auto size = buffer.size();
std::cout << boost::format("Buffer size: %d") % size << std::endl;
boost::asio::write( sp, buffer );
size = buffer.size();
std::cout << boost::format("Buffer size: %d" ) % size << std::endl;

输出:

Buffer size: 8
Buffer size: 0

为什么方法size()返回不同的值?

【问题讨论】:

你能详细说明为什么在你写出缓冲区之后,你希望它有一个非零大小吗? @MarkB 我希望串行端口或套接字上的写操作不会修改我的存储缓冲区。通常任何写入方法都不会修改源代码。也许我对 sreambuf 的解释不正确? 【参考方案1】:

boost::asio::write() 操作消耗streambuf 的输入序列,streambuf::size() 返回输入序列的大小。

在这种特殊情况下,streambuf 的输入序列在 write() 操作之前包含 8 个字节。 write() 操作会阻塞,直到输入序列中的所有数据都已写入或发生错误。 write() 操作成功,consuming 来自输入序列的 8 个字节,并返回一个值,表示已传输 8 个字节。由于所有输入序列都已被消耗,streambuf.size() 返回 0。

有关 streambuf 使用的更多信息,请考虑阅读this 答案。

【讨论】:

以上是关于提升 streambuf 并编写奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章

switch 语句中的奇怪行为

Perl 字符串连接的奇怪行为

JavaScript递归奇怪的行为?

iOS 7 上消息编辑器的奇怪行为

os.popen().readlines 的奇怪行为[重复]

传递包含“!!!!”的字符串时 argv 的奇怪行为