Dateien C/C++



  • Hallo Leute

    ich hab da so ein Problem

    zuerst schreibe ich in eine Datei alle Daten ein - fehlerlos.

    Aber wenn ich die Daten aus der Datei lesen möchte sind da plötzlich falsche Daten drinnen.

    Hier ist der Code mit dem ich in die Datei schreibe

    bool Card::Save_Card(char *pfad){
        FILE *file;
        char str[30];
        if(file = fopen(pfad,"w")){
            fprintf(file,"%s\n",Kartenname);
            fprintf(file,"%dx%d %dx%d\n",lenge,breite,aktuelle_position_x,aktuelle_position_y);
            fprintf(file,"%d\n",max_spieler);
            fputs(kartenbeschreibung,file);
            fprintf(file,"\n");
            fputs(Ersteller,file);
            for(int i = 0; i < lenge; i++){
                for(int j = 0; j < breite; j++){
                    fprintf(file,"\n");
                    sprintf(str,"%d/%d",i,j);
                    fputs(str,file);
                    fprintf(file,"\n%d-%d-%d-%d-%d",feld[i][j].Bodentyp,feld[i][j].Is_Building,feld[i][j].Strom,feld[i][j].Gewinn_auf_dem_Feld,feld[i][j].Arbeitsplatze);
                    fprintf(file,"\n%d-%d-%d-%d-%d-%d-%d-%d-%d-%d",feld[i][j].Gebaude[0],feld[i][j].Gebaude[1],feld[i][j].Gebaude[2],feld[i][j].Gebaude[3],feld[i][j].Gebaude[4],feld[i][j].Gebaude[5],feld[i][j].Gebaude[6],feld[i][j].Gebaude[7],feld[i][j].Gebaude[8],feld[i][j].Gebaude[9]);
                    fprintf(file,"\n%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d",feld[i][j].Bestandteile.Wasser,feld[i][j].Bestandteile.Fruchtbares_Land,feld[i][j].Bestandteile.Odland,feld[i][j].Bestandteile.Gold,feld[i][j].Bestandteile.Silber,feld[i][j].Bestandteile.Bronze,feld[i][j].Bestandteile.Stahl,feld[i][j].Bestandteile.Uran,feld[i][j].Bestandteile.Kupfer,feld[i][j].Bestandteile.Holz,feld[i][j].Bestandteile.Steine,feld[i][j].Bestandteile.Glas,feld[i][j].Bestandteile.verkokstes_Land,feld[i][j].Bestandteile.Silicium,feld[i][j].Bestandteile.Erdol,feld[i][j].Bestandteile.Erdgas);
                    fprintf(file,"\n");
                    fputs(feld[i][j].Ortname,file);
                    fprintf(file,"\n");
                    fputs(feld[i][j].Volkname,file);
                }
            }
    
            fclose(file);
        }
        else{
            printf("\nDatei nicht erstellt werden: %s",pfad);
            return false;
        }
        return true;
    }
    

    Falls mir jemand helfen könnte wäre ich sehr dankbar


  • Mod

    Beschreibe mal genauer, was du erwartest und was passiert.

    Und mit deinem Problem solltest du lieber im C Forum fragen. Die paar Kleinigkeiten die du von C++ verwendest werden die dort auch verstehen. Dafür kennt man sich dort besser mit den von die verwendeten C Ein-/Ausgabefunktionen aus.



  • Und da soll mir noch mal jemand erzaehlen, dass Lisp Augenkrebs verursacht. Ich kann dir leider nicht helfen.



  • also es ist so

    ich habe ein 2-dimensionales array, wo ich halt vorher schön Speicher reserviere und dann speichere ich das alles in eine Textdatei. Dort ,wenn ich mir das alles ansehe, ist alles in Ordnung.

    Aber wenn ich dann versuche die Datei zu laden, dann sind im Array falsche Werte, und diese bringen entweder eine komplett falsche Ausgabe oder einen Absturz vom Programm.



  • Aber wenn ich dann versuche die Datei zu laden, dann sind im Array falsche Werte

    Ich schlussfolgere: Es liegt nicht an der Routine zum Abspeichern der Daten, wenn in der Textdatei alles in Ordnung ist. Zeig uns lieber die Funktion zum Laden deiner Daten, als auch einen kleinen Auszug aus deiner Datei.



  • Hier ist der Code mit dem ich alles aus der Datei lese:

    void Card::LoadCard(char *pfad,SDL_Surface *screen){
        FILE *file;
        if(file = fopen(pfad,"r+")){
            char n;
            printf("In file for loading");
            fscanf(file,"%s",Kartenname);
            fscanf(file,"%d%c%d%c%d%c%d",lenge,n,breite,n,aktuelle_position_x,n,aktuelle_position_y);
            fscanf(file,"%d",max_spieler);
            fgets(kartenbeschreibung,4095,file);
            fscanf(file,"\n",n);
            fgets(Ersteller,29,file);
            putchar('.');
            this->feld = (FELD **)malloc(4 * lenge);
            for(int i = 0; i < lenge; i++){
                for(int j = 0; j < breite; j++){
                    this->feld[i] = (FELD *)malloc(breite *sizeof(FELD));
                    fgets(NULL,30,file);
                    fscanf(file,"%d%c%d%c%d%c%d%c%d",feld[i][j].Bodentyp,n,feld[i][j].Is_Building,n,feld[i][j].Strom,n,feld[i][j].Gewinn_auf_dem_Feld,n,feld[i][j].Arbeitsplatze);
                    fscanf(file,"%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d",feld[i][j].Gebaude[0],n,feld[i][j].Gebaude[1],n,feld[i][j].Gebaude[2],n,feld[i][j].Gebaude[3],n,feld[i][j].Gebaude[4],n,feld[i][j].Gebaude[5],n,feld[i][j].Gebaude[6],n,feld[i][j].Gebaude[7],n,feld[i][j].Gebaude[8],n,feld[i][j].Gebaude[9]);
                    fscanf(file,"%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d",feld[i][j].Bestandteile.Wasser,n,feld[i][j].Bestandteile.Fruchtbares_Land,n,feld[i][j].Bestandteile.Odland,n,feld[i][j].Bestandteile.Gold,n,feld[i][j].Bestandteile.Silber,n,feld[i][j].Bestandteile.Bronze,n,feld[i][j].Bestandteile.Stahl,n,feld[i][j].Bestandteile.Uran,n,feld[i][j].Bestandteile.Kupfer,n,feld[i][j].Bestandteile.Holz,n,feld[i][j].Bestandteile.Steine,n,feld[i][j].Bestandteile.Glas,n,feld[i][j].Bestandteile.verkokstes_Land,n,feld[i][j].Bestandteile.Silicium,n,feld[i][j].Bestandteile.Erdol,n,feld[i][j].Bestandteile.Erdgas);
                    fgets(feld[i][j].Volkname,80,file);
                    fgets(feld[i][j].Ortname,80,file);
                    printf("\nfeld: %d",feld[i][j].Bodentyp);
                }
            }
    
            putchar('.');
            fclose(file);
            load = true;
        }
        else
            printf("\nDatei nicht gefunden: %s",pfad);
    }
    

    Hier ist ein kleiner Abschnitt wie es in der Datei aussieht. Nur die ersten 5 Zeilen unterscheiden sich von den anderen

    Unbekannt
    49x49 0x0
    2
    keine Vorhanden
    Anonym
    0/0
    1-0-0-0-0
    0-0-0-0-0-0-0-0-0-0
    0-100-0-0-0-0-0-0-0-0-0-0-0-0-0-0
    NoCity
    Standard.vlk
    0/1
    1-0-0-0-0
    0-0-0-0-0-0-0-0-0-0
    0-100-0-0-0-0-0-0-0-0-0-0-0-0-0-0
    NoCity
    Standard.vlk
    0/2
    1-0-0-0-0
    0-0-0-0-0-0-0-0-0-0
    0-100-0-0-0-0-0-0-0-0-0-0-0-0-0-0
    NoCity
    Standard.vlk
    


  • Die Variablendeklarationen der Variablen, in die du Daten enliest, solltest du noch posten!


  • Administrator

    kalaschnik0w schrieb:

    Die Variablendeklarationen der Variablen, in die du Daten enliest, solltest du noch posten!

    Abgesehen davon, kann man allerdings jetzt schon Fehler erkennen und vermuten. Zum Beispiel müssen an fscanf ausschliesslich Zeiger übergeben werden. Er übergibt aber sehr wahrscheinlich kaum Zeiger, was absolutes undefiniertes Verhalten auslöst.

    Ausserdem ist es wirklich nur C, ausser dass die Funtion sich in einer Klasse befindet und bool Variablen verwendet werden. Wobei seit C99 gibt es ja auch bool bei C, oder?
    Und dann erst die Strukturierung ... das kann man ja nicht lesen!

    @glantschnig,
    Entweder steigst du auf C++ um, dann bist du hier im richtigen Forum oder du gehst mit deinem Problem ins C Forum, ein Mod würde dich sicher gerne verschieben. Ich empfehle allerdings ganz allgemein, dass du dir nochmals ein Tutorial zur IO in C reinziehst und auch probierst den Code etwas lesbarer zu gestalten. Würde mich nicht erstaunen, wenn du dich noch irgendwo verschrieben und es nicht gemerkt hast.

    knivil schrieb:

    Und da soll mir noch mal jemand erzaehlen, dass Lisp Augenkrebs verursacht. Ich kann dir leider nicht helfen.

    Ich behaupte, dass Lisp Augenkrebs verursacht! Dies schliesst allerdings nicht aus, dass man unter C oder C++ nicht auch Code produzieren kann, welcher Augenkrebs verursacht 😉

    Grüssli



  • fscanf(file,"%d%c%d%c%d%c%d",lenge,n,breite,n,aktuelle_position_x,n,aktuelle_position_y);
    

    Du musst glaube einen Zeiger auf deine Variablen übergeben und nicht die Variable selber.

    Siehe hier:

    For each format specifier in the format string that retrieves data, an additional argument should be specified.
    These arguments are expected to be references (pointers): if you want to store the result of a fscanf operation on a regular variable you should precede its identifier with the reference operator, i.e. an ampersand sign (&)

    http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/

    Desweiteren denke ich, dass Leerzeichen zwischen die formatstrings gehören.

    fscanf( file, "%d %c %d %c %d %c %d", &laenge, &n, &breite, &n, &aktuelle_position_x, &n, &aktuelle_position_y );
    

    PS: hab lange kein C gemacht... 🕶



  • 0-100-0-0-0-0-0-0-0-0-0-0-0-0-0-0
    

    ich glaube nicht, das fscanf diesen string in mehrere Ziffern zerlegen kann, das kannst du vergessen.

    Evtl. geht es so:

    fscanf( file, "%i-%i-%i-%i-%i", &n1, &n2, &n3, &n4, &n5 );
    

    musst du mal testen...



  • Der Fehler liegt darin, dass du deinen Code nicht ordentlich formatierst. Eine übersichtliche Formatierung ist unumgänglich beim Programmmieren!


Anmelden zum Antworten