2009-02-07 15 views
17

Para los fines educativos que quieren crear un buffer ostream y corriente que hacer:¿Cómo creo mi propio ostream/streambuf?

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

Intenté sobrecargar pero fallé 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 del código y parece que necesito sobrecargar xsputn (que no se menciona en esta página http://www.cplusplus.com/reference/iostream/ostream), pero ¿qué más debo sobrecargar? y cómo construyo mi clase (¿qué necesita para heredar, etc.)?

+1

¿Podrían presentar un extracto del código que "mantuvo usando basic_ostream"? –

Respuesta

1

No estoy seguro de que lo que quiere hacer es posible. Los operadores << no son virtuales. De modo que podría definir yourstream &operator << (yourstream &strm, int i) para hacer lo que quiera con la conversión y conteo endian, y funcionará cuando su código lo llame directamente. Pero si pasa un objeto yourstream a una función que espera un ostream, cada vez que esa función llame al <<, irá a la versión original de ostream en lugar de la suya.

Según tengo entendido, las instalaciones de secuencias se han configurado para que pueda "fácilmente" definir un nuevo tipo de secuencia que utiliza un tipo diferente de memoria intermedia (como, por ejemplo, una deque de caracteres), y puede agregue fácilmente soporte para la salida de sus propias clases a través del <<. No creo que tengas la intención de redefinir la capa intermedia entre ellos.

Y, en particular, todo el punto de la interfaz << es proporcionar una salida de texto con buen formato, mientras que parece que realmente desea una salida binaria. (De lo contrario, la referencia a "endian" no tiene sentido.) Incluso suponiendo que hay alguna forma de hacerlo, no sé, producirá una salida binaria incómoda en el mejor de los casos. Por ejemplo, considere la sobrecarga del usuario final para generar un punto en el espacio 3D. La versión de usuario final de << probablemente hará algo como << '(' << x << ", " << y << ", " << z << ')'. Eso se verá bien en una secuencia de texto, pero hay muchos caracteres desperdiciados y completamente inútiles en una secuencia binaria, que idealmente solo usaría << x << y << z. (¿Y cuántas llamadas a << deben contar como?)

6

para A + C) Creo que usted debe buscar en facetas, modifican la forma en que los objetos se escriben como caracteres. También puede almacenar estadísticas aquí sobre cuántas veces transmitió sus objetos. Consulte How to format my own objects when using STL streams? para ver un ejemplo.

Para B) Necesita crear su propio streambuf y conectar su ostream a ese búfer (argumento constructor). Ver Luc's links + Deriving new streambuf classes. En definitiva es necesario implementar esto para un ostream (mínimo):

  • desbordamiento (poner un solo carbón o tampón ras) (link)
  • xsputn (poner una matriz de caracteres para amortiguar) (link)
  • sincronización (link)
+0

La mayoría de los enlaces están ahora colgando. – Omnifarious

Cuestiones relacionadas