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问题是:前缀是输出宽度的一部分!Try
wss问题是:前缀是输出宽度的一部分!试试wss谢谢@Aconcagua提供的线索

我认为我们可以使用std::ios_base::adjustfieldstd::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::adjustfieldstd::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;