Fopen()
Résolu
openny
-
fiddy Messages postés 441 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 441 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.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.
-
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, -
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!