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.

¿Fue útil?

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 pendiente setw(), por lo que no afectará negativamente el some_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 y oct 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 ...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top