2011-09-20 10 views
5

Tengo un montón de clases de C++ que lee datos de una secuencia de archivos. Las funciones se ven así.C++ convertir la función de secuencia de archivos para utilizar un stringstream

bool LoadFromFile(class ifstream &file); 

Estoy creando una nueva función para leer de la memoria en lugar de un archivo. Así que busqué en Google y una secuencia de comandos parece hacer el truco sin modificaciones al código.

bool LoadFromData(class istringstream &file); 

Ahora mi pregunta es. Necesito construir esta secuencia para leer desde una matriz de caracteres. La cadena no tiene terminación nula, son datos binarios puros y obtuve un número entero con el tamaño. Intenté asignarlo a una cadena y crear una secuencia a partir de una cadena, sin embargo, la cadena termina después de un carácter nulo ... y los datos se copian.

int size; 
char *data; 
string s = *data; 

¿Cómo se crea una cadena de un puntero de matriz de caracteres sin copiar los datos + especificando el tamaño de los datos de puntero? ¿Conoces alguna otra solución que un stringstream?

+1

por lo tanto, la aclaración: ¿su problema es que su '' char * no termine con un nulo y por lo tanto tiene problemas para la construcción de una 'std :: string' fuera de él? – quasiverse

+0

Sí, ese es el problema básicamente. También me pregunto si alguien conoce una mejor solución. – Tito

+0

Aquí está la solución: http://stackoverflow.com/questions/2079912/simpler-way-to-create-ac-memorystream-from-char-size-t-without-copying-th (una versión usa boost, en copias los datos y uno solo funciona con gcc) –

Respuesta

4

Escriba una propia clase basic_streambuf! More details.. (De esta manera podría trabajar en la memoria actual.)

Para crear una cadena desde el puntero y el tamaño: string str(data,data+size); (copiará los datos).

En más cosa: usted debe reescribir sus funciones a basan en istream:

bool LoadFromStream(istream &is); 

De esta manera se podría hacer lo siguiente, porque ambos istringstream y ifstream basado en istream (más tarde esta función también podría ser compatible con TCP arroyos ...):

ifstream file; 
istringstream sstream; 

LoadFromStream(file); 
LoadFromStream(sstream); 
+0

¡Muchas gracias! ¡Esto resolvió mi problema sin cambiar las funciones en absoluto! – Tito

+0

Parece que funcionó para las secuencias de archivos, pero cuando pasé una secuencia de cadenas recibí el error del compilador (con el código exacto anterior). Hice todo lo posible para investigarlo, pero simplemente no lo entiendo. Está compilado en VS. No se puede convertir el parámetro 1 de 'clase std :: basic_istringstream , clase std :: asignador >' a 'istream clase y' – Tito

+0

lo uso en muchos lugares. Debe definir como 'bool LoadFromStream (istream &is);' contra 'bool LoadFromStream (clase istream &is);' En el archivo de encabezado, generalmente no uso 'using namespace std;' por lo que la definición es: 'bool LoadFromStream (std :: istream &is);). debe incluir ''. – Naszta

Cuestiones relacionadas