Bonsoir a tous !!
Voila j'ai un problème bien ennuyeux avec la fonction fopen
elle s'utilise normalement ainsi : fichier = fopen("test.c", "a");
mais je désirerait que test.c et a (dans mon exemple) soit des variables de types char que je peux definir avant, soit :
char nomfichier[128];
char mode ouverture[4];
fgets(nomfichier, sizeof nomfichier, stdin);
fgets(modeouverture, sizeof modeouverture, stdin);
fichier = fopen(nomfichier, modeouverture);
Seulement, il n arrive pas a ouvrir le fichier que je demande, a chaque coup et peut importe les paramètres :(
Que manque t'il ? est-ce une histoire de pointeurs?
Merci de votre aide !!



Oui, c'est ça. Mais ça ne remplace pas printf/(f)gets.
En fait, les réponses données ici sont fausses.
Il faut savoir que lorsque tu tapes sur une chaîne avec ton clavier, tu dois appuyer sur la touche entrée pour qu'elle soit prise en compte (sauf cas particulier). Lorsque tu utilises la fonction gets (ou fgets qui est mieux), le code de la touche entrée (\n) va se loger dans ta chaîne. Ainsi en faisant fgets(nomfichier,sizeof nomfichier, stdin); et que tu tapes "toto.c",
tu auras en fait "toto.c\n" dans la variable nomfichier. Dans, si tu mets fopen derrière, ça ne marchera pas.
L'astuce consiste à remplacer le \n par \0.
Par exemple :
Pour bien faire, il faudrait même vider le buffer clavier. C'est pour ça qu'il est recommandé de faire une fonction clavier spécifique basée sur fgets pour faciliter le tout.
Cdlt,
En fait, les caractères "\n\r" terminant la première saisie au clavier ne vont pas "se loger" dans la première variable (fiddy se trompe), mais restent dans le buffer _iob[0] (voir stdio.h) associé au fichier stdin.
Ceci a pour conséquence que le second fgets() lit une chaine vide, car le premier caractère contenu dans le buffer de stdin est caractère non valide pour fgets()
L'ajout de fflush(stdin) aura pour conséquence de vider le buffer, puis de permettre au second fgets() de trouver une chaine de longueur non nulle dans le buffer.
Non, fflush(stdin) provoque un comportement indéterminé. Il faut se créer soit-même la fonction pour vider le buffer clavier.
l faut et il suffit de rajouter fflush(stdin) entre les 2 fgets()
En fait, les caractères "\n\r" terminant la première saisie au clavier ne vont pas "se loger" dans la première variable (fiddy se trompe), mais restent dans le buffer _iob[0] (voir stdio.h) associé au fichier stdin.
Lol, c'est toi qui te plante ^^. Alors tout d'abord ce n'est pas les caractères "\n\r" (d'ailleurs je connais aucun OS qui provoque cette sortie, windows c'est "\r\n", MAC "\r", GNU/Linux "\n"), mais "\n". En effet la norme spécifie que les caractères de newline, quelque soit le système seront transformés en "\n".
De plus, faut pas confondre scanf("%s",...) et fgets. fgets prend toute l'entrée s'il y a la place de stocker "\n", il le prendra aussi. Fais en l'exercice pour t'en convaincre ou lit le man.