C++ 通过ostringstream格式化时,字符串和整数/浮点数可以混合使用吗
我试图完全理解如何使用C++ 通过ostringstream格式化时,字符串和整数/浮点数可以混合使用吗,c++,printf,ostringstream,C++,Printf,Ostringstream,我试图完全理解如何使用ostringstream使一些使用sprintf的代码现代化。问题在于替换生成随机或顺序数据的测试代码。下面是一个简化的示例: char num[6], name[26]; sprintf(num, "%05d", i); sprintf(name, "Customer # %d", i); 撇开长度计算的细节不谈,将结果复制到数组和空终止,num转换非常简单: ostringstream ostr; ostr <<
ostringstream
使一些使用sprintf
的代码现代化。问题在于替换生成随机或顺序数据的测试代码。下面是一个简化的示例:
char num[6], name[26];
sprintf(num, "%05d", i);
sprintf(name, "Customer # %d", i);
撇开长度计算的细节不谈,将结果复制到数组和空终止,num
转换非常简单:
ostringstream ostr;
ostr << setw(len) << setfill('0') << i;
给定i
的相同值,结果总是“Customer#123”,即无论left
、right
或internal
的组合是什么,也不管各个部分的位置如何,整数总是右对齐。似乎唯一的解决方案(我还没有尝试过)是首先将“Customer#”和I
连接到一个单独的ostringstream
上,然后将左对齐插入ostr
变量。我错过什么了吗?还有别的办法吗
更正:正如评论中所讨论的,在简化示例时,我忽略了第二个
sprintf
,它实际上负责正确填充名称。因此,还需要第二次输出到ostringsteam
。setw的目的是什么?它与相应的sprintf
call.IO修改器中的任何内容都不对应,例如std::setw
仅适用于调用operator@SamVarshavchik恐怕我简化得太多了。实际代码对名称执行两个sprintf,一个如图所示,另一个用空格填充,即类似于sprintf(name+strlen(name),“%*.s”,len-strlen(name),”)
ostringstream
对于复杂的格式设置并不方便,请尝试一下很棒的fmt
库基于Sam和Brian的上述评论以及我发现使用了第二个sprintf,我猜所需的格式可以实现如下:ostr
ostr << setw(len) << left << "Customer # " << i << setfill(' ');