2016-12-26 104 views
0

我需要在控制檯中打印十六進制和十進制值。我使用下面的一段代碼來完成它。重置std :: stringstream格式標誌

std::stringstream ss; 

ss << "0x" << std::uppercase << std::hex << 15;  
std::cout << ss.str() << std::endl; 

ss.str(""); 
ss.clear(); 

ss << 15; 
std::cout << ss.str() << std::endl; 

但我得到兩個值的十六進制格式。如何重置stringstream?

+1

[重置字符串流]的可能重複(http://stackoverflow.com/questions/7623650/resetting-a-stringstream) – pSoLT

+0

@pSoLT不可以! ... –

回答

1

如何重置stringstream?

格式標誌是粘性的。

您可以保存舊格式標誌後恢復它們:

std::stringstream ss; 
auto oldFlags = ss.flags(); // << 

ss << "0x" << std::uppercase << std::hex << 15;  
std::cout << ss.str() << std::endl; 

ss.flags(oldFlags); // << 

ss << 15; 
std::cout << ss.str() << std::endl; 
0

假設你知道哪些格式標誌的實際使用,你可以保存自己的原始值並在以後恢復它們。當被改變了一套格式化標誌的大,可能稍稍偏出功能的控制,主要有兩種方式這兩者都是不幸的是,不是真的很便宜:

  1. 不要直接使用std::stringstream而是使用其得到應用的格式標誌的臨時流:

    { 
        std::ostream out(ss.rdbuf()); 
        out << std::showbase << std::uppercase << std::hex << 15; 
    } 
    ss << 15; 
    
  2. 可以使用copyfmt()成員複製所有格式的標誌,後來恢復這些:

    std::ostream aux(0); // sadly, something stream-like is needed... 
    out.copyfmt(ss); 
    out << std::showbase << std::uppercase << std::hex << 15; 
    ss.copyfmt(aux); 
    out << 15; 
    

這兩種方法都需要創建一個流是,不幸的是,不是真快,由於幾個主要的強制性同步(主要是爲創建std::locale成員)。