Boost::使用字符数组格式化



我已经环顾四周,我一直无法找到一个解决方案来存储从boost格式返回到字符数组。例如:

#include "stdafx.h"
#include <iostream>
#include <boost/format.hpp>
int main()
{
    unsigned int arr[5] = { 0x05, 0x04, 0xAA, 0x0F, 0x0D };
    char buf[1024];
    buf[] = boost::format("%02X-%02X-%02X-%02X-%02X") // error on this line
        % arr[0]
        % arr[1]
        % arr[2]
        % arr[3]
        % arr[4];
    system("pause");
    return 0;
}

我得到错误:

错误:expected an expression

我不知道我是否忽略了一个简单的解决方案,但是我需要一个const char*作为返回。目前有大量的代码无法重写。我正在开发VS2013 c++

可以使用boost iostreams中的array_sink:

Live On Coliru

#include <iostream>
#include <boost/format.hpp>
#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/stream.hpp>
namespace io = boost::iostreams;
int main()
{
    unsigned int arr[5] = { 0x05, 0x04, 0xAA, 0x0F, 0x0D };
    char buf[1024];
    io::stream<io::array_sink> as(buf);
    as << boost::format("%02X-%02X-%02X-%02X-%02X")
        % arr[0]
        % arr[1]
        % arr[2]
        % arr[3]
        % arr[4];

    // to print `buf`:
    std::cout.write(buf, as.tellp());
}

打印

05-04-AA-0F-0D

您可以使用{fmt}库作为Boost Format的更快替代方案。它允许直接格式化成字符数组:

#include <fmt/format.h>
int main() {
  unsigned int arr[5] = { 0x05, 0x04, 0xAA, 0x0F, 0x0D };
  char buf[1024];
  fmt::format_to(buf, "{:02X}-{:02X}-{:02X}-{:02X}-{:02X}",
                 arr[0], arr[1], arr[2], arr[3], arr[4]);
}

或者,更好的是,它可以自动分配数组(在这种情况下,它将完全在堆栈上分配,因此与固定缓冲区相比没有性能损失):

#include "format.h"
int main() {
  unsigned int arr[5] = { 0x05, 0x04, 0xAA, 0x0F, 0x0D };
  fmt::memory_buffer buf;
  fmt::format_to(buf, "{:02X}-{:02X}-{:02X}-{:02X}-{:02X}",
                 arr[0], arr[1], arr[2], arr[3], arr[4]);
}

该库使用类似python的格式字符串语法,尽管也提供了安全的printf实现。

免责声明:我是这个库的作者。

最新更新