2011-07-20 9 views
5

Estoy tratando de crear un istream que se lea directamente desde un buffer de memoria en bruto.istream :: tellg() devuelve -1 cuando se usa con mi clase streambuf personalizada?

me pareció una buena manera de hacer esto en otro post aquí:

class membuf : public basic_streambuf<char> 
    { 
    public: 
     membuf(char* p, size_t n) { 
      setg(p, p, p + n); 
     } 
    }; 

Entonces Creo mi istream usar este membuf:

membuf mb(dataPointer, dataLength); 
    istream reader(&mb); 

luego leí usando getline() y >> operadores, y todo es maravilloso Sin embargo, parece que no puedo usar seekg() para rebobinar al principio de mi búfer, y istream::tellg() siempre devuelve -1.

¿Debo escribir algo más de código para que funcionen o está destinado a fallar?

+0

¿Sabe _que 'seekg()' no se está rebobinando? ¿Has probado que 'tellg()' funciona correctamente? –

+0

Sí, después de llamar a seekg (0), getline() no lee mi primera línea. La función tellg() definitivamente no funciona, ya que siempre devuelve -1 (incluso cuando recién comencé a leer desde mi buffer). Creo que la respuesta de Bo es la manera de ir aquí ... – EdSanville

+0

E @ dSanville: OK; Aclaré tu pregunta en consecuencia. –

Respuesta

6

Las funciones tellg y seekg dependen de las funciones virtuales protegidas seekoff y seekpos, que debería implementar en su clase membuf.

Los valores predeterminados en basic_streambuf solo devuelve pos_type(off_type(-1)) para todas las llamadas (que puede ser igual a -1 para muchas implementaciones).

+0

¡Muchas gracias! Implementaré estos de inmediato. Aunque tengo curiosidad, ¿cómo usa istream :: tellg() esas funciones? ¿Llama a streambuf :: seekoff (0, ios_base :: cur) y obtiene el valor de retorno? – EdSanville

+0

En efecto, sí. De hecho, llama a pubseekoff, que luego llama a seekoff, pero ese es un detalle de diseño de la interfaz. :-) –

+0

Estoy tratando de hacer esto ... implementar 'seekoff' y' seekpos' en una clase membuf personalizada, excepto que hay un problema en mi código: 'seekoff' no es llamado constantemente por' tellg' y 'seekpos 'no se llama en absoluto. ¿Alguna sugerencia o ejemplos de trabajo? –

Cuestiones relacionadas