我已经环顾四周,我一直无法找到一个解决方案来存储从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
实现。
免责声明:我是这个库的作者。