Используя C++ fmtlib, есть ли более чистый способ добавить последовательность данных в строку, чем использование std::ostringstream?
Пакет fmtlib обеспечивает чистый, читаемый и быстрый способ форматирования строковых данных в C++, но я не могу найти чистый и читаемый способ использовать его для добавления последовательности данных в строку.
После долгих поисков я нашел рабочее решение, но оно гораздо более многословно, чем использование стандартного подхода с использованием стандартных потоков и шевронов. Я не могу привести ни одного / многих примеров этого с использованием fmtlib, поэтому я надеюсь, что какой-нибудь эксперт знает более аккуратный способ сделать это.
// Here is an fmtlib version of dump_line. I don't like it. using 'cout' seems cleaner and simpler.
virtual void dump_line( const char* msg, uint8_t* dataline )
{
fmt::memory_buffer out;
format_to(out, "{} :", msg);
for( int jj=0; jj<m_cacheStore.p_LineSize; jj++) {
format_to(out, " [{}]={}", jj, (int)dataline[jj] );
}
fmt::print("{}\n",fmt::to_string(out) );
}
// Here is the typical approach using cout and chevrons.
// Nice and simple.
virtual void dump_line( const char* msg, uint8_t* dataline )
{
cout << msg << " : " ;
for( int jj=0; jj<m_cacheStore.p_LineSize; jj++)
cout << " [" << jj << "]=" << (int)dataline[jj];
cout<<endl;
}
Я просто выгружаю массив stts в stdout, чтобы он выглядел так: [0]=2 [1]=0 [2]=0 [3]=0 [4]=1 [5]=0 [6]=0 [7]=0
1 ответ
Вы можете записать в выходной поток напрямую без промежуточного буфера:
virtual void dump_line(const char* msg, uint8_t* dataline) {
fmt::print("{} :", msg);
for (int jj=0; jj<m_cacheStore.p_LineSize; jj++) {
fmt::print(" [{}]={}", jj, dataline[jj]);
}
fmt::print("\n");
}
Обратите внимание, что вам не нужно разыгрывать dataline[jj]
в int
потому что в отличие от iostreams, {fmt} правильно обрабатывает uint8_t
,
Если вы хотите построить строку, вы можете написать memory_buffer
или пройти back_insert_iterator
в format_to
,