通过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(&num_lieu
应该是 fread(num_lieu
。 num_lieu
已经是一个指针,不需要取它的地址。
@kaylum 抱歉,感谢您的评论。我编辑了代码。
@Barmar 我起初尝试过,但执行在第二个 fread 处停止并返回退出代码 -1073741819
int* num_lieu_lecture;
您将未初始化的指针传递给函数。将其更改为 int num_lieu_lecture;
并将其作为 &num_lieu_lecture
传递给函数。
【参考方案1】:
您传递给charger_jeu()
的变量不需要是指针。 num_liste_objet
应该是 int
,liste_objet_lecture
和 nom_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;
【讨论】:
以上是关于通过c中的函数从文件中读取整数返回错误值的主要内容,如果未能解决你的问题,请参考以下文章