2009-10-03 11 views
15

Tengo una línea de código que establece el valor de relleno en un carácter '-' en mi salida, pero necesito restablecer el indicador de relleno a su carácter de espacio en blanco predeterminado. ¿Cómo puedo hacer eso?C++ - Cómo restablecer los indicadores del manipulador de flujo de salida

cout << setw(14) << " CHARGE/ROOM" << endl; 
cout << setfill('-') << setw(11) << '-' << " " << setw(15) << '-' << " " << setw(11) << '-' << endl; 

pensé que esto podría funcionar:

cout.unsetf(ios::manipulatorname) // Howerver I dont see a manipulator called setfill 

Estoy en el camino equivocado?

Respuesta

9

Puede usar la función ios::fill() para establecer y restaurar el carácter de relleno en su lugar.

http://www.cplusplus.com/reference/iostream/ios/fill/

#include <iostream> 
using namespace std; 

int main() { 
    char prev; 

    cout.width (10); 
    cout << 40 << endl; 

    prev = cout.fill ('x'); 
    cout.width (10); 
    cout << 40 << endl; 

    cout.fill(prev); 

    return 0; 
} 
26

Tener un vistazo a la Boost.IO_State_Savers, proporcionando guardias alcance de estilo RAII de las banderas de un iostream.

Ejemplo: guardias

#include <boost/io/ios_state.hpp> 

{ 
    boost::io::ios_all_saver guard(cout); // Saves current flags and format 

    cout << setw(14) << " CHARGE/ROOM" << endl; 
    cout << setfill('-') << setw(11) << '-' << " " << setw(15) << '-' << " " << setw(11) << '-' << endl; 
// dtor of guard here restores flags and formats 
} 

más especializados (por sólo llenan, o la anchura, o la precisión, etc ... También se encuentran en la biblioteca Ver la documentación para más detalles

+0

Gran respuesta, debe ser el aceptado. – gd1

+3

@ gd1: Buena respuesta, pero no _grandes_, ya que tengo que incluir Boost solo para guardar las banderas iostream. – Isaac

+1

@Isaac: en C++, me parece que o bien usas boost o terminas volviendo a implementarlo, o esperas que Boost.Algo se incluya en el estándar. – gd1

11

Puede usar.. copyfmt para guardar el formato inicial de cout. Una vez terminado con salida con formato que se puede utilizar de nuevo para restaurar la configuración por defecto (incluyendo el carácter de relleno ).

{ 
    // save default formatting 
    ios init(NULL); 
    init.copyfmt(cout); 

    // change formatting... 
    cout << setfill('-') << setw(11) << '-' << " "; 
    cout << setw(15) << '-' << " "; 
    cout << setw(11) << '-' << endl; 

    // restore default formatting 
    cout.copyfmt(init); 
} 
+0

Sorprendido, nadie publicó esto antes :) Sin embargo, convertirlo en un guardia de RAII sería bueno, en caso de que se produzca una excepción. Me he encontrado con ese problema en un marco de trabajo de registro. –

+0

¿Funciona eso en todos los sistemas? Cuando lo intento, mi std :: cout se niega a producir nada después ... ¡nunca! – BitTickler

1
// simply set it back 
float number = 4.5; 
cout << setfill('-'); 
cout << setw(11) << number << endl; // --------4.5 
cout << setfill(' '); 
cout << setw(11) << number << endl; // 4.5 
+2

Eso lo establece en '''', que puede ser o no el valor que tenía antes del primer 'setfill'. –

0

El carácter nulo se restablecerá de nuevo a su estado original: setfill('\0')

Cuestiones relacionadas