Home > OS >  Reading integer from file through function in c returns wrong value
Reading integer from file through function in c returns wrong value

Time:12-22

I'm trying to read a bunch of information about a player from a binary file in c through the following code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


// structure joueur
typedef struct Joueur {
    char nom[20];
    int num_lieu;
    int liste_objet[10];
}Joueur;


// question a
void sauvegarder_jeu(char* nom_partie, Joueur* joueur) {
    // ouverture du fichier
    FILE *flot;
    flot = fopen(nom_partie, "wb");
    if (flot == NULL) {
        printf("Erreur dans l'ouverture du fichier!\n");
        return;
    }

    // écriture du nom du joueur
    fwrite(joueur->nom, sizeof(joueur->nom), 1, flot);
    // écriture du numero du lieu
    fwrite(&(joueur->num_lieu), sizeof(joueur->num_lieu), 1, flot);
    // écriture de la liste des objets
    fwrite(joueur->liste_objet, sizeof(joueur->liste_objet), 1, flot);

    // fermeture du fichier
    fclose(flot);
}

// question b
void charger_jeu(char* nom_partie, char* nom, int* num_lieu, int* liste_objet) {
    // ouverture du fichier
    FILE *flot;
    flot = fopen(nom_partie, "rb");
    if (flot == NULL) {
        printf("Erreur dans l'ouverture du fichier!\n");
        return;
    }

    // joueur temp pour sizeof
    Joueur *temp = (Joueur*)malloc(sizeof(Joueur));

    // lecture du nom du joueur
    fread(nom, sizeof(temp->nom), 1, flot);
    // écriture du numero du lieu
    fread(&num_lieu, sizeof(temp->num_lieu), 1, flot);
    // écriture de la liste des objets
    fread(liste_objet, sizeof(temp->liste_objet), 1, flot);

    // suppression du joueur temporaire
    free(temp);

    // fermeture du fichier
    fclose(flot);
}


int main() {
    // variables
    char *nom_partie = "save.sve";
    int i;
    int* num_lieu_lecture;
    int* liste_objet_lecture;
    char* nom_lecture;

    // creation d'un joueur qui possede tous les objets
    Joueur *j1 = (Joueur*)malloc(sizeof(Joueur));
    strcpy(j1->nom, "Omar");
    j1->num_lieu = 12;
    for (i = 0; i < 10; i  ) {
        j1->liste_objet[i] = 1;
    }

    // sauvegarde de la partie
    sauvegarder_jeu(nom_partie, j1);
    printf("Sauvegarde terminee!\n");

    // lecture de la partie
    charger_jeu(nom_partie, nom_lecture, num_lieu_lecture, liste_objet_lecture);
    printf("Chargement terminee!\n");

    // affichage des donnees de la partie
    printf("%s\n", nom_lecture);
    printf("%d\n", *num_lieu_lecture);
    for (i = 0; i < 10; i  ) {
        printf("liste_objet[%d] = %d\n", i, liste_objet_lecture[i]);
    }

    // liberation de la memoire
    free(j1);

    return 0;
}

The function "sauvegarder_jeu()" writes the player's data into a binary file, and the "charger_jeu()" is supposed to read that data and store into variables that I would print out.

The output, where all the values are correct expect for the "num_lieu_lecture" value:

Omar
32759
liste_objet[0] = 1
liste_objet[1] = 1
liste_objet[2] = 1
liste_objet[3] = 1
liste_objet[4] = 1
liste_objet[5] = 1
liste_objet[6] = 1
liste_objet[7] = 1
liste_objet[8] = 1
liste_objet[9] = 1

I don't know where the problem stems from.

CodePudding user response:

The variables you're passing to charger_jeu() do not need to be pointers. num_liste_objet should be int, and liste_objet_lecture and nom_lecture should be arrays.

Then you should pass the address of num_liste_objet to charger_jeu(), so it will update the variable. In charger_jeu() you don't need to use & before num_lieu because it's already a pointer.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


// structure joueur
typedef struct Joueur {
    char nom[20];
    int num_lieu;
    int liste_objet[10];
}Joueur;


// question a
void sauvegarder_jeu(char* nom_partie, Joueur* joueur) {
    // ouverture du fichier
    FILE *flot;
    flot = fopen(nom_partie, "wb");
    if (flot == NULL) {
        printf("Erreur dans l'ouverture du fichier!\n");
        return;
    }

    // écriture du nom du joueur
    fwrite(joueur->nom, sizeof(joueur->nom), 1, flot);
    // écriture du numero du lieu
    fwrite(&(joueur->num_lieu), sizeof(joueur->num_lieu), 1, flot);
    // écriture de la liste des objets
    fwrite(joueur->liste_objet, sizeof(joueur->liste_objet), 1, flot);

    // fermeture du fichier
    fclose(flot);
}

// question b
void charger_jeu(char* nom_partie, char* nom, int* num_lieu, int* liste_objet) {
    // ouverture du fichier
    FILE *flot;
    flot = fopen(nom_partie, "rb");
    if (flot == NULL) {
        printf("Erreur dans l'ouverture du fichier!\n");
        return;
    }

    // joueur temp pour sizeof
    Joueur *temp = (Joueur*)malloc(sizeof(Joueur));

    // lecture du nom du joueur
    fread(nom, sizeof(temp->nom), 1, flot);
    // écriture du numero du lieu
    fread(num_lieu, sizeof(temp->num_lieu), 1, flot);
    // écriture de la liste des objets
    fread(liste_objet, sizeof(temp->liste_objet), 1, flot);

    // suppression du joueur temporaire
    free(temp);

    // fermeture du fichier
    fclose(flot);
}


int main() {
    // variables
    char *nom_partie = "save.sve";
    int i;
    int num_lieu_lecture;
    int liste_objet_lecture[10];
    char nom_lecture[20];

    // creation d'un joueur qui possede tous les objets
    Joueur *j1 = (Joueur*)malloc(sizeof(Joueur));
    strcpy(j1->nom, "Omar");
    j1->num_lieu = 12;
    for (i = 0; i < 10; i  ) {
        j1->liste_objet[i] = 1;
    }

    // sauvegarde de la partie
    sauvegarder_jeu(nom_partie, j1);
    printf("Sauvegarde terminee!\n");

    // lecture de la partie
    charger_jeu(nom_partie, nom_lecture, &num_lieu_lecture, liste_objet_lecture);
    printf("Chargement terminee!\n");

    // affichage des donnees de la partie
    printf("%s\n", nom_lecture);
    printf("%d\n", *num_lieu_lecture);
    for (i = 0; i < 10; i  ) {
        printf("liste_objet[%d] = %d\n", i, liste_objet_lecture[i]);
    }

    // liberation de la memoire
    free(j1);

    return 0;
}
  • Related