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

Posted

技术标签:

【中文标题】通过c中的函数从文件中读取整数返回错误值【英文标题】:Reading integer from file through function in c returns wrong value 【发布时间】:2022-01-23 05:21:18 【问题描述】:

我正在尝试通过以下代码从 c 中的二进制文件中读取有关播放器的大量信息:

#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

我不知道问题出在哪里。

【问题讨论】:

"所有值都是正确的,除了 "num_lecture_read" 值"。代码和输出中都没有num_lecture_read。变量和 cmets 不是英文的,因此您需要在描述中更加准确。 fread(&amp;num_lieu 应该是 fread(num_lieunum_lieu 已经是一个指针,不需要取它的地址。 @kaylum 抱歉,感谢您的评论。我编辑了代码。 @Barmar 我起初尝试过,但执行在第二个 fread 处停止并返回退出代码 -1073741819 int* num_lieu_lecture; 您将未初始化的指针传递给函数。将其更改为 int num_lieu_lecture; 并将其作为 &amp;num_lieu_lecture 传递给函数。 【参考方案1】:

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

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

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

【讨论】:

以上是关于通过c中的函数从文件中读取整数返回错误值的主要内容,如果未能解决你的问题,请参考以下文章

返回值中的函数混淆,啥是明确的真假?

从C中的文本文件读取int值

如何从c ++中的文件中读取双精度

将数字从文本文件读取到 C 中用户定义函数中的数组

fgets

无法从云形成 yaml 中的条件函数返回整数