2009-10-03 5 views
15

J'ai une ligne de code qui définit la valeur de remplissage à un caractère '-' dans ma sortie, mais j'ai besoin de réinitialiser l'indicateur setfill à son caractère par défaut. Comment je fais ça?C++ - Comment réinitialiser les drapeaux du manipulateur de flux de sortie

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

Je pensais que cela pourrait fonctionner:

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

Suis-je sur la mauvaise voie?

Répondre

9

Vous pouvez utiliser la fonction ios::fill() pour définir et restaurer le caractère de remplissage à la place.

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

Jetez un oeil à la Boost.IO_State_Savers, fournissant des gardes de portée de style RAII pour les drapeaux d'un iostream.

Exemple:

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

gardes plus spécialisés (pour remplir seulement, ou de la largeur ou la précision, etc ... sont également dans la bibliothèque Voir la documentation pour plus de détails

+0

Grande réponse, devrait être celui qui est accepté. – gd1

+3

@ gd1: Bonne réponse, mais pas _great_, car je dois inclure Boost juste pour sauvegarder les flags de l'iostream. – Isaac

+1

@Isaac: en C++, il me semble que vous utilisez boost ou que vous finissez par le réimplémenter, ou attendez Boost.Quelque chose soit inclus dans la norme. – gd1

11

Vous pouvez utiliser.. copyfmt pour enregistrer la mise en forme initiale cout. Une fois que vous avez terminé avec une sortie formatée, vous pouvez l'utiliser à nouveau pour restaurer les paramètres par défaut (y compris caractère de remplissage).

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

Surpris personne n'a posté cela plus tôt :) Rouler dans un garde RAII serait bien, au cas où une exception est levée. Avoir rencontré dans ce problème dans un cadre de journalisation. –

+0

Est-ce que cela fonctionne sur tous les systèmes? Quand je l'essaye, mon std :: cout refuse de sortir quoi que ce soit après ... jamais! – 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

Cela le définit à ''' ', ce qui peut être ou ne pas être la valeur qu'il avait avant le premier' setfill'. –

0

Le caractère nul réinitialiserons à l'état d'origine: setfill('\0')

Questions connexes