Pregunta

Para los propósitos educativos Quiero crear un buffer ostream y corriente que ver:

  1. endians fijos al hacer << miVar;
  2. tienda en un contenedor deque en lugar de utilizar std: cout o escribir en un archivo
  3. registrar datos adicionales, tales como cuántas veces me <<, ¿cuántas veces lo hice .write, la cantidad de bytes que he escrito y el número de veces que flush (). Pero no necesito toda la información.

He intentado sobrecargar pero fracasó terriblemente. He intentado sobrecarga de escritura haciendo

ostream& write( const char* s, streamsize n ) 

en mi clase basic_stringstream2 (he copiado basic_stringstream pasta en mi archivo CPP y modifiqué) pero el código llevada por medio de basic_ostream. Miré a través de código y parece que necesito para sobrecargar xsputn (que no se menciona en esta página http : //www.cplusplus.com/reference/iostream/ostream) pero lo que más necesito sobrecargar? y ¿cómo construyo mi clase (¿qué se necesita para heredar, etc.)?

¿Fue útil?

Solución

El enfoque canónico consiste en definir su propio streambuf. Usted debe echar un vistazo a:

Otros consejos

En A + C) Creo que usted debe buscar en facetas, que modifican cómo los objetos se escriben como caracteres. Se podría almacenar estadísticas aquí también de la cantidad de veces que se transmiten los objetos. Echa un vistazo a Cómo dar formato a mis propios objetos al utilizar STL corrientes? para un ejemplo.

Para B) Es necesario crear su propio streambuf y conectar el ostream a la memoria intermedia (argumento del constructor). Ver de Luc enlaces + Derivación de nuevas clases streambuf . En definitiva es necesario implementar esto para un ostream (mínimo):

  • desbordamiento (poner un solo Char o tampón ras) ( enlace )
  • xsputn (puso una matriz de caracteres para amortiguar) ( enlace )
  • sync ( enlace )

No estoy seguro de que lo que usted quiere hacer es posible. Los operadores << no son virtuales. Así se podría definir yourstream &operator << (yourstream &strm, int i) a hacer lo que quiera con la conversión endian y contando, y funcionará cuando el código llama directamente. Pero si se pasa un objeto yourstream en una función que espera un ostream, cada vez que las llamadas a funciones <<, irá a la versión original ostream en lugar de la suya.

A mi entender, las instalaciones corrientes se han establecido de manera que se puede "fácilmente" definir un nuevo tipo de flujo que utiliza un tipo diferente de tampón (como, por ejemplo, un deque de caracteres), y que puede muy fácilmente añadir soporte para dar salida a sus propias clases a través de <<. No creo que se pretende que sean capaces de redefinir la capa media entre ellos.

Y sobre todo, el punto de la interfaz << entero es para proporcionar una salida de texto con un formato agradable, mientras que suena como si realmente desea salida binaria. (De lo contrario, la referencia a "endian" no tiene sentido.) Incluso suponiendo que hay alguna manera de hacer esto que no sé, se producirá una salida binaria raro en el mejor. Por ejemplo, considere la sobrecarga de usuario final para dar salida a un punto en el espacio 3D. La versión de usuario final de << probablemente hará algo así como << '(' << x << ", " << y << ", " << z << ')'. Que se vean bien en un flujo de texto, pero es un montón de personajes perdidos y completamente inútiles en un flujo binario, que, idealmente, sólo tiene que utilizar << x << y << z. (Y cuántas llamadas a << deberían los cuentan como?)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top