Das "MMMM..." - und "IIIIII..."-Problem...



  • Hi,
    vielleicht hatte von Euch schon mal jemand dieses Problem:

    Ich lese und schreibe Daten mit den ofstream- und ifstream-Klassen.
    Meine Daten sind binär und bestehen nur aus folgenden "Grundbausteinen":
    - int
    - double
    - char* + Info über die Länge, also strlen(char*)...

    Ich bin mir 1000%ig sicher, dass Schreiben und Lesen exakt gleich verläuft (schon 3* nachkontrolliert!).
    Jetzt habe ich das Problem, dass manchmal beim Einlesen etwas komisches passiert:
    Ich lese z.B. 20 Sätze ein und davon sind die ersten 10 ok und die anderen 10 total identisch!
    Ich weiss nicht, ob dass so verständlich rüberkommt, aber es ist so, als würde der ifstream "hängen", also immer das gleiche lesen...
    Lustigerweise habe ich das manchmal mit dem korrekten 11. Namen (der dann 10* vorkommt), oder auch mal 10* "MMMMMMMMMMMMMM" oder 10* "IIIIIIIIIIIII" da stehen....

    Ich kann mir das überhaupt nicht erklären, nicht mal ein bisschen!
    Eine Idee war, dass der Reader abbricht, dass Problem ist aber, dass in jedem Schleifen-Durchlauf die Variablen neu deklariert werden, also:

    for(int i=0;i<nDaten;i++) {
    int a,b,c,...
    }

    Also können die ja eigentlich garnicht alle gleich sein... 😕
    ...

    Bitte Bitte gebt mit irgendeinen Tip was ich noch überprüfen könnte... wie gesagt für die Einles-Routine (die nicht sooo lange ist!) leg ich meine Hand ins Feuer!
    Kann es sein, dass dieser ifstream-Handle irgendwelche Merkmale hat, die ich noch kennen müsste???

    Gruss, Tobias

    PS: Das hier passiert innerhalb einer C++-DLL, die in ein MFC-Projekt eingebettet ist!

    [ Dieser Beitrag wurde am 25.05.2003 um 21:23 Uhr von tobis79211 editiert. ]



  • hab dein problem net kapiert 🙂



  • Also ich würde sagen es gibt 3 Möglichkeiuten:

    1. Dein Kompiler ist nicht ganz ok
    2. Dass du bei jedem Schleifendurchgang neu deklarierst ist nicht ok
    3. Vielleicht hast du deine Schleife falsch programmiert, sodass es möglich ist, dass er zum Dateiende kommt, und deshalb das letzte eingelesene Zeichen neu hinschreibt.



  • Hi, also ich denke 1.,2. scheiden aus...
    Wie sieht es mit 3. aus?
    Wie fehleranfällig ist das ganz ifstream-Gerüst denn?
    Weil:
    Ich hab meine Binär-Datei mal ganz scharf angeschaut und da steht genau das drinnen, was auch drinnen stehen soll!
    Gruss, Tobias



  • Poste doch mal den Code wie du die Datei einliest.



  • ok, mach ich gleich!

    Aber erstmal hab ich eine andere Frage:
    Also ich speichere bei mir ein paar char* und int's binär in eine Datei.
    Ich habe bemerkt (ich peil's überhaupt nicht!), dass wenn einer der int's den Wert 26 hat, dann bricht hierbei die Einles-Routine einfach an dieser Stelle ab!
    Bei allen anderen Werten von 1-99 hat alles geklappt!
    Ich versteh das nicht!!! Warum 26??? Was ist denn 26 für ein ASCII-Zeichen? (In der Eingabeaufforderung bekomme ich ein "^Z"!)

    Ok, hier dann das wichtige von dem 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);
      }
    

    Wenn von den mit (*) gekennzeichneten Werten einer 26 ist, dann bricht dort die Einles-Routine bei mir ab!
    Um das zu testen, hab ich sinnlose vordefinierte Werte (-3) gewählt, damit ich weiss, ab wo nichts mehr gelesen wurde (nämlich da, wo -3 steht!)
    Die Binär-Datei an sich ist in Ordnung, da bin ich 100%ig sicher (ist ja nur ca. 1KB gross!), es muss also am Einlesen liegen!

    Ich bin wirklich für alles dankbar!
    Gruss, Tobias
    .
    [ Dieser Beitrag wurde am 26.05.2003 um 22:35 Uhr von tobis79211 editiert. ]

    [ Dieser Beitrag wurde am 26.05.2003 um 23:13 Uhr von tobis79211 editiert. ]

    [ Dieser Beitrag wurde am 27.05.2003 um 17:53 Uhr von tobis79211 editiert. ]



  • keine Idee?


Anmelden zum Antworten