Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Daten in binary-Datei schreiben - Problem (int)

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
20.02.2011, 10:10 Uhr
~Nickolaus
Gast


Guten Tag,

erstmal, es geht um diesen code:


C++:
void Record::writeBinaryFile(ofstream &outputFile) {
    if (!outputFile)
      cerr << "Could not open Output-File file.\n";
    else {
        char *keyChar;
        itoa(Record::key,keyChar,10);
        outputFile.write(keyChar,sizeof(int));
        keyChar->~char();
        outputFile.write(Record::postcode,sizeof(char)*8);
        outputFile.write(Record::info1,sizeof(char)*251);
        outputFile.write(Record::info2,sizeof(char)*251);
        outputFile.write(Record::info3,sizeof(char)*251);
    }
}



damit schreibe ich daten in eine binary datei,... das funktioniert auch alles wunderbar, allerdings wird die binary datei fehlerhaft sobald der key größer als 9999 wird,.... ich dachte erst das würde an der sizeof(int) liegen, weil das ja eigentlich nur 4bit sind,... aber zum einen habe ich ein 64 system, int müsste somit 8bit groß sein,... und zum anderen hab ich das ganze auch schon mit long statt int versucht, was leider zum gleichen ergebnis führte.

also falls irgendjemand mir helfen kann, bzw. mir erklären kann warum das programm sich so verhält wäre ich sehr dankbar.

vielen dank schonmal für eure hilfe!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
20.02.2011, 10:47 Uhr
TOSHMAX



Zunächst mal ist ein int meistens 4 Byte groß, keine 4 Bit. Genaueres zu deinem 64-bit System und dessen Typen kannst du hier nachlesen.

Dann befinden sich in deinem Code noch viele Logik- und Speicherfehler.
keyChar wird nicht initialisiert, d. h. er zeigt irgendwo in den Speicher und es ist reiner Zufall, dass du bisher überhaupt eine Ausgabe erhalten hast. Der Fehler den du beschreibst liegt wirklich an sizeof(int). Wie du in der Wikipedia nachlesen kannst ist ein int bei dir nur 4 Byte groß und deshalb schreibt dein Code auch nur die ersten 4 Ziffern in die Datei. Außerdem sollte man niemals einen Destruktor direkt aufrufen, ich kenne nur einen einzigen Fall in dem das tatsächlich Sinn macht.

Du könntest dir das alles aber auch ersparen und einfach folgendes schreiben:

C++:
outputFile << Record::key;

Das schreibt dir die Zahl genauso in deine Datei und du musst dich um nichts mehr kümmern.

Evtl. könntest du auch noch die Deklarationen von Record::postcode und Record::info1-3 posten. Es sieht mir danach aus, dass da auch noch ein kleiner Wurm drinsteckt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.02.2011, 11:00 Uhr
~Nickolaus
Gast


das is die deklaration ausm header:


C++:
  private:
    long key;
    char *postcode;
    char *info1;
    char *info2;
    char *info3;



und das der bzw. die konstruktoren:


C++:
Record::Record(int key) {
    Record::key = key;
    Record::info1 = new char[251];
    Record::info2 = new char[251];
    Record::info3 = new char[251];
    generatePostcode();
    generateInfo();
}

Record::Record() {
    Record::postcode = new char[8];
    Record::postcode[7] = '\0';
    Record::info1 = new char[251];
    Record::info2 = new char[251];
    Record::info3 = new char[251];
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.02.2011, 11:03 Uhr
~Nickolaus
Gast


PS:

in generatePostcode erhält postcode noch folgende inizierung:


C++:
    Record::postcode = new char[8];
    Record::postcode[7] = '\0';



(sorry nochmal wegen bit und byte bei int,... weiß ich normalerweise wohl
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.02.2011, 11:08 Uhr
TOSHMAX



Dann würde ich dir raten, dich entweder gleich mit std::string zu beschäftigen oder du machst es wie mit der Zahl:

C++:
outputFile << Record::postcode;
outputFile << Record::info1;
...

Dazu müssen sie aber null-terminiert sein.
Ansonsten könnte es sein, falls Record::info2 z. B. nur 100 Zeichen belegt, dass du zuviel in die Datei schreibst und somit auch unlesbare Zeichen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.02.2011, 11:16 Uhr
~Nickolaus
Gast


Danke für die hinweise,
der gebrauch von char is leider verpflichtend sonst hätt ich schon längst string benutzt (uni aufgabe)... die infos sind bereits mit 0 terminiert... ich denke, dass das problem allein in dem key zu finden is.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
20.02.2011, 11:27 Uhr
~Nickolaus
Gast


also das:

C++:
outputFile << Record::key;


funktioniert schonmal nicht, es wird einfach GAR NICHTS in den binary file geschrieben, wenn ich

C++:
outputFile.write(keyChar,sizeof(int));



benutze kommt der fehler erst ab record 10000 wegen der länge von 4 byte...
ich hab schon folgendes versucht, leider ohne erfolg, gibts da nich noch irgend ne möglichkeit:


C++:
if(strlen(keyChar) > 4) {
outputFile.write(keyChar,sizeof(int) + 1);
}
else {
outputFile.write(keyChar,sizeof(int));
}



wie gesagt es funktioniert leider auch nicht!!!
(ich weiß zwar auch das selbst wenn das funktionieren würde nur bis 100000 richtig funktionieren würde, aber das is mir egal, ich muss 50000 Records erstellen, die dann in den binary file geschrieben werden)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
20.02.2011, 11:47 Uhr
TOSHMAX



Da sollte es eigentlich keine Probleme geben. Wie öffnset du denn die Datei?

Die andere Möglichkeit ist eigentlich ganz einfach:

C++:
char keyChar[6]; // 6 Zeichen reichen, wenn sichergestellt ist, dass es nur 50000 Einträge bleiben
itoa(Record::key, keyChar, 10);
outputFile.write(keyChar, strlen(keyChar)); // oder outputFile << keyChar;
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
20.02.2011, 12:24 Uhr
~Nickolaus
Gast


So ich hab noch nen bisschen rumprobiert, und nach wievor funktioniert als einziges outputFile.write(keyChar, sizeof(int)), aber halt nur bis 9999 ... bei allem anderen was ich bisher probiert hab kommt nur mist raus...

zu der frage wie die datei geöffnet wird:

C++:
ofstream outputFile("Records.dat", ios::out | ios::binary);
            vector<Record>::iterator it;
            for (it = records.begin(); it < records.end(); it++) {
                it->writeBinaryFile(outputFile);
            }
            outputFile.close();


also wenn noch irgendjemand ne gute idee hat wo das problem liegen kann wer ich sehr erfreut darüber..
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
20.02.2011, 12:38 Uhr
~Nickolaus
Gast


So problem gelöst,....

sorry war mein fehler... ich bin ein depp.... hab die kontrollmethode, die die binary wieder inne textdatei schreibt nicht mitangepasst,.... die writeToBinary methode war korrekt nach den veränderungen....
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: