long als binär in Datei speichern



  • Hi,

    ich würde gerne eine long Variable in einer Datei speichern, die long sollte nicht für den Menschen lesbar sein, also binär gespeichert werden, wie mach ich das?

    Hab folgendes versucht leider ohne Erfolg, die Zahl bleibt lesbar:

    fstream savefile;
    // open a new or empty file
    savefile.open("config.txt", ios::out|ios::binary|ios::app);
    // Wieso muss ich die Datei leeren?
    savefile.clear();
    if (savefile.is_open() == false)
    {
    	MessageBox(NULL, "Daten konnten nicht gespeichert werden.", "Hazard Error", MB_OK);
    	return;
    }
    
    char tmp[sizeof(long)+1];
    long x;
    x = 150;
    memcpy(tmp, &x, sizeof(x));
    tmp[sizeof(long)] = 0; // Muss ich die Null ans Ende vom Array schreiben?
    savefile.write(tmp, sizeof(long));
    
    savefile.close();
    

    Gruß
    Scarabol



  • Viel einfacher:

    using std::ofstream;
    //binaer und immer ueberschreiben
    ofstream saveFile("config.dat", ofstream::binary|ofstream::trunc);
    long x = 47110815;
    if(saveFile) //wenn stream okay...
    {
        //...dann schreibe.
        saveFile.write(reinterpret_cast<char const*>(&x), sizeof(x));
    }
    


  • Cool danke, funktioniert

    Gruß
    Scarabol



  • Hi,

    also ich hab 1 long und dann folgt ein String, ich weiß beim auslesen leider nicht, wie lang er ist, was geb ich dann bei read als 2. Parameter an?

    Gruß
    Scarabol



  • Du musst beim speichern entweder die Länge angeben, oder eine End of String Zeichen machen, z.B. \0.

    Simon



  • Schon geschehen, aber welche Funktion liest bis zu einem EndOfString Zeichen?

    Gruß
    Scarabol



  • char für char und jedesmal checken.



  • theta schrieb:

    char für char und jedesmal checken.

    Das bringt gar nichts, bei binär geschriebenen Daten.
    Du musst entweder wissen, wie groß die geschriebenen Daten an einer gegebenen Position sind, oder Du musst eindeutige Trennsequenzen einbauen. Ein einzelnes Zeichen ist dafür ungeeignet.
    Beispiel:

    long x = 11141290; //0xAA00AA, wo wird gestoppt?
    


  • Tachyon schrieb:

    theta schrieb:

    char für char und jedesmal checken.

    Das bringt gar nichts, bei binär geschriebenen Daten.
    Du musst entweder wissen, wie groß die geschriebenen Daten an einer gegebenen Position sind, oder Du musst eindeutige Trennsequenzen einbauen. Ein einzelnes Zeichen ist dafür ungeeignet.
    Beispiel:

    long x = 11141290; //0xAA00AA, wo wird gestoppt?
    

    Doch, wenn er ja weiss, dass er als nächstes einen String einliest, liest er von da an bis zum null. Er muss wissen was er einliesst.



  • Vielen Dank an alle,

    da mir das mit der Null dann doch zu kompliziert war hab ich einfach die Länge mit abgespeichert, ging schneller, einfach und ist obendrein noch sicherer.

    Gruß
    Scarabol



  • theta schrieb:

    Doch, wenn er ja weiss, dass er als nächstes einen String einliest, liest er von da an bis zum null. Er muss wissen was er einliesst.

    Jo, hast recht. Das er einen String nach dem long speichern will ist mir total entgangen.


Log in to reply