Ifstream::read(...) bricht Lesevorgang bei ASCII -> [NULL] Symbol ab



  • Liebe Leser

    Ich habe das Problem bei meinen letzten Thread
    "wxWidget TextCtrl zeigt nicht all ASCII Symbole" gefunden.
    Es lag nicht an WxTextCtrl.

    Jedoch habe ich keine Lösung dazu, die ich annehmen könnte.

    Ein Beispiel

    Ich habe eine Datei die folgende Symbole hat.

    "ABCD\0EFG"

    Jedoch hat der String nach dem Lesevorgang den Wert "ABCD".
    "\0EFG" Fehlt.

    Hier die Funktion

    ifstream		Input(FillName, ios::in | ios::binary);
    
    if (!Input)
    {
    wxMessage("Fehler", "Fehler");
    }
    
    Input.seekg(0, fstream::end);
    long NumByte = Input.tellg();
    Input.seekg(0, fstream::beg);
    
    string			Str;
    
    // Jedes Symbol lesen
    char d; 
    while (Input.read(reinterpret_cast<char*>(&d), sizeof(d))) 
    { 
    Str.push_back(d);
    }
    

    Ich hatte versucht alle '\0' Symbole mit einer if Schleife zu ersetzten.
    Jedoch dauerte der Lesevorgang sehr sehr lange.



  • Es gibt keine if-Schleife.

    Dein Beispielcode zeigt nirgendwo, dass etwas fehlt.



  • Sebastian Müller schrieb:

    Jedoch hat der String nach dem Lesevorgang den Wert "ABCD".
    "\0EFG" Fehlt.

    Nein.
    Der String hat danach den Wert ABCD\0EFG, das kannst du mit size() überprüfen.
    Das Problem ist nur, dass die meisten Ausgaberoutinen (und Debugger) alles bis zur ersten null ausgeben.
    Sie geben deshalb nur ABCD aus, aber die anderen Werte existieren trotzdem.

    Und BTW:

    reinterpret_cast<char*>(&d)
    

    Das es ist sinnfrei ist, die Adresse eines chars (d.h. ein char*) nach char* zu reinterpret_casten, ist dir schon klar, oder?



  • Upps. Ja das Weiß ich. Ich hatte am Code nur 10.000 Mal herum getüftelt, sodass dies Stehenblieb.
    Ich weise, das "char* to Char*" keinen Zweck, bzw keine Wirkung hat.

    Die If-Schleife hatte ich weggelassen, weil diese zu langsam ist.

    if(d = '\0')
    {
    d = "0";
    }
    

    Ok. Das konnte ich im Debugger jedoch nicht erkenne. wxTextCtrl zeigt auch nur
    bis zum ersten \0 Byte. Kann man das Problem irgendwie lösen, das ich alle Bytes sehen kann.



  • Sebastian Müller schrieb:

    Die If-Schleife hatte ich weggelassen, weil diese zu langsam ist.

    Es gibt keine if-Schleife



  • if(d = '\0')
    {
    d = "0";
    }
    

    Aua! Denk da mal drueber nach.



  • if(d = '\0')
    {
    d = "0";
    }
    

    Aua! Denk da mal drueber nach.



  • Achso stimmt. Das passiert mir öfters.

    Zuweisungsoperator ist kein Vergleichsoperator.
    == wäre besser.

    Zurück zum Problem
    Kann man alle Zeichen anzeigen lassen?
    Ich meine im wxTextCtrl Fenster?



  • while(Input.read(&d, sizeof(d)))
    {
       if(d == '\0')
          Str.push_back('0'); 
       else
          Str.push_back(d);
    }
    


  • Ok. Mal angenommen ich möchte die Datei wieder speichern. Muss ich dann jeden Byte, der '0' ist wieder zu '/0' machen, oder erkennt er dass?

    Meines Wissen nach ,müsste ich dies wieder ändern. Oder?

    Ich habe das eben mit der Schleife nochmal getestet.
    Die Schleife selbst ist nicht langsam. Irgendetwas anderes bremst.



  • Warum willst Du die Datei wieder speichern? Sie ist ja nicht weg, weil Du sie gelesen hast.
    Warum liest Du überhaupt jedes Byte einzeln? Vielleicht geht es schneller, wenn Du größere Blöcke oder alles auf einmal liest?



  • Sebastian Müller schrieb:

    Meines Wissen nach ,müsste ich dies wieder ändern. Oder?

    Und dabei machst du jede '0', die wirklich in der Datei war, fälschlicherweise zu einer '\0'.

    Dein Vorhaben, einen Dateiinhalt samt nicht druckbaren Zeichen in einem Steuerelement für Text anzeigen zu wollen, ist grundsätzlich Blödsinn.



  • Ich habe es nochmal ergänzt. Jetzt läuft es.

    Ich habe mir eh schon gedacht, dass es sinnlos ist, Dateien anzuzeigen, die evt nicht druckbare Zeichen haben.

    Mann könnt diese zeichne ja durch andere ersetzten.

    \0 -> [NULL]
    ... usw

    Notepad++ mach das auch so;


Log in to reply