2011-05-06 14 views
16

Recientemente fui mordido por el hecho de que ios_base::width y/o el manipulador setw tienen que ser reset with every item written to the stream.¿Cuál es el problema con setw()?

Es decir, usted debe hacer esto:

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

En lugar de esto:

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

Ok, está bien.

Pero, ¿alguien sabe por qué se tomó esta decisión de diseño? ¿Hay algún razonamiento que me falta o es solo una esquina oscura del estándar?

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

+0

Véase también [¿Qué iomanip manipuladores son 'pegajoso'?] (Http: // stackoverflow.com/q/1532640/2778484). – chappjc

Respuesta

4

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

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

pero si era pegajosa a medida que mencionar:

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

y si quería un ancho diferente cada línea tengo que seguir configuración de ancho.

Por lo tanto, en esencia, ambos enfoques son casi los mismos, y me gustaría o no me gustaría dependiendo de lo que estoy haciendo ahora.

5

Las decisiones sobre qué manipuladores deberían afectar solo a la siguiente operación parecen basarse 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 hacerlo bien.

Los siguientes puntos me parecen relevantes:

  • some_stream << x simplemente debe funcionar bien la mayor parte del tiempo
  • código
  • más código que establece el ancho será inmediatamente o muy poco después transmitir el valor, por lo que no relacionada puede asumen que no habrá un poco de "pendiente" valor de ancho que afecta a su salida
  • setfill()no es relevante menos que haya una pendiente de setw(), por lo que no afectará negativamente a la declaración some_stream << x superando nuestra lista
    • sólo cuando la anchura se está estableciendo de forma explícita, el programador puede/debe considerar si el estado carácter de relleno es apropiado también, en función de su conocimiento del contexto más amplio de llamar
  • que es muy común que una conjunto de valores para usar el mismo carácter de relleno
  • otros manipuladores como hex y oct son persistentes, pero su uso está típicamente en un bloque de código que, o bien aparece el estado anterior o (desagradable pero más fácil) establece de nuevo a decimal

El punto que sale de esto que responde su pregunta ...

  • setw() si eran presistent, sería necesario volver a programar entre cada declaración de streaming para evitar relleno deseado ...
+6

Me parece que 'hex 'es pegajoso es tan arbitrario como' setw' es lo opuesto ... pero tiene un voto a favor de minuciosidad (: – jwd

Cuestiones relacionadas