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.
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
Sei sicuro che il binario non viene utilizzato? Dal doc: http://en.cppreference.com/w/cpp/io/basic_istringstream/basic_istringstream – galinette
@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. –