ofstream: int soll wirklich sizeof(int) lang sein...



  • Hi 🙂

    ich wollte in einem Programm eine art Datenbank mit wahlfreien Zugriff erstellen...

    nun hab ich aber folgendes Problem: wenn ich ein paar int's schreiben will, z. B. 10 und 23400:

    int Zahl1 = 105;
    int Zahl2 = 23400;
    File.write((char*) (&Zahl1), sizeof(int);
    

    steht in der Datei anschließend folgendes drin:

    10523400
    

    Das Problem dabei: wenn ich die beiden Zahlen wieder aus der Datei lesen will

    int Buffer;
    File.read((char*) (&Buffer), sizeof(int) );
    

    dann liest er nicht nur die 105 in die Datei, sondern viel mehr (zumindest ist der Output anschliessend irgend eine ziemlich hohe Zahl.... Also meine Frage: wie bring schaff ich's dass beim Schreiben/Lesen der Datei genau sizeof(int) Bytes geschrieben/gelesen werden 😕

    BTW: ist ein vereinfachtes Beispiel, in Wirklichkeit schreibe ich structs mit verschiedenen Datentypen (int, char[20] 2 floats), aber das duerfte doch eigentlich keinen Unterschied machen, oder?



  • die datei als binary öffnen?



  • hmm... das tu ich schon (sowohl beim schreiben als auch beim lesen), aber das ganze geht trotzdem nicht... 😞 😕



  • Warum wandelst du das ganze eigentlich in einen char * um? Ich kenn mich mit write nicht sonderlich aus und habe grad keine Hilfe hier, aber entweder musst du das ganze vorher in einen char * umwandeln (mit stringstreams oder sprintf) oder du benutzt den operator >> .



  • Original erstellt von <KPC>:
    Warum wandelst du das ganze eigentlich in einen char * um? Ich kenn mich mit write nicht sonderlich aus und habe grad keine Hilfe hier, aber entweder musst du das ganze vorher in einen char * umwandeln (mit stringstreams oder sprintf) oder du benutzt den operator >> .

    ne alles quatsch.



  • Original erstellt von <KPC>:
    Warum wandelst du das ganze eigentlich in einen char * um? Ich kenn mich mit write nicht sonderlich aus und habe grad keine Hilfe hier, aber entweder musst du das ganze vorher in einen char * umwandeln (mit stringstreams oder sprintf) oder du benutzt den operator >> .

    Ich muss ihn char* umwandeln weil der 1. Parameter von write (und read) nunmal einen char* erwartet.... und vor allem hab ich, als ich nach einer Beschreibung davon folgendes Beispiel gefunden (zu finden bei: http://www.cppreference.com/cppio_details.html#read))

    struct {
          int height;
          int width;
        } rectangle;
    
        input_file.read( (char *)(&rectangle), sizeof(rectangle) );
        if( input_file.bad() ) {
          cerr << "Error reading data" << endl;
          exit( 0 );
        }
    

    da dieses Biespiel dem was ich brauch doch ziemlich aehnlich sieht (ich will ja auch structs lesen) hab ich mir gedacht das sei der beste Weg.... 😕



  • beispiel==mist
    member alignment usw.
    sowas wäre eigentlich doch perfekt für den >> oeprator
    binärdateien sind immer so eine besondere sache.
    kann jetzt leider nicht ausführlicher schreiben /unterricht (=fad ... fragebogen mit excel auswerten)



  • hmm... also ich muss mich entschuldigen, war mein Fehler: hab die Daten nicht mit write() geschrieben sondern mit dem >> Op....

    @davie:
    ich kann mir grad nicht vorstellen wie du das mit dem >> Op und ohne ios::binary machen willst wenn ich wahlfreien Zugriff brauche 😕

    lass mich aber gerne eines Besseren belehren 🙂


Anmelden zum Antworten