Boost::Format 使用字符数组

Boost::Format with char array

我环顾四周,但无法找到一种解决方案来将 return 从 boost 格式编辑的内容存储到 char 数组中。例如:

#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;
}

我收到错误:

错误:需要一个表达式

我不知道我是否只是忽略了一个简单的解决方案,但我需要 return 中的 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

您可以使用 the {fmt} library 作为 Boost 格式的更快替代品。它允许直接格式化为字符数组:

#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 实现。

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