Fopen()
Résolu
openny
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
je viens de découvrir la fonction fopen() et je m'entraine à la manier. Dans ce programme, l'ordi doit ouvrir le fichier amis.txt où il y a écrit "coucou les amis", le lire puis écrire à la place 10 'c'.
Ensuite, l'ordi doit le relire et afficher ce que maintenant il y a d'écrit.
Tout va bien sauf qu'il ne m'affiche pas à la fin ce qu'il y a d'écrit. Si quelqu'un voit le problème...merci
je viens de découvrir la fonction fopen() et je m'entraine à la manier. Dans ce programme, l'ordi doit ouvrir le fichier amis.txt où il y a écrit "coucou les amis", le lire puis écrire à la place 10 'c'.
Ensuite, l'ordi doit le relire et afficher ce que maintenant il y a d'écrit.
Tout va bien sauf qu'il ne m'affiche pas à la fin ce qu'il y a d'écrit. Si quelqu'un voit le problème...merci
/*Programme test qui ouvre des fichiers, les lis, écrits dedans...*/ #include <stdio.h> #include <stdlib.h> #include <string.h> void erreur(void); int main() { char f1[8], f2[8], f3[8]; FILE *fp; if( (fp=fopen("programmes/amis.txt", "r")) == NULL) {erreur();} fscanf(fp, "%s %s %s", &f1, &f2, &f3); printf("La lecture donne: %s %s %s\n", f1, f2, f3); if((fp=fopen("programmes/amis.txt", "w"))==NULL) {erreur();} int count; for(count=1; count<=10; count++) {putc('c', fp); } if((putc('\n', fp))==EOF){erreur();} if((fp=fopen("programmes/amis.txt", "r"))==NULL) {erreur();} char c[11]; char buf[11]; fgets(buf, 11, fp); {int i=0; while(buf[i] && (buf[i]!='\n'))i++; buf[i]='\0';} strcpy(c, buf); printf("Maintenant, amis.txt contient: %s\n", c); exit(0); } void erreur(void) { fprintf(stderr, "Une erreur est survenus"); exit(1); }
5 réponses
Bonjour,
fscanf(fp, "%s %s %s", &f1, &f2, &f3);
Pas d'esperluette devant f1, f2 et f3 puisqu'ils représentent ici déjà l'adresse sur la zone contenant les données.
int main()
=> int main(void)
for(count=1; count<=10; count++)
Utilise plutôt count=0; count <10; count++. Ca revient au même, mais je te conseille de prendre cette habitude puisque les indices commencent à 0.
exit(0);
Utilise plutôt return 0;
Pour la fonction erreur, je te conseille de plutôt faire le return dans le main() et de renvoyer EXIT_FAILURE au lieu de 1.
Tu ouvres les fichiers mais il faut les fermer avant de les rouvrir et avant de quitter le programme.
La fermeture se fait à l'aide de la fonction fclose().
Attention à l'indentation qui n'est pas régulière. Du coup, ça rend difficile la lecture. Evite de tout mettre sur une même ligne. Ca ne rendra pas le programme plus efficace.
Par exemple : {erreur();}
Cdlt,
fscanf(fp, "%s %s %s", &f1, &f2, &f3);
Pas d'esperluette devant f1, f2 et f3 puisqu'ils représentent ici déjà l'adresse sur la zone contenant les données.
fscanf(fp, "%s %s %s", f1, f2, f3);
int main()
=> int main(void)
for(count=1; count<=10; count++)
Utilise plutôt count=0; count <10; count++. Ca revient au même, mais je te conseille de prendre cette habitude puisque les indices commencent à 0.
exit(0);
Utilise plutôt return 0;
Pour la fonction erreur, je te conseille de plutôt faire le return dans le main() et de renvoyer EXIT_FAILURE au lieu de 1.
Tu ouvres les fichiers mais il faut les fermer avant de les rouvrir et avant de quitter le programme.
La fermeture se fait à l'aide de la fonction fclose().
Attention à l'indentation qui n'est pas régulière. Du coup, ça rend difficile la lecture. Evite de tout mettre sur une même ligne. Ca ne rendra pas le programme plus efficace.
Par exemple : {erreur();}
Cdlt,
Ça ne marche toujours pas. Cette fois, il lit tout à la fin "coucou les" alors qu'il y a maintenant écrit "cccccccccc", c'est comme si il retenait la phrase d'avant. Je te redonne mon code
/*Programme test qui ouvre des fichiers, les lis, les écrits...*/ #include <stdio.h> #include <stdlib.h> #include <string.h> void erreur(void); int main(void) { char f1[8], f2[8], f3[8]; FILE *fp; if( (fp=fopen("amis.txt", "r")) == NULL) { erreur(); return EXIT_FAILURE; } fscanf(fp, "%s %s %s", f1, f2, f3); printf("La lecture donne: %s %s %s\n", f1, f2, f3); fclose(fp); fflush(fp); if ((fp=fopen("amis.txt", "w"))== NULL) { erreur(); return EXIT_FAILURE; } int count; for(count=0; count<10; count++) { putc('c', fp);} if((putc('\n', fp))==EOF) { erreur(); return EXIT_FAILURE; } fclose(fp); fflush(fp); if((fp=fopen("programmes/amis.txt", "r"))==NULL) { erreur(); return EXIT_FAILURE; } char c[11]; /*pour la chaine*/ char buf[11]; fgets(buf, 11, fp); { int i=0; while(buf[i] && (buf[i]!='\n'))i++; buf[i]='\0'; } strcpy(c, buf); printf("Maintenant, amis.txt contient: %s\n", c); fclose(fp); fflush(fp); return 0; } void erreur(void) { fprintf(stderr, "Une erreur est survenus"); }
fflush(fp);
Inutile, le fichier est déjà fermé.
Il y a du progrès dans la mise en forme du code, mais il reste à voir les espaces devant chaque instruction. Par exemple, 4 espaces. Puis 8 si tu es dans une sous-partie, etc.
fgets(buf, 11, fp);
{
Tu as oublié le while.
int i=0;
while(buf[i] && (buf[i]!='\n'))i++;
buf[i]='\0';
}
Si ton but est de remplacer le '\n' par '\0', tu as la fonction strchr() qui va positionner directement le pointeur au bon endroit.
Inutile, le fichier est déjà fermé.
Il y a du progrès dans la mise en forme du code, mais il reste à voir les espaces devant chaque instruction. Par exemple, 4 espaces. Puis 8 si tu es dans une sous-partie, etc.
fgets(buf, 11, fp);
{
Tu as oublié le while.
int i=0;
while(buf[i] && (buf[i]!='\n'))i++;
buf[i]='\0';
}
Si ton but est de remplacer le '\n' par '\0', tu as la fonction strchr() qui va positionner directement le pointeur au bon endroit.
Ah, je pensais qu'il fallait remplacer toutes les lignes et pas uniquement la 1ère.
Ok pas besoin de while alors.
Mais alors, je pause une autre question :
"fgets(buf, 11, fp);
{
Pourquoi une accolade ? Si c'est pour définir une frame et donc d'encapsuler des variables, autant mettre ce bloc dans une fonction statique. Tu gagneras en lisibilité. Mais bon, en général, on utilise strchr(); comme dit dans le post ci-dessus.
Sinon, j'ai vu que tu as changé des choses par rapport à ta première version :
Tu ouvres le fichier amis.txt au lieu de programmes/amis.txt. Mais tu n'as pas reporté cette modification partout. Dans le dernier fopen() :
(fp=fopen("programmes/amis.txt", "r")
Tu as fait d'autres modifications (hormis celles que je t'ai signalées) ?
Cdlt,
Ok pas besoin de while alors.
Mais alors, je pause une autre question :
"fgets(buf, 11, fp);
{
Pourquoi une accolade ? Si c'est pour définir une frame et donc d'encapsuler des variables, autant mettre ce bloc dans une fonction statique. Tu gagneras en lisibilité. Mais bon, en général, on utilise strchr(); comme dit dans le post ci-dessus.
Sinon, j'ai vu que tu as changé des choses par rapport à ta première version :
Tu ouvres le fichier amis.txt au lieu de programmes/amis.txt. Mais tu n'as pas reporté cette modification partout. Dans le dernier fopen() :
(fp=fopen("programmes/amis.txt", "r")
Tu as fait d'autres modifications (hormis celles que je t'ai signalées) ?
Cdlt,
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Pour les accolades, je pensais qu'il comprendrait mieux que c'est à exécuter ensemble. Je me suis un peu emmêler avec les autres programmes de test que j'avais créés. Du coup, l'erreur venait qu'il y avait deux amis.txt pas au même endroit, c'est ce qui posé problème....c'est très bête
en tout cas, merci à toi!
en tout cas, merci à toi!