Bonjour , je code actuellement un petit jeux et j'aurai besoins de récupérer des information qui se trouverons dans un fichier texte.
Cependant je me trouve face a un problème mon code ne marche pas du tout et je ne comprend pas pourquoi , il me dit qu'il n'existe pas de fichier avec ce nom.
Voici mon code (ne faites pas attention aux noms qui sont les mêmes c'est juste pour tester):
int recuperationFichierJeu(FILE* file, int partie)
{
char nomFile[30];
switch(partie)
{
case PARTIE1:
sprintf(nomFile,"niveautest.txt");
break;
case PARTIE2:
sprintf(nomFile,"niveautest.txt");
break;
case PARTIE3 :
sprintf(nomFile,"niveautest.txt");
break;
case PARTIE4:
sprintf(nomFile,"niveautest.txt");
break;
default:
break;
}
file=fopen(nomFile,"r");
if (file==NULL)
{
printf("le fichier n'a pas pu être ouvert");
}
Les PARTIE1 et autres sont des constantes définie avec define. Ce que je ne comprend surtout pas c'est que dans mon main j'ai ce code :
FILE *file=fopen("niveautext.txt","r");
et que ça ne bug pas du tout a ce moment la seulement quand j'arrive a ma fonction.
si je copie la partie de code qui est dans mon main dans n’importe quelle fonction cela bug alors que c'est la même chose.
Bonjour ! Comment ça il te dit qu'il n'existe pas de fichier avec ce nom ? Il ne dit pas plutôt « le fichier n'a pas pu être ouvert» ?
Si le message d'erreur est différent de celui écrit dans le programme, peux-tu le copier-coller ?
(Après avoir lu ton message, l'hypothèse qui m'est venue à l'esprit est : le fichier a été ouvert dans le 'main', du coup le programme ne peut pas l'ouvrir une deuxième fois.)
Je vient de comprendre ou était mon erreur , elle n'est pas la je me suis précipité sur le forum trop vite , en fait les deux codes ne marchent pas.
L'erreur arrive après lorsque je fait un fgetc sur le fichier qu'il n'a pas réussit a charger , ce que je ne comprend pas cependant c'est que lorsque je rentre ce code dans un autre fichier C dans un autre dossier et que j'y ajoute le fichier texte , en le copiant il arrive a le charger et lire.
De plus j'arrivais très bien a charger et a lire le fichier avant , sans raison mon code ne marche plus , comme si il était devenu incapable de voir ou de charger le fichier. Je ne comprend plus rien.
Il y a quelque chose que j'aurai pu faire dans mon dossier/code pour qu'il devienne incapable de le voir?
Mon programme bug lorsque que j'essaye de faire un fgetc sur mon fichier que je suis sensé avoir ouvert mais qui au final ne l'est pas a cause d'une raison que je ne comprend pas.
Pour tester j'ai mis cette portion de code dans mon main qui ne pose aucun problème et qui affiche le caractère :
ensuite plus loin dans mon code j'ai une fonction qui ouvre un fichier pour le lire :
void recuperationFichierJeu(FILE* file, int partie)
{
char nomFile[50];
switch(partie)
{
case PARTIE1:
sprintf(nomFile,"onessaye.txt");
break;
case PARTIE2:
sprintf(nomFile,"niveautest.txt");
break;
case PARTIE3 :
sprintf(nomFile,"niveautest.txt");
break;
case PARTIE4:
sprintf(nomFile,"niveautest.txt");
break;
default:
break;
}
file=fopen(nomFile,"r");
}
quand j'ouvre mon fichier avec la fonction cela ne marche pas alors que je suis bien dans le case PARTIE1.
A partir de ce moment j'ai ouvert une fenêtre SDL , ça ne devrais cependant rien changer. J'ai essayé avec le chemin absolu et cela ne donne la même chose
Pour tester ma fonction j'ai mis cette portion de code dans mon main (qui devrais se comporter normalement comme pour le premier exemple):
Je ne comprend pas ce qui ne fonctionne pas correctement dans ma fonction.
Dernièrement j'ai essayé d'ouvrir avec exactement le même code que dans mon main (le premier cas) mais dans ma fonction qui se trouve plus loin après l'ouverture de ma feunetre SDL et cela ne marche pas.
Ah oui, mais le pointeur file dans ta fonction n'est qu'une copie de celui que tu passes en paramètre, qui lui reste inchangé et ne pointe probablement sur rien ou n'importe quoi !
PS : testes l'ouverture de tes fichiers, ça t’éviteras de faire fgetc sur des fichiers non ouvert !
Est tu sur ? pour moi les modification qui sont apporté a un pointeur lors d'une procédure sont pris en compte , et puis si c'était ça le problème cela marcherais parfaitement avec simplement le fopen , et pourtant ça ne marche pas.
Et bien tu a raison mais a moitié , car il est bien possible de changer l'état d'un tableau de caractère , une string donc , en la mettant en paramètre d'une fonction mais ça n'a pas l'air de fonctionner avec les fichiers.
J'ai donc modifié ma fonction pour qu'elle ne modifie que le nom du fichier et l'ouverture du fichier se fait en dehors de celle-ci.
Mais je suis toujours confronté au même problème , cela marche sans problème dans ma fonction main mais quand je me trouve dans une autre fonction cela ne marche pas.
Je vais mettre mon code avec plus de détails pour que vous compreniez.
Ma fonction pour récupérer le nom du fichier en fonction de la partie:
void recuperationNomFichierJeu(char nomFile[], int partie)
{
switch(partie)
{
case PARTIE1:
sprintf(nomFile,"onessaye.txt");
break;
case PARTIE2:
sprintf(nomFile,"niveautest.txt");
break;
case PARTIE3 :
sprintf(nomFile,"niveautest.txt");
break;
case PARTIE4:
sprintf(nomFile,"niveautest.txt");
break;
default:
break;
}
}
Mon main (où la partie au début de code affiche bien le premier caractère et le nom du fichier sans problème):
int main ()
{
SDL_Surface *ecranacceuil;
SDL_Event event;
int jeuxTourne=1;
char info, nomFile[50];
recuperationNomFichierJeu(nomFile,1);
printf("%s",nomFile);
FILE *file=fopen(nomFile,"r");
info=fgetc(file);
printf("%c",info);
fclose(file);
SDL_Init(SDL_INIT_VIDEO);
ecranacceuil=SDL_SetVideoMode(LARGEURECRAN,HAUTEURECRAN,32,SDL_DOUBLEBUF );
TTF_Init();
while(jeuxTourne)
{
SDL_FillRect(ecranacceuil, NULL, SDL_MapRGB(ecranacceuil->format, 120,120, 120));
SDL_Flip(ecranacceuil);
SDL_WaitEvent(&event);
switch(event.type)
{
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_ESCAPE:
if(feuntreDeConfirmation(MESSAGEQUITTER,ecranacceuil))
{
jeuxTourne=0;
}
else
{
SDL_FillRect(ecranacceuil, NULL, SDL_MapRGB(ecranacceuil->format, 120,120, 120));
SDL_Flip(ecranacceuil);
}
break;
case SDLK_KP1:
jeux(PARTIE1,ecranacceuil);
break;
case SDLK_KP2:
jeux(PARTIE2,ecranacceuil);
break;
}
break;
}
}
TTF_Quit();
SDL_Quit();
}
et ma fonction jeux ou l'ouverture de fichier pose un problème :
Il faut comprendre que en C le passage d'arguments aux fonctions se fait par VALEUR donc tout changement de ce paramètre dans la fonction n'est pas répercuté à l'extérieur de cette fonction.
Maintenant que e passe -t-il pour un tableau de vaaeurs ou pour une chaîne de caractères (ce qui est la même chose, une chaîne de caractère n'est qu'un tableau à une dimension d'octets).
Tu passes à la fonction l'ADRESSE du tableau, c'est à dire l'endroit en mémoire où se trouve le premier élément du tableau.
Maintenant, si cette adresse ne peut être changée, tu peux changer le contenu des cellules situées à cette adresse et les suivantes, c'est pour ça que tu modifies la chaîne mais pas son adresse en mémoire.
Renseigne-toi sur les mécanisme du C, tu comprendras mieux ce qui se passe.
- Edité par joel76 29 mars 2020 à 15:50:54
Le crayon la gomme et le papier sont les meilleurs outils du programmeur !
Merci pour tes explications qui sont très claire je vient de comprendre la subtilité , je viens a peine de commencer a coder en C.
Je peut changer le contenus mais pas changer l'endroit ou ça pointe ( dans ma fonction) où en tout cas ça ne sera pas sauvegardé.
Cependant ça ne règle pas le problème , car mon fonction fopen est bien au même endroit où j'exploite mon fichier (dans mon jeux). ma fonction sert juste a récupérer le nom du fichier en fonction du la partie que je veut charger ce qui marche dans mon main mais pas ensuite
edgarjacobs a écrit:
Hello,
nysra a écrit:
et ma fonction jeux ou l'ouverture de fichier pose un problème :
je ne vois rien dans cette fonction qui vérifie si le fichier est bien ouvert
si le fichier est ouvert, es-tu certain que info contient bien un & ?
tu ne montres pas recupererDialogue() et afficherDialogue()
- Edité par edgarjacobs il y a 22 minutes
Le problème vient avant au premier fgetc , il me dit qu'il ne trouve pas le fichier , car l'ouverture ne c'est pas correctement passé.
Mon problème est dans l'ouverture de mon fichier les autres fonction ont aucun rapport.
Je pourrais en effet tester l'ouverture mais ça ne changerais pas grand chose vu que j'ai envie que ça marche , je ne peut pas faire de printf car j'ai ouvert une feunetre SDL. Pour réusir a comprendre ce qui ne vas pas j'ai deboger avec gdb mais je n'ai pas plus d'info qu'il ne trouve pas le fichier.
Oui je suis sur qu'il contient un & car c'est moi qui ai construit le fichier.
Alors, si, tu peux employer des fonctions d'affichage console sous sdl 1.x: les messages sont alors écrits dans le fichier stdout.txt (ou stderr.txt), qui sera créé dans le répertoire de l'exécutable. Tu peux donc faire
Mon main est montré dans le même post ou tu a trouvé le programme de ma fonction jeux.
Très bien je vais tester ton morceau de code , merci.
Alors j'ai testé ton code et je n'ai aucun autre information a part qu'il ne trouve pas le fichier , j'ai essayer de regarder si peut être l'ouverture de ma fenêtre SDL changeais la place dans mon dossier avec ce code (dans mon main et dans ma fonction):
et j'ai réussit a trouver ou était l’erreur mais je ne suis pas sur de comprendre pourquoi elle est arrivé .
Mon exécutable était dans le fichier /home/lucas/Bureau/jeux et quand j'ouvre ma feunetre SDL je me retrouve dans le dossier /home/lucas , quelqu'un a une idée de pourquoi?
Attention à fgetc, c'est une fonction très lente (voir ça, ça). Mieux vaut utiliser fgets puis lire les lignes.
Vu que tu utilises SDL_FillRect j'ose imaginer que tu utilises SDL 1.2. Passe à SDL 2, la 1.2 est obsolète depuis plus de 7 ans.
- Edité par markand 30 mars 2020 à 9:35:33
git is great because Linus did it, mercurial is better because he didn't.
Probleme lors de l'ouverture d'un fichier
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Le Tout est souvent plus grand que la somme de ses parties.
Le crayon la gomme et le papier sont les meilleurs outils du programmeur !
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Le crayon la gomme et le papier sont les meilleurs outils du programmeur !
Et pour info, pas feunetre mais fenêtre
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
git is great because Linus did it, mercurial is better because he didn't.