2017-03-01 2 views
0

Tenir compte de ce code:std :: setfill et std :: setw pour les flux d'entrée?

int xx; 
std::cin >> std::setfill('0') >> std::setw(4) >> xx; 

Lors de l'envoi 12 à l'entrée standard je me attends à la valeur de xx être 1200 et lors de l'envoi 12345 je m'y attendais pas à être 1234.

Cependant, il semble std::setfill et std::setw n'ont aucun effet et je reçois 12 et 12345 respectivement.

Est-ce un bug ou est-ce selon la norme? Y a-t-il un bon moyen d'obtenir la fonctionnalité attendue?

Notez également, lorsque je change le type de xx être std::string l'std::setw prend effet alors que std::setfill ne fait toujours pas.

Mon compilateur est gcc-7.0.1.

+3

Peut-être que je l'ai raté. Depuis quand 'std :: setfill' est-il supporté sur les opérations de flux * input *? Je sais que 'std :: setw' est, mais maintenant' std :: setfill' est trop ??? – WhozCraig

+0

non, c'est du code mal formé. –

+0

Je ne pense pas 'std :: setfill' supporté sur le flux d'entrée. http://en.cppreference.com/w/cpp/io/manip/setfill – Shravan40

Répondre

1

setw et setfill ne sont pas appliquées si universellement.

Il semble que vous souhaitiez imiter l'effet de formatage de l'entrée donnée dans une colonne à largeur fixe, puis la relire. La bibliothèque fournit des outils pour exactement cela:

int widen_as_field(int in, int width, char fill) { 
    std::stringstream field; 
    field << std::setw(width) << std::setfill(fill); 
    field << std::setiosflags(std::ios::left); 
    field << in; 
    int ret; 
    field >> ret; 
    return ret; 
} 

Demo.

Cette fonction ne coupera pas 12345 à 1234, cependant. Cela prendrait une autre conversion à travers string.

1

Conformément à la norme C, setfill se rapporte à sortie flux. En ce qui concerne le setw, il fonctionne pour le flux d'entrée lorsqu'il est utilisé avec char* ou string. Par exemple, suite à sorties programme abcd pour chaîne d'entrée abcdef (et 1234 pour 123456):

string a; 
cin >> setw(4) >> a; 
cout << a;