You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:35:02