2016-12-26 1 views
0

J'ai besoin d'imprimer des valeurs hexadécimales et décimales dans ma console. J'ai utilisé le morceau de code suivant pour le faire.Réinitialisation des indicateurs de format 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; 

Mais j'obtiens les deux valeurs au format hexadécimal. Comment réinitialiser la chaîne strings?

+1

Copie possible de [réinitialisation d'une chaîne de caractères] (http://stackoverflow.com/questions/7623650/resetting-a-stringstream) – pSoLT

+0

@pSoLT Nope! ... –

Répondre

1

Comment réinitialiser la chaîne strings?

Les drapeaux de format sont collants.

Vous pouvez enregistrer les vieux drapeaux de format pour les restaurer plus tard:

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

En supposant que vous savez que le formatage drapeau sont effectivement utilisés, vous pouvez simplement enregistrer leur valeur d'origine et les restaurer plus tard. Lorsque l'ensemble de mise en forme des drapeaux étant changé est grande et peut-être un peu hors du contrôle de la fonction, il y a essentiellement deux approches à la fois, malheureusement, pas vraiment pas cher:

  1. Ne pas utiliser les std::stringstream directement mais plutôt d'utiliser un flux temporaire auquel les drapeaux de format s'appliquent:

    { 
        std::ostream out(ss.rdbuf()); 
        out << std::showbase << std::uppercase << std::hex << 15; 
    } 
    ss << 15; 
    
  2. Vous pouvez utiliser le membre copyfmt() pour copier tous les drapeaux de mise en forme, puis restaurer ces:

    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; 
    

Les deux approches doivent créer un flux qui est, malheureusement, pas vraiment rapide en raison de quelques synchronisations essentiellement obligatoires (principalement pour la création du membre std::locale).