Necesito imprimir valores hexadecimales y decimales en mi consola. Usé el siguiente código para hacerlo.

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;

Pero obtengo ambos valores en formato hexadecimal. ¿Cómo restablecer stringstream?

2
Arun 26 dic. 2016 a las 15:55

3 respuestas

La mejor respuesta

¿Cómo restablecer stringstream?

Las banderas de formato son adhesivas.

Puede guardar los marcadores de formato antiguo para restaurarlos más tarde:

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;
5
πάντα ῥεῖ 26 dic. 2016 a las 12:59

Suponiendo que sabe qué marca de formato se usa realmente, puede guardar su valor original y restaurarlo más tarde. Cuando el conjunto de indicadores de formato que se cambia es grande y posiblemente algo fuera del control de la función, existen esencialmente dos enfoques que, lamentablemente, no son muy baratos:

  1. No utilice el std::stringstream directamente, sino que utilice una secuencia temporal a la que se apliquen los indicadores de formato:

    {
        std::ostream out(ss.rdbuf());
        out << std::showbase << std::uppercase << std::hex << 15;
    }
    ss << 15;
    
  2. Puede usar el miembro copyfmt() para copiar todos los indicadores de formato y luego restaurarlos:

    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;
    

Ambos enfoques deben crear una secuencia que, desafortunadamente, no sea realmente rápida debido a algunas sincronizaciones esencialmente obligatorias (principalmente para crear el miembro std::locale).

1
Dietmar Kühl 26 dic. 2016 a las 13:17

Sólo úselo

std::nouppercase

ss << std::uppercase;    
...

ss << std::nouppercase;

...
1
Evan Conrad 7 feb. 2019 a las 04:16