¿Cuál es el trato con setw ()?
-
29-10-2019 - |
Pregunta
Recientemente fui mordido por el hecho de que ios_base::width
y/o el setw
el manipulador tiene que ser reiniciar con cada artículo escrito en la transmisión.
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 justificación que me falte, o es solo un rincón oscuro del estándar?
Otros modificadores de formato de transmisión (como se menciona en la pregunta vinculada) son 'pegajosos', mientras que setw
no es.
Solución
La forma en que lo veo: siempre puedes hacer algo como a continuación si quieres 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 quería un ancho diferente en cada línea, tengo que seguir configurando el ancho.
Así que esencialmente ambos enfoques son casi los mismos, y me gustaría o no me gustan dependiendo de lo que esté haciendo ahora.
Otros consejos
Las decisiones de las cuales los manipuladores deberían afectar solo la próxima operación parecen basarse en observaciones lógicas y empíricas sobre lo que tiende a tener en cuenta las necesidades funcionales comunes y, por lo tanto, ser más fácil para el programador escribir y hacer lo correcto.
Los siguientes puntos me parecen relevantes:
some_stream << x
debería funcionar bien 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 suponer que no habrá algún valor de ancho "pendiente" que afecte su salida
setfill()
no es relevante A menos que haya una pendientesetw()
, por lo que no afectará negativamente elsome_stream << x
Declaración que encabeza nuestra lista- Solo cuando el ancho se establece explícitamente, el programador puede/debe considerar si el estado de carácter de llenado también es apropiado, en función de su conocimiento del contexto de llamadas más amplio
- Es muy común que un conjunto de valores use el mismo carácter de relleno
- Otros manipuladores como
hex
yoct
son persistentes, pero su uso suele estar en un bloque de código que aparece el estado anterior o (desagradable pero más fácil) lo establece en decimal
El punto que conduce de esto que responde tu pregunta...
- si
setw()
estaban presistentes, debería restablecerse entre cada declaración de transmisión para evitar el relleno no deseado ...