2010-02-22 13 views
5

ich ohne Umwandlung in ein std::stringstream schreiben will von, sagen Zeilenende.std :: string und std :: ios :: binary

Ich habe den folgenden Code:

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."); 
     } 
    } 
} 

Der folgende Code funktioniert wie ein Charme:

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

Wenn ich den folgenden Code verwenden, ich laufe in die std::runtime_error wo Ausgabe fehlerhaft ist Zustand.

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

Wenn ich entferne std::ios::binary die DECRYPT Funktion ohne Fehler abgeschlossen ist, aber ich am Ende mit CR, CR, LF als Zeilenende.

Ich benutze VS2008 und noch nicht den Code auf gcc getestet. Ist das die Art und Weise, wie es sich verhalten sollte oder ist MS Implementierung von std::stringstream kaputt?

Irgendwelche Ideen, wie ich den Inhalt in einen std::stringstream im richtigen Format bekommen? Ich habe versucht, den Inhalt in eine std::string und dann write() und es hatte auch das gleiche Ergebnis.

Antwort

11

AFAIK, das binary Flag gilt nur für fstream und stringstream nie Zeilenumwandlung, so ist es hier am meisten nutzlos.

Darüber hinaus sollten die Flags, die an stringstream 's ctor übergeben werden, in, out oder beides enthalten. In Ihrem Fall ist out notwendig (oder besser noch, verwenden Sie ein ostringstream) ansonsten ist der Strom nicht in Ausgabemodus, weshalb schriftlich es funktioniert nicht.

stringstream Der "Modus" -Parameter von ctor hat einen Standardwert von in|out, was erklärt, warum die Dinge ordnungsgemäß funktionieren, wenn Sie kein Argument übergeben. std :: string :: out |

+0

Die 'output.bad()' wurde unter Verwendung 'std :: string Ausgang (std :: string :: in aufgelöst verwenden | std :: string :: binary); ' Und' std :: ios :: binary' tat nichts. Der Fehler war, dass ein anderer Code, der Inhalt in Datei geschrieben hat (zum Debuggen), nicht "std :: ios :: binary" verwendet hat. – rioki

+1

Sind Sie sicher, dass die Binärdatei nicht verwendet wird? Vom doc: http://en.cppreference.com/w/cpp/io/basic_istringstream/basic_istringstream – galinette

+0

@galinette: Ja, ich bin ziemlich sicher. Ich habe nie gesehen, dass es in der Praxis einen Effekt hat, und der Standard spezifiziert seine Wirkung nur, wenn man von dateibasierten Streams spricht. In ähnlicher Weise zeigt der Link "binary mode" auf der Seite, die Sie erwähnen, auf eine Seite über "C-style * file * I/O". Natürlich, wenn Sie Beweise für das Gegenteil haben, teilen Sie sie bitte, damit die Antwort aktualisiert werden kann. –

-2

Try

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

Entsprechend der Dokumentation können Sie 'ios_base :: in',' ios_base :: out' und 'ios_base :: ate' in C++ 11 verwenden. – gomons

Verwandte Themen