Stringstream : Liest nicht alle Zeilen ein?
-
Ich lese eine Datei mit ifstream ein, ungefähr folgendermaßen:
ifstream fin; fin.open("/etc/fstab", ios::in); std::string buffer; while (fin.good()) { getline(fin, buffer); cout << buffer << endl; } fin.close();Es gibt nun aber Situationen, wo ich eine Datei bekomme, die einen Base64-encoded String enthält, der wiederum einen mit AES verschlüsselten Inhalt repräsentiert.
Ich decrypte also Base64 und AES, und danach habe ich den Inhalt in einem std::string.
Nun will ich diesen, wie oben auch, zeilenweise auslesen.
Ich füge also den String einem StringStream hinzu und lese wie gewohnt aus:stringstream fin; fin << std::string(/*der string*/); std::string buffer; while (fin.good()) { getline(fin, buffer); cout << buffer << endl; }Scheint auf den ersten Blick auch zu funktionieren, jedoch liest er nicht alle Zeilen richtig ein.
Ist die Vorgehensweise falsch?
Ich dachte der StringStream verhält sich in dieser Situation genau so, als würde ich direkt aus dem FileStream lesen.
-
Alle Streams verhalten sich gleich, ja. Daher ist anzunehmen, dass hier Unterschiede im Inhalt vorliegen. Endet die Datei eventuell mit einem newline-Zeichen, der String aber nicht?
-
Hmm aber wenn ich nun einfach getline(sstream, buffer) nutze, dann bekomme ich merkwürdige Zeilenumbrüche und kann letztendlich die Zeilen nicht mehr parsen:
original:
[SETTINGS]
server=aaa
user=bbb
password=ccc
logLevel=4kaputter krempel ich umschliesse jede Zeile mit "config line: <a>LINE</a>":
'</a>g line: <a>'[SETTINGS]
'</a>g line: <a>'server=aaa
'</a>g line: <a>'user=bbb
'</a>g line: <a>'password=ccc
'</a>g line: <a>'logLevel=4
config line: <a>''</a>Anscheinend wird hier der Carriage-Return nicht richtig ausgewertet?
-
Schaue ich den String als HEX an, sehe ich bei jedem Zeilenende 0d0a (also \r\n).
Übergebe ich das nun dem StringStream und laufe durch diesen durch, haben alle Zeilen nur noch (\r). Deswegen geht wohl das Parsen auch nicht.
-
Wenn ich manuell alle \r und \n Zeichen lösche, kann ich die Strings wieder parsen.
Komisch... aber immerhin habe ich nun eine Lösung.
-
Hmm kann es sein das getline() bei einem FileStream anders reagiert als bei einem StringStream?
Es sieht so aus, als würde bei einem FileStream "\r\n" automatisch entfernt werden...
-
TheGrudge schrieb:
Hmm kann es sein das getline() bei einem FileStream anders reagiert als bei einem StringStream?
Es sieht so aus, als würde bei einem FileStream "\r\n" automatisch entfernt werden...Das gleiche passiert bei allen Streams.