c++ iostream formatted-input

c++ - ¿Alguien realmente utiliza operadores de extracción de flujo?



iostream formatted-input (7)

Creo que los operadores de extractores de flujo pueden ser muy útiles cuando se combinan con algoritmos STL como std::copy y con la clase std::istream_iterator .

Lee esta respuesta para ver de qué estoy hablando.

He escrito toneladas de funciones de operator<<(std::ostream &, const T &) - son increíblemente útiles.

Nunca he escrito una función de operator>>(std::istream &, T &) en código real, ni siquiera he utilizado los operadores de extracción para los tipos incorporados (OK, quizás para std::string ). ¿Son apropiados solo para programas de ejemplo cortos y libros de texto? ¿Es el operator>> una característica fallida de C ++?

Se han hecho preguntas sobre la sobrecarga segura de los operadores de trenes . Lo que me pregunto es si alguien hace esto en la práctica.

Incluso para algo simple como leer la entrada de un archivo en C ++, no puedo sugerir usar el operator>> . Es demasiado difícil escribir código que sea robusto para detectar y manejar errores en la entrada (o no sé cómo).

Si no está de acuerdo, muestre un buen ejemplo de uso del operator>> , tal vez respondiendo a la última pregunta a la que me he vinculado.

Resumen: Gracias por las respuestas a todos, muchas buenas opiniones. La respuesta de Manuel me hizo reconsiderar mi renuencia a usar op>> así que acepté esa.

Hice un uso intensivo del operador << para ensamblar listas de instrucciones de clasificación, campos en vistas de base de datos, etc. en mi API de base de datos OOFILE .

Por alguna razón, a un gran número de usuarios les pareció intuitivo utilizar el operador >> para agregar un campo de ordenación que era inverso . No sé quién lo sugirió en primer lugar, pero atrajo a suficientes personas como para que lo hicieran en la API.

p.ej:

dbSorter arcSort; // declare a sorter arcSort << reverse(Date) << FileName; // "normal" way to specify two sort fields arcSort >> Date << FileName; // shorthand way that evolved to specify

También hicimos uso convencional del operador >> para analizar un dbTable completo de un flujo.


Los valores se imprimen más a menudo que se leen, por lo que el operator<< se usa con más frecuencia que el operator>> . Sin embargo, si desea leer valores, el operator>> es útil.

El hecho de que tenga que verificar errores no es específico del operator>> , obviamente, también cualquier otra forma de leer los valores tendrá que detectar de alguna manera la entrada no válida.


Nunca los escribo, y rara vez utilizo los "incorporados". Los operadores de extracción son bastante inútiles para leer la entrada interactiva del usuario, porque es demasiado fácil que una transmisión se dañe. Escribir una rutina de análisis personalizada es casi siempre más fácil y más robusto. Y cuando se trata de la serialización, si quiero guardar algo como texto, lo hago en un formato estándar de la industria, como XML, que los operadores de extracción no pueden leer. De lo contrario, almaceno los datos en una base de datos o en un archivo binario, que una vez más no son adecuados para su uso con extractores.


Operador >> es básicamente deserialización. En mi experiencia limitada y anecdótica, la mayoría de la serialización / deserialización en C ++ se implementa a un nivel más bajo que la biblioteca de flujos. No tiene que implementarse en un nivel inferior, simplemente lo es.

Implementar la deserialización personalizada no siempre es un problema trivial, pero es probable que tenga los mismos problemas incluso si no lo implementa con la sintaxis de extracción de flujo.

Este es un uso profesional del operador de extracción de flujo que es al menos marginalmente útil: http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.2

En este ámbito limitado, parece que el uso correcto es bastante simple.


Sí, utilizo el operador >> (aunque no tan frecuentemente como el operador <<). Es muy útil para analizar los tipos definidos por el usuario en sus objetos respectivos y, por lo tanto, centralizar el análisis y el procesamiento de errores necesario. También es muy útil para analizar la representación de cadena de un tipo enumerado.

Por ejemplo, considere un tipo enumerado que representa una fruta. Puede usar el operador >> para analizar una cadena (como "apple", "banana", etc.) para obtener el valor de enumeración correcto.

std::istream &operator>>(std::istream &is, Fruit &fruit) { std::string str; is >> str; if (str == "apple") fruit = APPLE; else if (str == "banana") fruit = BANANA; // other fruits else is.setstate(std::ios::failbit); return is; }

Tenga en cuenta también el uso del método setstate en el istream para establecer el estado de falla de la secuencia cuando se encuentra una cadena desconocida. Al usar este operador, puede verificar el estado de falla de la secuencia de la siguiente manera:

Fruit fruit; std::cin >> fruit; if (std::cin.fail()) std::cout << "Error: Unknown Fruit!" << std::endl;


operator>> es útil para convertir números en forma de texto a una representación interna.

También puede ser útil para cargar datos para objetos. A diferencia de scanf , que no se puede sobrecargar para diferentes tipos, los objetos pueden sobrecargar al operator>> . Por lo tanto, proporciona más datos ocultos para cargar objetos, la representación interna no necesita ser conocida para leer datos en el objeto.