Posez votre question Signaler

C / fonction fopen

Loxi - Dernière réponse le 27 nov. 2010 à 00:32
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 !!
Lire la suite 

C / fonction fopen »

9 réponses
Réponse
+1
moins plus
salut,
en faisant cela ça fonctionne....c'est la fonction fgets qui fout un peu le bordel....
int main()
{FILE*fp;
char nomfichier[128];
char mode[4];
printf("nom\n\r");
gets(nomfichier);
printf("mode\n\r");
gets(mode);
fp=fopen(nomfichier,mode);
...
....
fclose(fp);
return 1;
}
J'espere ça pourra t'aider...
fiddy - 24 juil. 2010 à 22:34
Pour sprintf cette fonction inscrit la chaine de caractères en paramètre dans le tableau de chars.
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 :
char *p;
fgets(nomfichier,sizeof nomfichier, stdin);
if(p=strchr(nomfichier,'\n')) *p=0;

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,
PFN - 26 nov. 2010 à 15:25
Il 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.
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.
fiddy - 27 nov. 2010 à 00:32
Il faut et il suffit de rajouter fflush(stdin) entre les 2 fgets()
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.
Ajouter un commentaire
Ce document intitulé « C / fonction fopen » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
5 extensions si vous voulez revenir à l'ancien Facebook