Datei gibt nicht das aus, womit ich sie beschrieben habe



  • Hi 🙂

    Ich hab eine Datei folgendermaßen beschrieben:

    file << char(a1) << char(a2) << char(a3) << char(a4);
    

    file ist vom Typ fstream und a1-4 vom Typ short mit einem Wert von 0-255. Es sollen sozusagen 4 ASCII-Zeichen in die Datei geschrieben werden.

    Das Auslesen sieht dann so aus:

    char c1,c2,c3,c4;
    
    file >> c1 >> c2 >> c3 >> c4;
    
    std::cout << short(c1) << "," << short(c2) << "," << short(c3) << "," << short(c4);
    

    Hierbei werden mir jedoch völlig andere Werte zurückgeliefert.

    Ich vermute, dass es daran liegt, dass die Datei im Unicode statt im ANSI-Format vorliegt.

    Wäre echt für jede Hilfe dankbar. 😉

    Grüße


  • Administrator

    Wie hast du es geöffnet? Welche Werte hast du geschrieben? Was hast du bekommen? Was hast du erwartet?

    Grüssli



  • Geschrieben hab ich die Datei folgendermaßen:

    short a1,a2,a3,a4;
    
    a1 = ...; a2 = ...; ... // Werte von 0-255
    
    fstream file;
    file.open(L"datei.dat", ios::binary);
    
    file << char(a1) << char(a2) << char(a3) << char(a4);
    
    file.close();
    

    auslesen:

    char c1,c2,c3,c4;
    
    fstream file;
    file.open(L"datei.dat", ios::binary);
    
    file >> c1 >> c2 >> c3 >> c4;
    
    file.close()
    
    std::cout << short(c1) << "," << short(c2) << "," << short(c3) << "," << short(c4);
    

    Erwartet habe ich die Werte, mit denen ich a1-4 belegt hatte.


  • Administrator

    th3AddY schrieb:

    Erwartet habe ich die Werte, mit denen ich a1-4 belegt hatte.

    Und könntest du da Besipielwerte angeben? Mich beschleicht nämlich das Gefühl, dass es Werte sind, welche grösser als 127 sind. Deine eingelesenen char Werte haben dann negative Werte und wenn du diese einem short zuweist, dann wird der negative Wert beibehalten.

    Bsp:

    short s = 255;
    char c = static_cast<char>(s);
    
    std::cout << s << std::endl; // 255
    std::cout << (int)c << std::endl; // -1
    
    s = c;
    std::cout << s << std::endl; // -1
    
    // Mögliche Lösung:
    // Lies unsigned char Werte ein.
    s = 255;
    unsigned char uc = static_cast<unsigned char>(s);
    
    std::cout << s << std::endl; // 255
    std::cout << (int)uc << std::endl; // 255
    
    s = uc;
    std::cout << s << std::endl; // 255
    

    Grüssli



  • Das ist auf jeden Fall schonmal ein guter Anfang. Denn meine Werte liegen im Bereich 0-255.

    Mein Ziel ist es, einzelne Bytes als ASCII-Zeichen kodiert in eine Datei zu schreiben.

    Jedoch erhalte ich jetzt sehr seltsame Ausgaben.

    write:

    file << unsigned char(a1) << unsigned char(a2) << unsigned char(a3) << unsigned char(a4);
    

    für short a1,a2,a3,a4 mit den Werten:

    0,1,226,64
    

    read:

    unsigned char c1,c2,c3,c4;
    
    file >> c1 >> c2 >> c3 >> c4;
    
    std::cout << short(c1) << "," << short(c2) << "," << short(c3) << "," << short(c4);
    

    und erhalte:

    204,204,204,204
    

    vier mal denselben Wert.

    Ich kann es mir auf jeden Fall nicht erklären.


  • Administrator

    Dann kommt die nächste Wette:
    Du hast nicht überprüft, ob das File auch erstellt wurde.

    Daher ist der Stream ungültig beim Schreiben und es wird nichts rausgeschrieben und beim Lesen ist er nicht offen, bzw. auch ungültig, weshalb nichts gelesen wird, wodurch du uninitialisierte Werte ausgegeben hast.

    Das ganze hängt mit den Flags beim Öffnen von std::fstream zusammen:
    http://www.cplusplus.com/reference/iostream/ios_base/openmode/

    Ein std::fstream ist zum Lesen und Schreiben da. Nimm lieber zum Lesen einen std::ifstream und zum Schreiben einen std::ofstream . Oder gib die richtigen Flags explizit an.

    Grüssli



  • Okay, jetzt funktioniert es. 🙂

    Vielen Dank!


Anmelden zum Antworten