首页 > 解决方案 > 使用 C++ fmtlib,有没有比使用 std::ostringstream 更简洁的方法将数据序列附加到字符串?

问题描述

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

经过多次谷歌搜索,我想出了一个可行的解决方案,但它比使用标准流和 V 形的典型方法要冗长得多。我不能使用 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;
}

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

标签: c++stringformatappendfmt

解决方案


您可以直接写入输出流而无需中间缓冲区:

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.

如果您想构建一个字符串,您可以写入 amemory_buffer或传递back_insert_iteratorformat_to.


推荐阅读