Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème fgetc(fichier)

1 réponse
Avatar
clapannac
Bonjours.
J'éprouve quelque difficulté a saisir la source d'un problème lié a fgetc(fichier)
dans une des boucles while de ma fonction Mot_Secr().
Voici le code :

##################source#########################
main.c #
######

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

int main()
{
Mot_Secr();
char motSecret[] = "GRAMMAIRE";
char lettreTap;

printf("Longueur du mot secre : ");
Etoile_Secr(motSecret);

do{

printf("Propose une lettre : ");
lettreTap = lireCaractere();

printf("Etat du mot secre : ");
printf("%s\n",Result_Trouve_Cache_Save(motSecret,lettreTap));

}while(strcmp(motSecret, Result_Trouve_Cache_Save(motSecret,lettreTap)) != 0);

free(Result_Trouve_Cache_Save(motSecret,lettreTap));
return 0;
}

#########
fonction.c#
#########

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#include <string.h>
#include "Proto.h"

void Mot_Secr()
{
char caractereActuel = 0;
char enter = '\n';

int nbDEnter = 0;
int nbSorti = 0;
int nbMist = 0;

FILE* fichier = NULL;
fichier = fopen("list.txt", "r+");

if (fichier != NULL)
{
caractereActuel = fgetc(fichier);

while (caractereActuel != EOF)
{
printf("%c", caractereActuel);
caractereActuel = fgetc(fichier); // On lit le caractère suivant
if (caractereActuel == enter)
nbDEnter++;
}

printf("Nombre d'entre : %d\n",nbDEnter);

rewind(fichier);

srand(time(NULL));
nbMist = (rand() % (nbDEnter - 0 + 1)) + 0;
printf("Nombre mistere : %d\n", nbMist);

while (nbMist != nbSorti)
{
caractereActuel = fgetc(fichier);
if (caractereActuel == enter)
nbSorti++;
}

printf("Nombre sortie : %d\n",nbSorti);
printf("Position du curceur : %d\n",(int)ftell(fichier));

while (caractereActuel != enter)
{
caractereActuel = fgetc(fichier);
printf("Caractere : %c\n", caractereActuel);
}

}
else
{
printf("Impossible d'ouvrir le fichier list.txt");
}

}

char lireCaractere()
{
char caractere = 0;

caractere = getchar(); // On lit le premier caractère
caractere = toupper(caractere); // On met la lettre en majuscule si elle ne l'est pas déjà

// On lit les autres caractères mémorisés un à un jusqu'à l'\n (pour les effacer)
while (getchar() != '\n') ; // il y a un ";" car c'est une boucle minimaliste "Technique de programmeur"

return caractere; // On retourne le premier caractère qu'on a lu

}

void Etoile_Secr(char* Tab)
{
int i;

for(i=0;i<(int)strlen(Tab);i++)
{
printf("*");
}

printf("\n");
}

char* Result_Trouve_Cache_Save(char* Tab,char lettre)
{
int i;
char* copieTab = 0;
static int initialised = 0;
static char* copieTabClone = 0;

copieTab = calloc((int)strlen(Tab),2);
if (copieTab == 0)
{
exit(0);
}

for (i = 0 ; i < (int)strlen(Tab) ; i++)
{
if (lettre == Tab[i])
{
copieTab[i] = lettre;
}
else
{
copieTab[i] = '*';
}

}

while (initialised != 1)
{
copieTabClone = calloc((int)strlen(Tab),2);
if (copieTabClone == 0)
{
exit(0);
}

for (i = 0 ; i < (int)strlen(copieTab) ; i++)
copieTabClone[i] = '*';

initialised = 1;
}

for (i = 0 ; i < (int)strlen(copieTab) ; i++)
{
if (lettre == copieTab[i] && copieTab[i] == Tab[i])
{
copieTabClone[i] = lettre;
}
}

return copieTabClone;
}

##################headers##################
proto.h #
#######

#ifndef _PROTO_
#define _PROTO_

void Mot_Secr();
char lireCaractere();
void Etoile_Secr(char* Tab);
char* Result_Trouve_Cache_Save(char* Tab,char lettre);

#endif

################################################################fin

Donc si vous avez une piste, une explication...
Cordialement

ps: Je suis débutant

1 réponse

Avatar
espie
In article ,
clapannac wrote:
Bonjours.
J'éprouve quelque difficulté a saisir la source d'un problème lié a
fgetc(fichier)
dans une des boucles while de ma fonction Mot_Secr().
Voici le code :
void Mot_Secr()
{
char caractereActuel = 0;


[...]
caractereActuel = fgetc(fichier);



pas besoin d'aller chercher plus loin, c'est LE piege a debutants.

Tu as un cours ou un bouquin ? ca doit y etre mentionne precisement.

fgetc() te renvoie une valeur qui peut etre un char, ou EOF.

Probleme: toutes les valeurs possibles de char peuvent etre dans le fichier.

-> EOF est forcement une valeur distincte.
-> la valeur renvoyee par fgetc() n'est pas de type char, c'est trop petit.
On utilise un type entier plus grand: en l'occurrence int.

L'utilisation correcte de fgetc procede comme suit, en gros.

int r; // et non pas char

r = fgetc(fichier);

if (r == EOF) { // ben c'etait pas un caractere heim, on traite...
...
} else { // okay, la c'est un vrai caractere
char c = r; // et la conversion est licite...
...
}