setprecision ejemplo biblioteca c++ c++-standard-library setw

c++ - ejemplo - ¿Cuál es el trato con setw()?



setw n in c++ (2)

Recientemente me ha mordido el hecho de que ios_base::width y / o el manipulador de la setw tienen que restablecerse con cada elemento escrito en el flujo .

Es decir, debes hacer esto:

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

En vez de esto:

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

Está bien.

¿Pero alguien sabe por qué se tomó esta decisión de diseño? ¿Hay alguna razón que me esté perdiendo, o es solo una esquina oscura de la norma?

Otros modificadores de formato de flujo (como se menciona en la pregunta SO vinculada) son "pegajosos", mientras que setw no lo es.


La forma en que lo veo es: siempre puede hacer algo como lo siguiente si desea que se aplique de manera uniforme.

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

pero si fue pegajoso como mencionas:

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

y si quisiera un ancho diferente cada línea tengo que seguir configurando el ancho.

Esencialmente, ambos enfoques son casi iguales, y me gustaría o no me gustan según lo que esté haciendo ahora.


Las decisiones de qué manipuladores deben afectar solo a la siguiente operación parecen estar basadas en observaciones lógicas y empíricas sobre lo que tiende a factorizar mejor las necesidades funcionales comunes, y por lo tanto, es más fácil para el programador escribir y hacer las cosas bien.

Los siguientes puntos me parecen relevantes:

  • some_stream << x debería funcionar correctamente la mayor parte del tiempo
  • la mayoría del código que establece el ancho inmediatamente o muy poco después transmitirá el valor, por lo que el código no relacionado puede asumir que no habrá un valor de ancho "pendiente" que afecte su salida
  • setfill() no es relevante a menos que haya un setw() pendiente, por lo que no afectará adversamente la declaración some_stream << x encabezando nuestra lista
    • solo cuando el ancho se establece explícitamente, el programador puede / debe considerar si el estado del carácter de relleno también es apropiado, en función de su conocimiento del contexto de llamada más amplio
  • es muy común que un conjunto de valores use el mismo carácter de relleno
  • otros manipuladores, como hex y oct son persistentes, pero su uso suele ser en un bloque de código que aparece en el estado anterior o (desagradable pero más fácil) lo vuelve a establecer en decimal

El punto principal de esto que responde a tu pregunta ...

  • si setw() estuviera presente, habría que restablecerlo entre cada instrucción de transmisión para evitar el llenado no deseado ...