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 Zeilen

    Wenn 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.


Anmelden zum Antworten