Je fais un petit RPG sur console, pour parfaire mes compétences en programmation. J'utilise des structures pour stocker des données de caractères. Des choses comme leur HP, la force, peut-être l'inventaire sur la route. L'une des principales choses que je dois pouvoir faire est de charger et d'enregistrer des caractères. Ce qui signifie lire et sauver des structures.Pourquoi mon programme lit-il une structure supplémentaire?
Actuellement, je ne fais que sauvegarder et charger une structure avec le prénom et le nom de famille et essayer de la lire correctement.
Voici mon code pour créer un personnage:
void createCharacter()
{
char namebuf[20];
printf("First Name:");
if (NULL != fgets(namebuf, 20, stdin))
{
char *nlptr = strchr(namebuf, '\n');
if (nlptr) *nlptr = '\0';
}
strcpy(party[nMember].fname,namebuf);
printf("Last Name:");
if (NULL != fgets(namebuf, 20, stdin))
{
char *nlptr = strchr(namebuf, '\n');
if (nlptr) *nlptr = '\0';
}
strcpy(party[nMember].lname,namebuf);
/*Character created, now save */
saveCharacter(party[nMember]);
printf("\n\n");
loadCharacter();
}
Et voici la fonction saveCharacter:
void saveCharacter(character party)
{
FILE *fp;
fp = fopen("data","a");
fwrite(&party,sizeof(party),1,fp);
fclose(fp);
}
et la fonction loadCharacter
void loadCharacter()
{
FILE *fp;
character tempParty[50];
int loop = 0;
int count = 1;
int read = 2;
fp= fopen("data","r");
while(read != 0)
{
read=fread(&tempParty[loop],sizeof(tempParty[loop]),1,fp);
printf("%d. %s %s\n",count,tempParty[loop].fname,tempParty[loop].lname);
loop++;
count++;
}
fclose(fp);
}
Ainsi, le résultat attendu le programme est que je saisis un nom et un nom de famille comme "John Doe", et il est ajouté à le fichier de données. Ensuite, il est lu, peut-être quelque chose comme
1. Jane Doe
2. John Doe
et le programme se termine.
Cependant, ma sortie semble ajouter une structure vierge à la fin.
1. Jane Doe
2. John Doe
3.
Je voudrais savoir pourquoi cela est. Gardez à l'esprit que je suis en train de lire le fichier jusqu'à ce que fread renvoie un 0 pour signifier qu'il a frappé l'EOF.
Merci :)
Pour la postérité, la solution que je fini par aller avec était de garder mon code même, avec le petit ajout d'un imbriquée si à l'intérieur du temps, la vérification lire avant qu'il arrive à printf. – Blackbinary