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
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

/*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

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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.
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,
0
Ç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");
  
}
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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.

0
"fgets(buf, 11, fp);
{
Tu as oublié le while. "

Le while? quel while, il faut qu'il affiche toute la chaine de 11 caractères
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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,
0

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!
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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.
0