Fopen()

Résolu
openny -  
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

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

  1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    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
  2. openny
     
    Ç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
  3. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    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
    1. openny
       
      "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
  4. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. openny
     
    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
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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