如何使用asio::stream_file::async_write_some输出多行内容?
问题:boost::asio::stream_file::async_write_some仅写入首个缓冲区内容的解决方法
使用asio::stream_file::async_write_some的缓冲区序列重载时,发现仅首个缓冲区内容被写入文件,不想通过逐个缓冲区注册回调的方式解决,寻求简洁方案。
问题代码
#include <iostream> #include <string> #include <vector> #include <boost/asio.hpp> #include <boost/asio/stream_file.hpp> namespace asio = boost::asio; // 省略其他代码... const std::vector<std::string> lines{ "first line\n", "second line\n", "third line\n" }; std::vector<asio::const_buffer> buffers; buffers.reserve(lines.size()); for (const auto& line : lines) { buffers.push_back(asio::buffer(line.data(), line.size())); } asio::io_context ctx; const char* output_path = R"(C:\Users\MyUsername\workspace\temp\lines.txt)"; asio::stream_file stream(ctx); stream.open( output_path, asio::stream_file::write_only|asio::stream_file::create ); stream.async_write_some( buffers, [](boost::system::error_code e, size_t n) { if (e != boost::system::errc::success) { std::cerr << "error, ec=" << e << " size=" << n << std::endl; } } ); ctx.run();
运行后文件仅包含first line\n,操作系统为Windows 10,Boost.ASIO版本103002,Visual Studio Community 17.11.4。
解决方案
问题出在async_write_some的设计特性上:它仅保证写入至少一个字节,不会自动处理剩余缓冲区的写入,所以只会完成首个缓冲区的部分或全部写入就触发回调。
要一次性写入整个缓冲区序列,应该使用**asio::async_write**——这是一个组合操作,内部会自动循环调用async_write_some,直到所有缓冲区的数据都写入完成,才会触发一次回调。
修改后的核心代码如下:
// 替换原有的stream.async_write_some调用 asio::async_write( stream, buffers, [](boost::system::error_code e, size_t n) { if (e != boost::system::errc::success) { std::cerr << "error, ec=" << e << " size=" << n << std::endl; } } );
这样修改后,程序会将所有缓冲区的内容完整写入文件,无需手动拆分缓冲区或多次注册回调。
内容的提问来源于stack exchange,提问作者ykim
相关产品推荐
相关产品推荐

