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:
#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
实现。
免责声明:我是这个库的作者。
我环顾四周,但无法找到一种解决方案来将 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:
#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
实现。
免责声明:我是这个库的作者。