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.
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
Sind Sie sicher, dass die Binärdatei nicht verwendet wird? Vom doc: http://en.cppreference.com/w/cpp/io/basic_istringstream/basic_istringstream – galinette
@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. –