2009-10-03 6 views
15

Ho una riga di codice che imposta il valore di riempimento su un carattere '-' nel mio output, ma è necessario reimpostare il flag di setfill sul suo carattere di spaziatura predefinito. Come lo faccio?C++ - Come reimpostare i flag di manipolazione del flusso di output

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

Ho pensato che questo potrebbe funzionare:

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

Am I sulla strada sbagliata?

risposta

9

È possibile utilizzare la funzione ios::fill() per impostare e ripristinare il carattere di riempimento.

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

Date un'occhiata al Boost.IO_State_Savers, fornendo guardie scope RAII in stile per le bandiere di un iostream.

Esempio: guardie

#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 
} 

più specializzati (solo per riempire, o larghezza, o la precisione, ecc ... sono anche nella biblioteca Vedere la documentazione per i dettagli

+0

Grande risposta, dovrebbe essere quella accettata. – gd1

+3

@ gd1: buona risposta, ma non _great_, in quanto devo includere Boost solo per salvare i flag iostream. – Isaac

+1

@Isaac: in C++, mi sembra che si usi boost o si finisca per reimplementarlo o attendere Boost. Qualcosa da includere nello standard. – gd1

11

È possibile utilizzare.. copyfmt per salvare la formattazione iniziale di cout. Una volta finito con output formattato è possibile utilizzarlo di nuovo per ripristinare le impostazioni predefinite (compresa carattere di riempimento).

{ 
    // 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

Sorpreso che nessuno l'abbia postato prima :) Portarlo in una guardia RAII sarebbe comunque buono, nel caso in cui venga lanciata un'eccezione. Sono incappato in quel problema in un framework di registrazione. –

+0

Funziona su tutti i sistemi? Quando lo provo, il mio std :: cout si rifiuta di produrre qualcosa dopo ... sempre! – 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

Questo lo imposta su '''', che può essere o non essere il valore che aveva prima del primo 'setfill'. –

0

Il carattere null si resetterà nuovamente allo stato originale: setfill('\0')

Problemi correlati