Problème fgetc(fichier)
Le
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",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 = '';
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",nbDEnter);
rewind(fichier);
srand(time(NULL));
nbMist = (rand() % (nbDEnter - 0 + 1)) + 0;
printf("Nombre mistere : %d", nbMist);
while (nbMist != nbSorti)
{
caractereActuel = fgetc(fichier);
if (caractereActuel == enter)
nbSorti++;
}
printf("Nombre sortie : %d",nbSorti);
printf("Position du curceur : %d",(int)ftell(fichier));
while (caractereActuel != enter)
{
caractereActuel = fgetc(fichier);
printf("Caractere : %c", 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' (pour les effacer)
while (getchar() != '') ; // 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("");
}
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
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",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 = '';
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",nbDEnter);
rewind(fichier);
srand(time(NULL));
nbMist = (rand() % (nbDEnter - 0 + 1)) + 0;
printf("Nombre mistere : %d", nbMist);
while (nbMist != nbSorti)
{
caractereActuel = fgetc(fichier);
if (caractereActuel == enter)
nbSorti++;
}
printf("Nombre sortie : %d",nbSorti);
printf("Position du curceur : %d",(int)ftell(fichier));
while (caractereActuel != enter)
{
caractereActuel = fgetc(fichier);
printf("Caractere : %c", 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' (pour les effacer)
while (getchar() != '') ; // 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("");
}
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

Poser une question


[...]
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...
...
}