Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Problem mit binärem Dateien

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
04.03.2004, 17:01 Uhr
Oliver
S2-Pixelgeneral


Hallo,

ich hab eine kleines großes Problem. Ich versuch grad eine Jump'n run - Spiel hinzubekommen, aber leider scheiter ich schon beim Laden der Spielwelt.

Ich speicher die Spielwelt binär. Ich hab mir ein Programm erstellt, was mir die eine "kleine Spielwelt", also nur eine zum Testen, schreibt:


C++:
#include <iostream>
#include <cstdio>
using namespace std;

struct gobject
{
    char type;
    int x,y;
};

int main()
{
    FILE*dat=fopen("level1.sze","wb");

    int x=350;
    int y=380;
    int anz=0;
    gobject a;
    int c=1;
    a.type=0;
    a.x=0;
    a.y=565;
    int i;

    for(i=0;i<40;++i)
    {
        anz++;

    }
    a.x=0;
    a.y=0;
    for(i=0;i<20;++i)
    {
        anz++;

    }

    a.x=0;
    a.y=565;

    cout << "ANZAHL: " << anz;

    fwrite(&x,sizeof(int),1,dat);
    fwrite(&y,sizeof(int),1,dat);
    fwrite(&anz,sizeof(int),1,dat);

    for(i=0;i<40;++i)
    {
    a.x=i*35;
    fwrite(&c,sizeof(char),1,dat);
    fwrite(&a,sizeof(gobject),1,dat);
    cout << "X: " << a.x << "\n";
    cout << "Y: " << a.y << "\n";
    }
    a.x=0;
    for(i=0;i<20;++i)
    {
    a.y=i*35;
    fwrite(&c,sizeof(char),1,dat);
    fwrite(&a,sizeof(gobject),1,dat);
    cout << "X: " << a.x << "\n";
    cout << "Y: " << a.y << "\n";
    }




    fclose(dat);

    return 0;

}



So, das läuft eigentlich alles ganz richtig. Wie das Programm jetzt genau funktioniert, würde jetzt zu weit gehen, deswegen erklär ich das erstmal nicht weiter.

Jetzt hab ich im eigentlichen Programm, also im Spiel eine Funktion, die so aussieht:


C++:
void Managment::StartProgramm()
{
    // Daten laden
    bool type;
    int anz;
    FILE*dat=fopen("level1.sze","r");

    fread(&fx,sizeof(int),1,dat);
    fread(&fy,sizeof(int),1,dat);
    fread(&anz,sizeof(int),1,dat);

    gobject gtemp;
    RECT rtemp;    
    
    for(int i=0;i<anz;++i)
    {
        fread(&type,sizeof(char),1,dat);
        if(type)
        {
            
            fread(&gtemp,sizeof(gobject),1,dat);
            gliste.push_back(gtemp);
        }
        else
        {
            fread(&rtemp,sizeof(RECT),1,dat);
            aliste.push_back(rtemp);
        }
    }


    fclose(dat);
  



}



Wie gesagt, was die aliste ist und so, das ist jetzt egal, die benutz ich erstmal nicht. Aber mein Problem ist, dass wenn es liest, plötzlich irgendwann immer dasselbe rauskriegt, sprich, dass es schon am Ende angelangt sein müsste, obwohl es eigentlich noch gar nicht am Ende ist.

Kann mir da jemand zufällig helfen?
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.03.2004, 18:22 Uhr
ao

(Operator)


Als erstes solltest du "sprechende" Variablennamen verwenden und nicht a, c und so weiter. Das macht deinen Code lesbarer.

Zweitens solltest du mal die Rückgaben von fread auswerten und feof verwenden, dann weißt du nämlich genau, ob das File am Ende ist oder nicht.

Drittens, wenn das File ein Binärfile ist, solltest du es in der Leseroutine auch binär öffnen, also nicht mit "r", sondern mit "rb".

Viertens, in der Leseroutine ist die Variable type vom Typ bool, gesetzt wird sie aber mit fread (&type, sizeof (char), ...). Das ist unschön, aber OK, wenn sizeof(bool) == sizeof (char). Falls bool größer ist, bleibt ein Teil der Variablen uninitialisiert und kann dazu führen, dass du im folgenden nicht fread (..., sizeof (gobject)) machst, sondern fread (..., sizeof (RECT), ...).

Bei Visual C++ 4.2 zum Beispiel könnte das passieren, denn da ist bool auf int getypedef't.

Du kannst in sizeof anstelle des Typnamens auch den Variablennamen stecken: sizeof (type), dann bist du in jedem Fall auf der sicheren Seite.

Fünftens, versuche, dieses Problem mit einem Debugger anzugehen. Unerklärliches Laufzeitverhalten ist einer *der* Anwendungsfälle dafür. Sieh es als Übung. Du wirst nie wieder drauf verzichten wollen.

ao.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.03.2004, 19:03 Uhr
Oliver
S2-Pixelgeneral


Jetzt klappts!

Es lag anscheinend an den "rb".

Ich hab den Fehler übrigens aus meinem einen Buch, wo mal kurz Binärdateien behandelt werden und da wurden sie dann nur mit "r" geöffnet, da kann man ja lange suchen...
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
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: