Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C] fonctions de fichiers

Sujet résolu
    13 avril 2006 à 20:13:06

    Bonjour les zér0s !
    Voila, je voudrais créer plusieurs fonctions :
    • FILE* FICHIER_ouvrirFichier(int choix, char* nom);
    • FILE* FICHIER_renameFichier(char* nom,char* old);
    • FILE* FICHIER_lireFichier(FILE* fichier);
    </span>
    J'ai deja essayé la premiere !
    Voici le code !
    FILE* FICHIER_ouvrirFichier(int  choix, char* nom)
    {
       FILE *fichier = NULL;
       if(choix == 1)
       {
          fichier = fopen(nom,"a+");
          if (fichier != NULL)
          {
              // On peut lire et écrire dans le fichier
              rewind(fichier);
          }
          else
          {
              // On affiche un message d'erreur si on veut
              printf("Impossible d'ouvrir le fichier\n");
              return fichier;
          }

       }
       else if(choix == 2)
       {
          fichier = fopen(nom,"w+");
          if (fichier != NULL)
          {
              // On peut lire et écrire dans le fichier
              rewind(fichier);
          }
          else
          {
              // On affiche un message d'erreur si on veut
              printf("Impossible d'ouvrir le fichier\n");
              return fichier;
          }
       }
       else
       {
          return;
       }
    }

    Pobleme :


    Quand je l'appelle comme ceci :
    FILE *fichier = NULL;
    fichier = FICHIER_ouvrirFichier(2,"test.txt");

    Aucun fichier n'est créé !
    Pourquoi ?
    • Partager sur Facebook
    • Partager sur Twitter
      13 avril 2006 à 20:30:30

      Hum, quelques problèmes dans ce code...
      Le plus gros, c'est que tu ne retournes jamais le pointeur vers ton fichier si celui-ci à été créé.

      Voilà une correction :

      FILE* FICHIER_ouvrirFichier(int  choix, const char* nom)
      {
         FILE *fichier = NULL;
         if(choix == 1)
         {
            fichier = fopen(nom,"a+");
            if (fichier != NULL)
            {
                // On peut lire et écrire dans le fichier
                rewind(fichier);
            }
            else
            {
                // On affiche un message d'erreur si on veut
                printf("Impossible d'ouvrir le fichier\n");
                return NULL;
            }

         }
         else if(choix == 2)
         {
            fichier = fopen(nom,"w+");
            if (fichier != NULL)
            {
                // On peut lire et écrire dans le fichier
                rewind(fichier);
            }
            else
            {
                // On affiche un message d'erreur si on veut
                printf("Impossible d'ouvrir le fichier\n");
                return NULL;
            }
         }
         else
         {
            return NULL;
         }
         return fichier;
      }


      Sinon une alternative (plus court et plus clair) :

      FILE* FICHIER_ouvrirFichier(int  choix, const char* nom)
      {
         FILE *fichier = NULL;

         switch(choix)
         {
         case 1:
                 fichier = fopen(nom, "a+");
                 break;
         case 2:
                 fichier = fopen(nom,"w+");
                 break;
         default:
                 return NULL;
         }

         if(!fichier)
         {
                 printf("Impossible d'ouvrir le fichier\n");
                 return NULL;
         }
         
         rewind(fichier);
         return fichier;
      }
      • Partager sur Facebook
      • Partager sur Twitter
        13 avril 2006 à 20:40:16

        Merci !
        Et quels sont les autres problemes ?
        • Partager sur Facebook
        • Partager sur Twitter
          13 avril 2006 à 20:48:39

          Bah, dans tout les return fichier; que tu as mis, fichier vaut NULL, je concède que c'est pas vraiment une erreur, mais bon un return NULL; est quand même plus logique.
          D'autre part dans ton dernier else, t'as un return; alors que ta fonction est sensée retourné un pointeur vers une structure FILE, suffise que le compilateur soit un peu sérieux et il te retourne une erreur.
          Voila, voila, ça doit être à peu près tout ^^
          • Partager sur Facebook
          • Partager sur Twitter
            13 avril 2006 à 21:13:13

            Ok merci ! Mais pourquoi ca marche pas ! Ca me crée aucun fichier et ecrit :
            Impossible d'ouvrir le fichier
            • Partager sur Facebook
            • Partager sur Twitter
              13 avril 2006 à 22:12:05

              C'est qu'il n'arrive pas à le créer, mais c'est bizarre, t'as pris quel code ?
              Chez moi les deux que je t'ai passé marchent parfaitement.
              • Partager sur Facebook
              • Partager sur Twitter
                13 avril 2006 à 22:19:37

                La fonction est correcte , le probleme vient de son appel !
                Quand je fais ca :
                fichier = FICHIER_ouvrirFichier(2,"test.txt");

                Et quand je fais ca avec des variables :
                fichier = FICHIER_ouvrirFichier(choixOuverture,nom);

                Le pire c'est que quand je fais ca avant l'appel de la fonction
                printf("%ld et %s",choixOuverture,nom);

                Ca m'affiche exactement ce que j'ai tapé ! Donc meme si je tape 2 puis test.txt, ca fonctionne pas !
                Vous avez une idée ?


                EDIT : je sais d'ou vient le probleme ! Reprenons me fonction !
                FILE* FICHIER_ouvrirFichier(int choix,char* nom)
                {
                   FILE *fichier = NULL;
                   printf("%ld et %s",choix,nom);
                   if(choix == 1)
                   {
                      fichier = fopen(nom,"a+");
                      if (fichier != NULL)
                      {
                          // On peut lire et écrire dans le fichier
                          rewind(fichier);
                      }
                      else
                      {
                          // On affiche un message d'erreur si on veut
                          printf("Impossible d'ouvrir le fichier\n");
                          return NULL;
                      }

                   }
                   else if(choix == 2)
                   {
                      fichier = fopen(nom,"w+");
                      if (fichier != NULL)
                      {
                          // On peut lire et écrire dans le fichier
                          rewind(fichier);
                      }
                      else
                      {
                          // On affiche un message d'erreur si on veut
                          printf("Impossible d'ouvrir le fichier\n");
                          return NULL;
                      }
                   }
                   else
                   {
                      return NULL;
                   }
                   return fichier;
                }

                J'y ai rajouté une ligne : printf("%ld et %s",choix,nom);
                Et bien la variable nom contient des trucs du genre :
                &~#{[~|(è"é\~(&~(, enfin des carateres invalides pour creer un fichier !
                Ce qui est marrant , c'est que quand je fais un printf sur ces variables que je transmet à la fonction
                printf("%ld et %s",choixOuverture,nom);
                le résultat est correct !
                Pourquoi la fonction modifie le nom du fichier ?


                • Partager sur Facebook
                • Partager sur Twitter
                  13 avril 2006 à 22:42:27

                  C'est louche...
                  Mais j'ai pas compris, elle marche ou elle marche pas la fonction avec des arguments genre 2 et "test.txt" passés directement?

                  Sinon, essaye en changeant ton argument "char* nom" en "const char* nom", normalement ça évite que la fonction modifie la variable nom.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    14 avril 2006 à 8:55:25

                    ca change rien ! en fait, quand j'évalue les deux variables nom et choixOuverture(ce sont les parametres que je passse a la fonction) , ils sont corrects !
                    Mais quand je les évaluea l'intérieur de la fonction , le nom que j'ai entré est du genre :&~#{[~|(è"é\~(&~( !
                    • Partager sur Facebook
                    • Partager sur Twitter
                      14 avril 2006 à 9:36:07

                      Citation : NarTy

                      Bonjour les zér0s !
                      Voila, je voudrais créer plusieurs fonctions :
                      <couleur nom="vertf">

                      • FILE* FICHIER_ouvrirFichier(int choix, char* nom);
                      • FILE* FICHIER_renameFichier(char* nom,char* old);
                      • FILE* FICHIER_lireFichier(FILE* fichier);


                      <...>
                      Quand je l'appelle comme ceci :

                      FILE *fichier = NULL;
                      fichier = FICHIER_ouvrirFichier(2,"test.txt");


                      Aucun fichier n'est créé !

                      Pourquoi ?

                      • Il y a un return tout seul. Ca devrait être return NULL.
                      • Envisager l'usage de switch-case...
                      • Tous ces returns compliquent la lecture du code pour rien. Un return fichier; à la fin suffit...
                      • pour que le fichier soit créé, il faut le fermer...

                      Ceci fonctionne.

                      #include <stdio.h>

                      static FILE* FICHIER_ouvrirFichier(int choix, char const* nom)
                      {
                         FILE *fichier = NULL;
                         switch (choix)
                         {
                         case 1:
                            fichier = fopen(nom, "a+");
                            if (fichier != NULL)
                            {
                               // On peut lire et écrire dans le fichier
                               rewind(fichier);
                            }
                            else
                            {
                               // On affiche un message d'erreur si on veut
                               printf("Impossible d'ouvrir le fichier\n");
                            }
                            break;
                         case 2:

                            fichier = fopen(nom, "w+");
                            if (fichier != NULL)
                            {
                               // On peut lire et écrire dans le fichier
                               rewind(fichier);
                            }
                            else
                            {
                               // On affiche un message d'erreur si on veut
                               printf("Impossible d'ouvrir le fichier\n");
                            }
                            break;
                         default:
                            printf ("Parametre %d inconnu.\n", choix);
                         }
                         return fichier;
                      }

                      int main(void)
                      {
                         FILE *fichier = FICHIER_ouvrirFichier(2, "test.txt");

                         if (fichier != NULL)
                         {
                            fprintf (fichier, "Hello world\n");

                            fclose (fichier);
                         }

                         return 0;
                      }

                      Citation : test.txt



                      Hello world


                      Pose des questions si tu ne comprends pas.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Music only !
                        14 avril 2006 à 16:01:36

                        Merci mais , j'ai toujours le même probleme !
                        Quand j'affiche les variables choixOuverture et nom que je passe en parametres de la fonction FICHIER_ouvrirFichier, je vois par exemple 2 et test.txt . Pourtant, quand j'affiche les variables dans la fonction, c'est à dire :
                        printf("%ld et %s",choix,nom);

                        le choix est bien affiché , mais le nom est du genre : &~#{[~|(è"é\~(&~( !
                        Poruquoi ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          14 avril 2006 à 16:04:16

                          Citation : NarTy

                          Merci mais , j'ai toujours le même probleme !

                          Poruquoi ?

                          Ca le fait avec le code que j'ai posté ? Sinon, poste le code complet mais minimum qui présente ce défaut.
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Music only !
                            14 avril 2006 à 16:10:49

                            Tres bien :

                            La fonction :

                            La même que celle de -ed- , mais je rajoute cette ligne au début de la fonction :
                            printf("%ld et %s",choix,nom);

                            Et ca m'affiche : <citation nom="printf("%ld et %s",choix,nom);">2 et &~#{[~|(è"é\~(&~( ! </citation>

                            Le Main


                            Via des scanf et des printf, je demande le choix et le nom du fichier !
                            Ensuite je fais ceci :
                               FILE *fichier = FICHIER_ouvrirFichier(choix,nom);

                               if (fichier != NULL)
                               {

                                  fclose (fichier);
                               }
                            • Partager sur Facebook
                            • Partager sur Twitter
                              14 avril 2006 à 16:17:34

                              Citation : NarTy

                              Tres bien :<...>


                              Poste le code exact.
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Music only !
                                14 avril 2006 à 16:31:35

                                ok !

                                      FILE *fichier = NULL;
                                      int choixOuverture = MENU_ouvrirFichier();
                                      char* nom = MENU_nomFichier("Quel est le nom de votre fichier ?");
                                      fichier = FICHIER_ouvrirFichier(choixOuverture,nom);

                                et les fonctions :
                                int MENU_ouvrirFichier()
                                {
                                   int choixOuverture;
                                   printf("Vous voulez ouvrir un ...\n");
                                   printf("      ... (1)fichier deja existant ? \n");
                                   printf("      ... (2)nouveau fichier ?\n");
                                   scanf("%ld",&choixOuverture);
                                   return choixOuverture;
                                }
                                char* MENU_nomFichier(char* question)
                                {
                                   char nom[100];
                                   printf("%s",question);
                                   scanf("%s",nom);
                                   return nom;
                                }

                                FILE* FICHIER_ouvrirFichier(int choix, char const* nom)
                                {
                                   FILE *fichier = NULL;


                                   switch (choix)
                                   {
                                   case 1:
                                      fichier = fopen(nom, "a+");
                                      if (fichier != NULL)
                                      {
                                         // On peut lire et écrire dans le fichier
                                         rewind(fichier);
                                      }
                                      else
                                      {
                                         // On affiche un message d'erreur si on veut
                                         printf("Impossible d'ouvrir le fichier\n");
                                      }
                                      break;
                                   case 2:

                                      fichier = fopen(nom, "w+");
                                      if (fichier != NULL)
                                      {
                                         // On peut lire et écrire dans le fichier
                                         rewind(fichier);
                                      }
                                      else
                                      {
                                         // On affiche un message d'erreur si on veut
                                         printf("Impossible d'ouvrir le fichier\n");
                                      }
                                      break;
                                   default:
                                      printf ("Parametre %d inconnu.\n", choix);
                                   }
                                   return fichier;
                                }
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  14 avril 2006 à 17:01:29

                                  Je n'ai pas tout lu, mais il manque un:
                                  break;
                                  a la fin de ta fonction (après le default).
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    14 avril 2006 à 17:23:04

                                    Merci ! Mais ca change rien !
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      14 avril 2006 à 17:29:36

                                      Citation : NarTy

                                      ok !


                                            FILE *fichier = NULL;
                                            int choixOuverture = MENU_ouvrirFichier();
                                            char* nom = MENU_nomFichier("Quel est le nom de votre fichier ?");
                                            fichier = FICHIER_ouvrirFichier(choixOuverture,nom);



                                      Ne compile pas.

                                      C'est si difficile que ça de poster le code complet qui compile ? C'est secret défense (d'éléphant) ou quoi ? Je ne sais pas ce que tu as oublié, ce que tu as fait avant...

                                      En tout cas, j'ai trouvé un bug grave.

                                      Compiling: main.c
                                      main.c: In function `MENU_ouvrirFichier':
                                      main.c:11: warning: long int format, int arg (arg 2)
                                      main.c: In function `MENU_nomFichier':
                                      main.c:19: warning: function returns address of local variable

                                      En effet, si une fonction retourne une adresse, celle-ci doit être celle d'une variable encore valide après exécution de la fonction. Or tu retournes l'adresse d'une variable locale. L'utilisation d'une telle adresse invoque un comportement indéfini. Tout peut arriver.

                                      Les bonnes solutions sont connues :
                                      • Passer adresse et taille du tableau en paramètre
                                      • Retourner l'adresse d'un bloc alloué. Penser à le libérer après usage...

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Music only !
                                        14 avril 2006 à 20:25:49

                                        et si je fais comme ca c'est pas bon ?

                                        void MENU_nomFichier(char* question,char* nom)
                                        {
                                           printf("%s",question);
                                           scanf("%s",nom);
                                        }
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Anonyme
                                          14 avril 2006 à 20:27:55

                                          scanf atten l'adresse d'une chaine de caractaire et pas un caractaire !
                                          donc tu doit faire :

                                          void MENU_nomFichier(char* question,char* nom)
                                          {
                                             printf("%s",question);
                                             scanf("%s",nom);
                                          }
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            14 avril 2006 à 20:29:45

                                            Oui mais ensuite ca me fait , rapport d'erreur de windows etc ..
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Anonyme
                                              14 avril 2006 à 20:32:58

                                              Ca vient pas de la fonction alors !
                                              C'est quand tu l'appelle ! (je vient de tester !)
                                              Montre nous le reste de ton code
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                14 avril 2006 à 21:23:17

                                                VOila son appel :
                                                      char* nom = NULL;
                                                      MENU_nomFichier("Quel est le nom de votre fichier ?",nom);

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  14 avril 2006 à 21:27:12

                                                  Citation : NarTy

                                                  VOila son appel :

                                                        char* nom = NULL;
                                                        MENU_nomFichier("Quel est le nom de votre fichier ?",nom);



                                                  Ben oui. Si 'nom' ne pointe pas sur un bloc valide, ça va pas fonctionner...
                                                        char nom[64];
                                                        MENU_nomFichier("Quel est le nom de votre fichier ?",nom);

                                                  Et je recommande de passer la taille à la fonction afin qu'elle puisse effectuer des contrôles :

                                                        char nom[64];
                                                        MENU_nomFichier("Quel est le nom de votre fichier ?",nom,sizeof nom);

                                                  Et dans le fonction : fgets() + elimination du '\n' final...

                                                  http://mapage.noos.fr/emdel/notes.htm#saisie
                                                  http://mapage.noos.fr/emdel/notes.htm#fichiers
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  Music only !
                                                    14 avril 2006 à 21:39:49

                                                    OUF ! ca marche, je vous remercie beaucoup tous les deux !
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter

                                                    [C] fonctions de fichiers

                                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                    • Editeur
                                                    • Markdown