Problem beim einlesen von Strings mit \n über getline
-
Hallo zusammen,
ich verstehe einfach nicht was hier passiert:
void __fastcall TForm1::Button1Click(TObject *Sender) { string strTemp, strZeile; AnsiString sTemp, sZeile; char cTemp[256]; short iLength, iLengthMax, iLines; ifstream source; // Erstellung der Klasse ifstream iLengthMax = 0; iLines = 0; in_bytes = 0; nob = 0; source.open( FilenameEdit->Text.c_str(), ios::in | ios::beg ); if ( source.good() ) { sprintf(char_buffer, "Öffne Datei %s zum kodieren", FilenameEdit->Text); ListBox1->Items->Add ( char_buffer ); } else { sprintf(char_buffer, "Kann Datei %s nicht öffnen !", FilenameEdit->Text); ListBox1->Items->Add ( char_buffer ); return; } while ( !source.eof() ) { getline( source, strZeile ); sZeile = strZeile.c_str(); // std::string to AnsiString sTemp = Kodiere( sZeile ); } source.close(); } //---------------------------------------------------------------------------
Die erste Zeile der Datei lautet z.B. "Zeile1\n\nZeile3", beim überprüfen nach getline() steht aber in strZeile "Zeile1\\n\\nZeile3", d.h. jeden Backslash bekomme ich verdoppelt.
Hat jemand ein Tip was das sein kann ?
Danke und Gruß
WoWe
-
Also,
bei Strings wird ja eine regular expression mit einem \ eingeleitet. Will man also ein \ in einem String ausgeben, so muss man doch ein \ davorpacken, also \.
Damit also der String richtig ausgegeben werden kann wird wohl (vermute ich) die getline() die Backslashes einfügen.
Also macht sie genau NICHT das was Du eigentlich willst, da Du ja die new line ausdrücken willst.
Kannst Du nicht die Dateizeilen (c++ mäßig) in einen Stream packen und ihn mit <<endl; umbrechen ?????
Schöne Grüsse
-
getline liest die Trennzeichen nicht ein.
Du kannst sie aber danach wieder anfügen:
einfach string + '\n'.Devil
-
Hallo,
schon mal danke für eure Antworten. Ich muss vielleicht noch etwas sagen, zu dem was ich machen will.
// das geht nicht getline( source, strZeile ); sZeile = strZeile.c_str(); // std::string to AnsiString sTemp = Kodiere( sZeile ); // Diese Funktion braucht einen AnsiString RichEdit3->Lines->Add( sTemp ); // Hier wird kein newline ausgeführt // so geht's AnsiString sTemp = "Zeile1\n\nZeile3"; RichEdit3->Lines->Add( sTemp ); // Hier werden die 2 newlines korrekt ausgeführt
Ich habe in einer Datei mehrere Strings stehen wo jede Datei-Zeile für sich abgeschlossen ist aber durch \n in 2 oder 3 Zeilen aufgeteilt ist, also z.B.:
Das ist die Zeile 1\nHier kommt Zeile 2
Das ist ein neuer Eintrag\nauch mit 2 ZeilenWenn ich das so in einen AnsiString setze geht es, aber nicht wenn ich es aus einer Datei lese.
-
Setec Astronomy schrieb:
Also,
bei Strings wird ja eine regular expression mit einem \ eingeleitet.
Das halte ich in c++ für ein Gerücht.
Wie devil bereits sagte, liesst getline() bis zum Zeilenende und zwar ohne das newline-zeichen mit im String abzuspeichern. Ich versteh also nicht wie die newlines da hinein kommen.
-
Hm..
In der Textdatei steht:
Zeile1\nZeile2
Exakt so wie hier. "\n" also als Text.
Der Debugger zeigt dann Zeile1\\nZeile2 an....
-
Achsooooo
Du hast das als Text da drin stehen. Dann ist es normal dass da zwei Backslashes stehen. Der Backslash leitet Escapesequenzen ein, und damit man auch Backslashes schreibenkann wird dieser mit einem weiteren Backslash maskiert. Aus "\n" wird also
"\\n". Das ist normal, bei der Ausgabe wird man nur einen Backslash sehen.
-
Hm ... ich hab's mal mit öffnen im binärmodus probiert (ios::binary) aber das Ergebnis ist das gleiche.
Wie kann ich denn im String/Textzeile ein *newline* einbauen, das bei der Ausgabe über RichEdit ausgeführt wird ?
Also im Debugger seh ich exakt "\\n" und RichEdit gibt als es Text "\n" aus.
-
Habs jetzt hinbekommen mit
sZeile = StringReplace(sZeile,"\\n","\n",TReplaceFlags() << rfReplaceAll);
nur um das Thema auch abzuschließen. Vielleicht gibts noch ne bessere Variante, aber so gehts jedenfalls.