Question

J'ai récemment été mordu par le fait que ios_base::width et/ou le setw le manipulateur doit être réinitialisé avec chaque élément écrit dans le flux.

Autrement dit, vous devez faire ceci :

while(whatever)
{
    mystream << std::setw(2) << myval;
}

Plutôt que ça :

mystream.width(2);
while(whatever)
{
    mystream << myval;
}

OK bien.

Mais est-ce que quelqu'un sait pourquoi cette décision de conception a été prise ?Y a-t-il une justification qui me manque, ou s'agit-il simplement d'un coin sombre de la norme ?

D'autres modificateurs de formatage de flux (comme mentionné dans la question SO liée) sont « collants », tandis que setw n'est pas.

Était-ce utile?

La solution

La façon dont je le vois est :Vous pouvez toujours faire quelque chose comme ci-dessous si vous souhaitez que cela soit appliqué uniformément.

int width =2;
while(whatever)
{
    mystream << std::setw(width) << myval;
}

mais si c'était collant comme vous le mentionnez :

mystream.width(2);
while(whatever)
{
    mystream << myval;
}

et si je voulais une largeur différente à chaque ligne, je dois continuer à définir la largeur.

Donc, essentiellement, les deux approches sont presque les mêmes, et je les aimerais ou ne les aimerais pas en fonction de ce que je fais maintenant.

Autres conseils

Les décisions quant aux manipulateurs qui devraient affecter uniquement l'opération suivante semblent être basées sur des observations logiques et empiriques sur ce qui tend à mieux prendre en compte les besoins fonctionnels communs, et donc à être plus facile à écrire et à faire pour le programmeur.

Les points suivants me paraissent pertinents :

  • some_stream << x devrait fonctionner correctement la plupart du temps
  • la plupart du code qui définit la largeur diffusera la valeur immédiatement ou très peu de temps après, donc un code sans rapport peut supposer qu'il n'y aura pas de valeur de largeur "en attente" affectant sa sortie
  • setfill() n'est pas pertinent sauf s'il y a un en attente setw(), cela n'affectera donc pas négativement le some_stream << x déclaration en tête de notre liste
    • ce n'est que lorsque la largeur est explicitement définie que le programmeur peut/doit déterminer si l'état du caractère de remplissage est également approprié, en fonction de sa connaissance du contexte d'appel plus large.
  • il est très courant qu'un ensemble de valeurs utilise le même caractère de remplissage
  • d'autres manipulateurs comme hex et oct sont persistants, mais leur utilisation se fait généralement dans un bloc de code qui affiche l'état précédent ou (méchant mais plus facile) le rétablit en décimal.

Le point qui en découle et qui répond ta question...

  • si setw() étaient présents, il faudrait le réinitialiser entre chaque instruction de streaming pour éviter un remplissage indésirable...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top