通过c中的函数从文件中读取整数returns错误值

Reading integer from file through function in c returns wrong value

我试图通过以下代码从二进制文件中读取有关播放器的一堆信息:

#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;
}

函数“sauvegarder_jeu()”将播放器的数据写入二进制文件,而“charger_jeu()”应该读取该数据并存储到我要打印的变量中出来了。

输出,其中所有值都是正确的,除了“num_lieu_lecture”值:

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

不知道问题出在哪里

您传递给 charger_jeu() 的变量不需要是指针。 num_liste_objet 应该是 intliste_objet_lecturenom_lecture 应该是数组。

那么你应该将num_liste_objet的地址传递给charger_jeu(),这样它就会更新变量。在 charger_jeu() 中,您不需要在 num_lieu 之前使用 &,因为它已经是一个指针。

#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;
}