Bei Binär-Daten ASCII(26) vermeiden



  • Hi zusammen,
    ich hab was bemerkt, was mir nicht so gefällt!

    Bei mir steht in einer Binär-Datei eine "26" drinnen, also z.B. schreibe ich mit

    int i=26;
    ofstream os....
    ....
    os.write((char*)&i,sizeof(int);
    

    Werte binär in eine Datei.
    Jetzt bricht wohl meine Einlese-Routine genau an diesem Punkt ab.
    Etwas recherche hat ergeben, dass ASCII(26) wohl der EOF-Code von Windows ist!

    Jetzt ist meine Frage:
    Wie kann ich einen int-Wert 26 lesen, so dass die Routine dabei nicht abbricht!?!?
    Geht das mit ofstream nicht?

    Gruss, Tobias



  • Wenn du die Datei binär ausliest, dürfte das eigentlich nicht passieren.



  • hi!
    naja, bei mir passiert es wohl doch!
    Zumindest bricht er genau dort ab!
    Wenn ich dann diese Variable z.B. auf 27 setze und "weiter hinten" eine auf 26, dann bricht er immer dort ab, wo die 26 steht!
    ...Ich kanns mir ja auch nicht erklären!
    Aber gibts da nicht irgendwelche anderen Möglichkeiten???
    Mit einem FILE*-Pointer hats auch nicht funktioniert!
    Gruss, Tobias



  • zeig mal ein wenig mehr Code ...



  • Hi Bashar,
    etwas spät, aber hier noch der Code:

    for(i=0;i<nDaten;i++) {
      int   len;
      is.read( (char*) &len, sizeof(int) );
      char* name = (char*) malloc(len+1);
      is.read( name, sizeof(char)*len );
      name[len]='\0';
      this->daten[i].setName(name);
      // Werte Lesen
      int iWerte;
      is.read( (char*) &iWerte, sizeof(int) );
      for(j=0;j<iWerte;j++) {
        int k, e, o;
        k = 0; e = -3; o= -3;
        is.read( (char*) &k  , sizeof(int) ); // (*)
        is.read( (char*) &e  , sizeof(int) ); // (*)
        is.read( (char*) &o  , sizeof(int) ); // (*)
        this->daten[i].add(k,o,e);
      }
    

    Bisher hab ich auch noch keine Ahnung, woran das liegt, daher bin ich für jede Hilfe dankbar!!!
    Gruss, Tobias

    (*) = Wenn die Variable den Wert 26 hat, hört das Einlesen auf!!!
    int(26) geschrieben: 26 0 0 0

    [ Dieser Beitrag wurde am 29.05.2003 um 12:23 Uhr von tobis79211 editiert. ]



  • Hi,
    kennt sich niemand von euch damit aus???
    Hatte noch nie jmd. Probleme eine Datei zu lesen wh. EOF???



  • Zeig mal wie du die Datei öffnest... Beim öffnen musst du den Modus ios::binary wählen



  • Hi,
    ich hab hier mal einen kleinen Beispiel-Source zum Testen:

    #include <cstdio>
    #include <fstream>
    using namespace std;
    
    int main(int argc, char *argv[])
    {
      // ofstream testen
      ofstream os;
      os.open("test",ios::binary);
      int tst1;
      int from = 20;
      int to   = 30;
      for(int i=from;i<to;i++) {
        tst1 = i;
        os.write( (char*)&tst1, sizeof(int) );
      }
      os.close();
      // ifstream testen
      ifstream is;
      is.open("test",ios::binary);
      int tst2;
      for(int i=from;i<to;i++) {
        is.read( (char*)&tst2, sizeof(int) );
        printf("V: %i\n",tst2);
      }
      is.close();
    }
    

    Kompiliert mit Dev-C++ bekomme ich folgenden Output:

    V: 37889464
    V: 37889464
    V: 37889464
    V: 37889464
    V: 37889464
    V: 37889464
    V: 37889464
    V: 37889464
    V: 37889464
    V: 37889464

    Macht das irgendwie Sinn???
    Wo liegt mein Fehler??
    Gruss, Tobias



  • Bei mir funktioniert es (g++ 3.2.2, Linux).



  • genau das gleiche???
    Bei mir klappt es mit Dev-C++ und Visual C++ unter Windows 2000 NICHT!!!
    Ich kann's mir echt nicht erklären!
    Gruss, Tobias



  • Ich habs mit dem VC++6 und Win2000 getestet...
    Mein Output:

    V: 20
    V: 21
    V: 22
    V: 23
    V: 24
    V: 25
    V: 26
    V: 27
    V: 28
    V: 29
    

    :p



  • Hi,

    innerhalb deiner for()-Schleife, musst du am Schluss noch ein 'free(name);'
    einfuegen.

    mfg
    v R



  • Achso tobis, da fällt mir noch ein dass es in C++ new gibt. Warum also der Mist mit dem rumgecaste von malloc?



  • Hi,
    mir ist da was aufgefallen und ich hab noch eine Frage...

    Und zwar:
    Ich hab bemerkt, wenn ich das mit dem Attribut binary mache, dann bekomme ich immer die gleiche Ausgabe, also dieses "V: 37889464", weil bei mir nichts in die Datei geschrieben wird!!! (0.0kb grösse!)

    Wenn das bei Euch so schön geklappt hat, warum wird dann bei mir nichts in die Datei geschrieben?
    Lasse ich das Attribut weg, dann wird in die Datei geschrieben, aber ich kann's nicht korrekt lesen (wegen der "26"!).

    Zufällig einen Rat auf Lager?? (Bitte...*verzweifelt*)
    Gruss,
    Tobias



  • Hi, es funzt!
    Ich verrat auch gleich wie:

    os.open(filename,ios::binary|ios::out);

    - aus irgendwelchen Gründen muss man "out" auch setzen! Obwohl es angeblich implied ist!!!



  • - aus irgendwelchen Gründen muss man "out" auch setzen! Obwohl es angeblich implied ist!!!

    Wie kommst du darauf? ios::out ist der Standardwert bei ofsrream. Standardwerte gelten allerdings nur, wenn du an der entsprechenden Stelle keinen explizites Argument angibst. Gibst du z.B. ios::binary explizit an, wird das ios::out nicht mehr verwendet. Wenn du ios::out|ios::binary haben willst, musst du also auch ios::out|ios::binary hinschreiben.

    [ Dieser Beitrag wurde am 30.05.2003 um 23:58 Uhr von HumeSikkins editiert. ]



  • oh, danke! wusste ich nicht!


Anmelden zum Antworten