2011-09-20 7 views
5

Ho un sacco di classi C++ che leggono i dati da un flusso di file. Le funzioni assomiglia a questo.Conversione di file C++ per utilizzare lo stringstream

bool LoadFromFile(class ifstream &file); 

Sto creando una nuova funzione da leggere dalla memoria anziché da un file. Così ho cercato su Google e un istringstream sembra fare il trucco senza alcuna modifica al codice.

bool LoadFromData(class istringstream &file); 

Ora la mia domanda è. Ho bisogno di costruire questo flusso per leggere da un array di caratteri. La stringa non è terminata da null, è puro dati binari e ho ottenuto un intero con la dimensione. Ho provato ad assegnarlo a una stringa e creare uno stream da una stringa, tuttavia la stringa termina dopo un carattere nullo .. e i dati vengono copiati.

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

Come si crea una stringa da un puntatore char senza copiare i dati + specificando la dimensione dei dati puntatore? Conosci qualche altra soluzione oltre a un stringente?

+1

quindi, un chiarimento: è il tuo problema che il vostro 'char *' non è terminato nulla e quindi hai problemi a costruire una std :: STRING' 'fuori di esso? – quasiverse

+0

Sì, questo è fondamentalmente il problema. Mi sto anche chiedendo se qualcuno conosce una soluzione migliore. – Tito

+0

Ecco forse la soluzione: http://stackoverflow.com/questions/2079912/simpler-way-to-create-ac-memorystream-from-char-size-t-without-copying-th (una versione utilizza boost, su copia i dati e uno funziona solo con gcc) –

risposta

4

Scrivi una classe basic_streambuf! More details.. (In questo modo è possibile lavorare sulla memoria corrente.)

Per creare una stringa da un puntatore e una dimensione: string str(data,data+size); (copierà i dati).

In più cosa: si dovrebbe riscrivere le funzioni di basa su istream:

bool LoadFromStream(istream &is); 

In questo modo si potrebbe fare quanto segue, perché entrambi istringstream e ifstream sulla base di istream (poi questa funzione potrebbe anche supporta i protocolli TCP ruscelli ...):

ifstream file; 
istringstream sstream; 

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

Grazie mille! Questo ha risolto il mio problema senza cambiare le funzioni! – Tito

+0

Sembra che abbia funzionato per i flussi di file ma quando ho passato un flusso di stringhe ad esso ho ottenuto questo errore del compilatore (con il codice esatto sopra). Ho fatto del mio meglio per studiarlo ma non capisco. È compilato in VS. Impossibile convertire il parametro 1 da 'class std :: basic_istringstream , class std :: allocator >' to 'class istream &' – Tito

+0

Lo uso in molti posti. Si dovrebbe definire come bool LoadFromStream (istream &is); 'contro' bool LoadFromStream (classe istream &is); 'Nel file di intestazione di solito non utilizzo' using namespace std; 'quindi la definizione è:' bool LoadFromStream (std :: istream &is); '. dovrebbe includere "". – Naszta