Boost :: Format с массивом символов

Я огляделся по сторонам и не смог найти решения для хранения того, что возвращается из формата 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;
}

Я получаю ошибку:

ошибка: ожидалось выражение

Я не знаю, пропускаю ли я простое решение, но мне нужен const char * взамен. Существует большое количество кода, который сейчас нельзя переписать. Я работаю над VS2013 C ++

2

Решение

Вы можете использовать array_sink из boost iostreams:

Жить на Колиру

#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
1

Другие решения

Вы могли бы использовать Формат C ++ как более быстрая альтернатива Boost Format. Это позволяет форматировать непосредственно в массив символов:

#include "format.h"
int main()
{
unsigned int arr[5] = { 0x05, 0x04, 0xAA, 0x0F, 0x0D };
char buf[1024];
fmt::ArrayWriter writer(buf);
writer.write("{: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::MemoryWriter writer;
writer.write("{:02X}-{:02X}-{:02X}-{:02X}-{:02X}",
arr[0], arr[1], arr[2], arr[3], arr[4]);
}

Библиотека использует Python-подобный синтаксис строки формата, хотя и безопасна printf реализация также предоставляется.

отказЯ автор этой библиотеки.

0