2010-02-26 14 views
5

que he visto que la gente hace cosas como ....iostream, algunas preguntas

istringstream ibuf; 

if (ibuf >> zork >> iA >> Comma >> iB) 

ahora supongo que el valor depende de lo que expone >> iB pero exactamente lo que es y lo que significa? ¿Verdadero significa que todas las ietms fueron extraídas?

Además, después de una expresión como

ibuf >> zork >> iA >> Comma >> iB; 

¿hay alguna manera de saber cuántos personajes y objetos donde extraen?

Respuesta

3

Esto funciona debido a dos propiedades de los objetos IStream:

  • iStreams regresan a sí mismos después de cada extracción (el operador >>) para permitir el encadenamiento de múltiples extracciones (a >> b >> c)
  • iStreams devuelven su estado (como si .good() se llamaron) cuando se emiten/convierten a bool, a través de la sobrecarga bool operator !()

Básicamente, el código que escribió es de corta duración rsión de:

if (((((ibuf >> zork) >> ia) >> Comma) >> ib).good()) { 

} 

Una vez que todas las extracciones se han producido, se conserva solamente if (ibuf) que es implícitamente como escribir if ((bool)ibuf), que comprueba ibuf.good().

No hay forma de obtener el número de caracteres extraídos en una serie de extracciones encadenadas, pero puede encontrar el número de caracteres extraídos durante la última operación con la función gcount. Sin embargo, solo funciona para ciertas funciones de ignorar formatos como get y getline, y no para el operador de extracción.

+0

Esto no es un molde sino una conversión de tipo implícita Minor nit – dirkgently

+0

¿Existe una diferencia técnica entre un "molde implícito" y una "conversión implícita"? ¿Implica algo que el otro no? – meagar

+0

Si yo soy leyendo http://www.cplusplus.com/reference/iostream/istream/ correctamente su operador! y operador void * no operador bool. El resultado final es el mismo sin embargo. –

1

La segunda parte del código lee un conjunto de valores del ibuf a las variables que lo siguen. Sin embargo, la devolución de la llamada operator >>() oculta es un objeto istringstream. No hay forma directa de hacer que el personaje cuente.

Puede verificar la función de miembro gcount que proporciona el número de caracteres para la última operación de entrada sin formato. Tenga en cuenta que esto es por operación, por lo que no se puede utilizar en cascada. También puede usar la función de miembro read.

Editar:

(ibuf >> zork >> iA >> Comma >> iB) 

es en realidad:

((((ibuf.operator >>(zork)).operator >>(iA)).operator >>(Comma)).operator >>(iB)) 

El nivel de anidamiento de paréntesis le diga el orden de las llamadas (y los argumentos).

+0

@dirkgently: ¿Me puede decir más sobre el 'operador oculto' Tal vez ampliar mi ejemplo en un paréntesis completa y demostrar que –

+0

@ Mike D:?? De actualizado – dirkgently

0
if (ibuf >> zork >> iA >> Comma >> iB) 

es lógicamente equivalente a:

ibuf >> zork; 
ibuf >> iA; 
ibuf >> Comma; 
ibuf >> iB; 
if (ibuf) ... 

"¿hay alguna manera de saber cuántos personajes y objetos donde extraen?"

No es función miembro 'gcount': http://www.cplusplus.com/reference/iostream/istream/gcount/

+0

No, verificar '.good()' no es más limpio y en realidad se comporta de manera diferente. Use 'if (ibuf)' en el código anterior. –

+0

Tienes razón. .good() solo verifica los indicadores de error (editados). – neverlord

+0

Puedes usar @ -syntax así sé que me has contestado, y en este caso cambiar el voto; pero volví aquí de todos modos esta vez. :) –

Cuestiones relacionadas