C++ stringstream的showbase和前导零
代码如下:C++ stringstream的showbase和前导零,c++,hex,wostringstream,C++,Hex,Wostringstream,代码如下: std::wstringstream wss; wss.setf(std::ios_base::hex, std::ios_base::basefield); wss.setf(std::ios_base::showbase); // wss << std::showbase; // wss.width(2); wss.fill('0'); wss << std::setw(2) << 7; // wss << std:
std::wstringstream wss;
wss.setf(std::ios_base::hex, std::ios_base::basefield);
wss.setf(std::ios_base::showbase);
// wss << std::showbase;
// wss.width(2);
wss.fill('0');
wss << std::setw(2) << 7;
// wss << std::noshowbase;
wss.unsetf(std::ios_base::showbase);
wss << std::setw(2) << 0;
wss << std::setw(2) << 20;
wss << std::setw(2) << 6;
auto ret = wss.str();
std::wstringstream wss;
setf(std::ios_base::hex,std::ios_base::basefield);
setf(std::ios_base::showbase);
//wss问题是:前缀是输出宽度的一部分!Trywss问题是:前缀是输出宽度的一部分!试试wss谢谢@Aconcagua提供的线索
我认为我们可以使用std::ios_base::adjustfield和std::ios_base::internal这样做:
wss.setf(std::ios_base::hex, std::ios_base::basefield);
int oldFlag = wss.setf(std::ios_base::internal, std::ios_base::adjustfield);
然后
wss.setf(std::ios_base::showbase);
wss.fill('0');
wss << std::setw(4) << 7;
wss.unsetf(std::ios_base::showbase);
// wss.setf(oldFlag);
wss << std::setw(2) << 0;
wss << std::setw(2) << 20;
wss << std::setw(2) << 6;
wss.setf(std::ios_base::showbase);
wss.fill('0');
wss感谢@Aconcagua提供的线索
我认为我们可以使用std::ios_base::adjustfield和std::ios_base::internal这样做:
wss.setf(std::ios_base::hex, std::ios_base::basefield);
int oldFlag = wss.setf(std::ios_base::internal, std::ios_base::adjustfield);
然后
wss.setf(std::ios_base::showbase);
wss.fill('0');
wss << std::setw(4) << 7;
wss.unsetf(std::ios_base::showbase);
// wss.setf(oldFlag);
wss << std::setw(2) << 0;
wss << std::setw(2) << 20;
wss << std::setw(2) << 6;
wss.setf(std::ios_base::showbase);
wss.fill('0');
wss感谢您的回复@Aconcagua!感谢您的回复@Aconcagua!这也很好,甚至更好,因为使用<代码> SkyBase< /C>和 Actudio==内部< /C> >选择C++标准中定义的默认前缀(可以集成到我的解决方案中),并且通过直接使用标志,避免像我的转换器那样设置和重置它们。请注意,您需要将字符类型强制转换为更大的整数,以防止打印ASCII而不是数字(此外,您需要将前缀长度添加到宽度,但您已经注意到了…)。这也很好,甚至更好,使用“<代码> SkyBase<代码> >代码> CudioField=内部内嵌代码>选择C++标准中定义的默认前缀(尽管可以集成到我的解决方案中),并且通过直接使用标志,避免像我的转换器那样设置和重置它们。请注意,您需要将字符类型强制转换为更大的整数,以防止打印ASCII而不是数字(此外,您需要将前缀长度添加到宽度,但您已经注意到…)。
wss.setf(std::ios_base::showbase);
wss.fill('0');
wss << std::setw(4) << 7;
wss.unsetf(std::ios_base::showbase);
// wss.setf(oldFlag);
wss << std::setw(2) << 0;
wss << std::setw(2) << 20;
wss << std::setw(2) << 6;