Fopen()
Résolu/Fermé
openny
-
25 août 2014 à 19:51
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 27 août 2014 à 14:09
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 27 août 2014 à 14:09
A voir également:
- Arduino fopen
- Arduino switch case string ✓ - Forum C++
- Processing arduino download - Télécharger - Langages
- Arduino ide ne se lance pas ✓ - Forum Logiciels
- Arduino math.h - Forum C++
- Grafcet arduino - Forum C
5 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 843
25 août 2014 à 21:11
25 août 2014 à 21:11
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"); }
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 843
26 août 2014 à 16:22
26 août 2014 à 16:22
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.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 843
27 août 2014 à 10:56
27 août 2014 à 10:56
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!
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 843
27 août 2014 à 14:09
27 août 2014 à 14:09
D'ac.
En tout cas fait attention à l'utilisation des accolades. Ce n'est pas fait pour regrouper des instructions (il y a les fonctions pour ça).
Le principal est que le problème soit réglé :-). Je mets en résolu.
En tout cas fait attention à l'utilisation des accolades. Ce n'est pas fait pour regrouper des instructions (il y a les fonctions pour ça).
Le principal est que le problème soit réglé :-). Je mets en résolu.