Используя 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,

Другие вопросы по тегам