2010-02-22 20 views
5

Voglio scrivere su un std::stringstream senza alcuna trasformazione di, ad esempio, la fine della linea.std :: stringstream e std :: ios :: binary

Ho il seguente codice:

void decrypt(std::istream& input, std::ostream& output) 
{ 
    while (input.good()) 
    { 
     char c = input.get() 
     c ^= mask; 
     output.put(c); 

     if (output.bad()) 
     { 
      throw std::runtime_error("Output to stream failed."); 
     } 
    } 
} 

Il seguente codice funziona come un fascino:

std::ifstream input("foo.enc", std::ios::binary); 
std::ofstream output("foo.txt", std::ios::binary); 
decrypt(input, output); 

Se uso un il seguente codice, mi imbatto nella std::runtime_error cui uscita è in errore stato.

std::ifstream input("foo.enc", std::ios::binary); 
std::stringstream output(std::ios::binary); 
decrypt(input, output); 

Se rimuove il std::ios::binary la funzione decifrare completato senza errori, ma alla fine con CR, CR, LF come fine riga.

Sto usando VS2008 e non ho ancora testato il codice su gcc. È questo il modo in cui dovrebbe comportarsi o l'implementazione di MS std::stringstream è fallita?

Qualche idea su come posso ottenere il contenuto in un std::stringstream nel formato corretto? Ho provato a inserire il contenuto in un std::string e quindi a utilizzare write() e anche lo stesso risultato.

risposta

11

AFAIK, il flag binary si applica solo a fstream e stringstream non esegue mai la conversione del linefeed, quindi è al massimo inutile qui.

Inoltre, le bandiere passate al numero stringstream dovrebbero contenere in, out o entrambi. Nel tuo caso, è necessario out (o, meglio ancora, usa un ostringstream), lo stream non è in modalità di output, motivo per cui la scrittura non riesce.

stringstream Il parametro "mode" di ctor ha un valore predefinito di in|out, che spiega perché le cose funzionano correttamente quando non si passa alcun argomento.

+0

Il 'output.bad()' è stato risolto utilizzando 'std :: uscita stringstream (std :: :: stringstream a | std :: stringstream :: out | std :: stringstream :: binary); ' E' std :: ios :: binary' non ha fatto nulla. L'errore era che un altro pezzo di codice che scriveva i contenuti nel file (per il debug) non stava usando 'std :: ios :: binary'. – rioki

+1

Sei sicuro che il binario non viene utilizzato? Dal doc: http://en.cppreference.com/w/cpp/io/basic_istringstream/basic_istringstream – galinette

+0

@galinette: Sì, ne sono abbastanza sicuro. Non l'ho mai visto avere un effetto nella pratica e lo standard specifica il suo effetto solo quando si parla di flussi basati su file. Allo stesso modo, il link "modalità binaria" nella pagina menzionata rimanda a una pagina su "C-style * file * I/O". Naturalmente, se hai prove contrarie, condividili in modo che la risposta possa essere aggiornata. –

-2

Provare a usare

std::stringstream output(std::stringstream::out|std::stringstream::binary); 
+0

Secondo la documentazione, è possibile utilizzare 'ios_base :: in',' ios_base :: out' e 'ios_base :: ate' in C++ 11. – gomons

Problemi correlati