使用 C++ {fmt},是否有比使用 std::ostringstream 更干净的方法将数据序列附加到字符串?

问题描述 投票:0回答:1

{fmt} 库提供了一种干净、可读且快速的方法来格式化 C++ 中的字符串数据,但我找不到一种干净且可读的方法来使用它将数据序列附加到字符串。

经过多次谷歌搜索,我提出了一个可行的解决方案,但它比使用标准流和 V 形的典型方法要冗长得多。我无法使用 {fmt} 提供任何/许多示例,因此我希望那里的一些专家知道一种更简洁的方法。

 // Here is an {fmt} 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;
}

我只是将一个整数数组转储到标准输出,如下所示: [0]=2 [1]=0 [2]=0 [3]=0 [4]=1 [5]=0 [6]=0 [7]=0

c++ string format append fmt
1个回答
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
,因为与 iostream 不同,{fmt} 可以正确处理
uint8_t

如果您想构建一个字符串,您可以写入

memory_buffer
或将
back_insert_iterator
传递给
format_to

© www.soinside.com 2019 - 2024. All rights reserved.