Partage
  • Partager sur Facebook
  • Partager sur Twitter

Fonction fgets()

Deux petits problèmes

Sujet résolu
    1 septembre 2011 à 15:26:58

    Bonjour,

    Voilà, 1er problème, je tente d’utiliser la fonction fgets pour écrire dans un fichier, cependant mon pointeur sur fichier me renvoie NULL, je ne comprends pas vraiment pourquoi.

    Voici la partie du code :

    printf("\nPour ecrire dans un fichier, rentrez son titre precede de son emplacement\n\n");
    
                    char titre_fichier_tab[100];
                    fgets(titre_fichier_tab, 100, stdin);
                    FILE *fichier = NULL;
                    fichier = fopen(titre_fichier_tab,"w");
                    viderBuffer();
    


    Je passe donc par mon else (que je vais vous montrer après, et je penses qu'il y a également un problème avec mon if.

    Voici la suite

    if (fichier != NULL)
       {
            printf("\nEcrivez maintenant ce que vous voulez ecrire dans le fichier (limitation 1000 caracteres)\n\n");
            char texte_tab[1000];
            fgets(texte_tab, 1000, stdin);
            viderBuffer();
    
            // On l'écrit dans le fichier
            fprintf(fichier, "%s", texte_tab);
            fclose(fichier);
       }
    else
       {
            // On affiche un message d'erreur
            printf("Impossible d'ouvrir le fichier %s", titre_fichier_tab);
       }
    


    Les deux problèmes dans le même code :


    printf("\nPour ecrire dans un fichier, rentrez son titre precede de son emplacement\n\n");
    
                    char titre_fichier_tab[100];
                    fgets(titre_fichier_tab, 100, stdin);
                    FILE *fichier = NULL;
                    fichier = fopen(titre_fichier_tab,"w");
                    viderBuffer();
                    if (fichier != NULL)
                        {
                            printf("\nEcrivez maintenant ce que vous voulez ecrire dans le fichier (limitation 1000 caracteres)\n\n");
                            char texte_tab[1000];
                            fgets(texte_tab, 1000, stdin);
                            viderBuffer();
    
                            // On l'écrit dans le fichier
                            fprintf(fichier, "%s", texte_tab);
                            fclose(fichier);
                        }
                    else
                        {
                            // On affiche un message d'erreur
                            printf("Impossible d'ouvrir le fichier %s", titre_fichier_tab);
                        }
    

    • Partager sur Facebook
    • Partager sur Twitter

    Kevin Cousin, passionné d'informatique

      1 septembre 2011 à 15:29:16

      Tu t' embête pour rien..

      Autant faire un open/write/close..
      • Partager sur Facebook
      • Partager sur Twitter
      Fatalement vôtre
        1 septembre 2011 à 15:30:17

        Qu'es ce que tu entends par là ?

        Il y a une fonction fwrite() ou quelque chose du genre ?

        Le problème était que la fonction scanf() ne prends pas en compte les espace.
        • Partager sur Facebook
        • Partager sur Twitter

        Kevin Cousin, passionné d'informatique

          1 septembre 2011 à 15:31:48

          Le soucis avec fgets est qu'il concerve le '\n' final,
          Il suffit de le supprimer :
          titre_fichier_tab[strlen(titre_fichier_tab)-1] = '\0';

          Mieux vaut vérifier le retour de fgets avant hein ;)

          @Tardis: Mieux vaut utiliser des fonctions standards et portables ...
          • Partager sur Facebook
          • Partager sur Twitter
          🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles  - ♡ Copying is an act of love.
            1 septembre 2011 à 15:33:37

            Salut,

            Citation : kevin.cousin


            Voilà, 1er problème, je tente d’utiliser la fonction fgets pour écrire lire dans un fichier, cependant mon pointeur sur fichier me renvoie NULL, je ne comprends pas vraiment pourquoi.


            ;)

            Sinon, le problème viens du fait que fgets lit sur l'entrée standard jusqu'à rencontrer un '\n' ou bien jusqu'à ce qu'il n'y ait plus de place dans le tampon spécifié ou qu'elle rencontre la fin de fichier. Or, lorsque fgets rencontre le '\n', elle l'ajoute au tampon passé en argument. A cause de ce caractère en plus, le nom de fichier que tu passes à fopen est invalide, d'où l'erreur.

            Pour résoudre ce problème simplement, tu peux utiliser ce petit bout de code après ton appel à fgets:

            char * p;
            
            if ((p = strchr(titre_fichier_tab, '\n')) != NULL)
            	*p = '\0';
            


            EDIT: grilled :-°
            • Partager sur Facebook
            • Partager sur Twitter
              1 septembre 2011 à 15:34:13

              Oui mais là mon pointeur *fichier vaut NULL, c'est pas à cause du \n qu'il vaut NULL si ?
              • Partager sur Facebook
              • Partager sur Twitter

              Kevin Cousin, passionné d'informatique

                1 septembre 2011 à 15:35:33

                Si ... fopen() n'arrive pas trouver un fichier qui se termine par un saut de ligne ;)

                Utilise la solution de Taurre ou la mienne (sachant que si tu ne vérifies pas la validé de la chaine il est préférable de prendre celle de taurre ;) )
                • Partager sur Facebook
                • Partager sur Twitter
                🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles  - ♡ Copying is an act of love.
                  1 septembre 2011 à 15:37:40

                  Ben oui, pas bête ^^

                  Cependant

                  printf("\nPour ecrire dans un fichier, rentrez son titre precede de son emplacement\n\n");
                  
                                  char titre_fichier_tab[100];
                                  fgets(titre_fichier_tab, 100, stdin);
                                  char * p;
                  
                                  if ((p = strchr(titre_fichier_tab, '\n')) != NULL)
                                  *p = '\0';
                                  FILE *fichier = NULL;
                                  fichier = fopen(titre_fichier_tab,"w");
                                  viderBuffer();
                                  if (fichier != NULL)
                  


                  J'ai toujours le même problème :/
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Kevin Cousin, passionné d'informatique

                    1 septembre 2011 à 15:41:34

                    Tu effectues une opération de lecture avant celle-ci (un appel à scanf par exemple)?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      1 septembre 2011 à 15:43:23

                      Le code n'a plus de problème, le problème vient soit de l'entré (ce que tu entres ) soit d'un problème de buffer (cf La question de Taurre)
                      • Partager sur Facebook
                      • Partager sur Twitter
                      🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles  - ♡ Copying is an act of love.
                        2 septembre 2011 à 10:17:14

                        Effectivement, au début du code (bien plus haut que ce que je vous ai donné) il y a effectivement un scanf() .

                        Je vais de suite le remplacer par un fgets() et vider le buffer, il doit garder quelque chose dedans avec le scanf() qu'il ne comprends pas.
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Kevin Cousin, passionné d'informatique

                          2 septembre 2011 à 10:20:15

                          Oui en effet, après un scanf, il reste toujours au moins un '\n' dans le buffer.
                          Ce qui pose problème si on utilise fgets ensuite car fgets va lire le '\n' en premier et donc ne vas rien enregistrer dans la chaine (sauf le '\n' :p )
                          • Partager sur Facebook
                          • Partager sur Twitter
                          🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles  - ♡ Copying is an act of love.
                            2 septembre 2011 à 11:20:14

                            Alors, après toutes mes petites modifications, j'ai toujours un problème (désolé je suis débutant hein :-° )

                            Donc en fait mon pointeur fichier de type FILE est égal à NULL :'( il ne prends pas la valeur de ma variable, et du coup de passe par le else, et j'ai une erreur (que j'ai moi même créé).

                            Donc voici le code qui ne fonctionne pas :


                            viderBuffer();
                                            // Code pour le choix 2 . Ecrire dans un fichier
                                            printf("\nPour ecrire dans un fichier, rentrez son titre precede de son emplacement\n\n");
                            
                                            char titre_fichier[100];
                                            int *pTitre_Fichier = &titre_fichier;
                                            // J'envoie un pointeur à ma fonction saisie qui est "sensé" retirer le \n à la fin faire le fgets()
                                            saisie(pTitre_Fichier, 100);
                            
                                            FILE* fichier = NULL;
                                            fichier = fopen(titre_fichier, "r+");
                                            viderBuffer();
                                            // Je ne passe pas par le if mais par le else 
                                            if (fichier != NULL)
                                                {
                                                    printf("\nEcrivez maintenant ce que vous voulez ecrire dans le fichier (limitation 1000 caracteres)\n\n");
                                                    char texte[1000];
                                                    int *pTexte = &texte;
                                                    saisie(pTexte, 1000);
                            
                                                    // On l'écrit dans le fichier
                                                    fprintf(fichier, "%s", texte);
                                                    fclose(fichier);
                                                }
                                            else
                                                {
                                                    // On affiche un message d'erreur
                                                    printf("\nImpossible de creer le fichier %s\n", titre_fichier);
                                                }
                            



                            Désolé pour la syntaxe un peu décalée vers la droite mais ce code se trouve dans un gros switch.

                            Et voici ma fonction saisie()


                            int saisie(char *chaine, int longueur)
                            {
                                char *p = NULL;
                            
                                // On lit le texte saisi au clavier
                                if (fgets(chaine, longueur, stdin) != NULL)  // Si la saisie se fait sans erreur
                                {
                                    p = strchr(chaine, '\n'); // On recherche l'"Entrée"
                                    if (p != NULL) // Si on a trouvé le retour à la ligne
                                    {
                                        *p = '\0'; // On remplace ce caractère par \0
                                    }
                                    return 1; // On renvoie 1 si la fonction s'est déroulée sans erreur
                                }
                                else
                                {
                                    return 0; // On renvoie 0 s'il y a eu une erreur
                                }
                            }
                            



                            Merci d'avance pour votre aide, c'est grâce à vous que le SDZ prends un intérêt ^^
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Kevin Cousin, passionné d'informatique

                              2 septembre 2011 à 11:22:58

                              Bah un peu de debug ca fait jamais de mal..

                              Affiche ta chaîne au début et a la fin de saisie().

                              Tu peut verifier si elle rentre dans le if aussi.
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Fatalement vôtre
                                2 septembre 2011 à 11:25:14

                                Ce n'est pas à faire en temps normale on devrait utiliser un debuger, mais pour allez plus vite, tu peux rajouter un :
                                printf("[%s]\n", titre_fichier);
                                Avant fopen() et nous afficher tout le contenue de la console ? (tous les caractères contenues entre les crochets, même les '\n' et les espace ;) )

                                Edit: Un peu grilled :-°
                                • Partager sur Facebook
                                • Partager sur Twitter
                                🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles  - ♡ Copying is an act of love.
                                  2 septembre 2011 à 11:40:54

                                  Citation


                                  Affiche ta chaîne au début et a la fin de saisie().



                                  Elle est identique à la saisie, et je penses qu'elle garde l'\n mais je ne suis pas sur.

                                  Citation


                                  Ce n'est pas à faire en temps normale on devrait utiliser un debuger, mais pour allez plus vite, tu peux rajouter un :
                                  printf("[%s]\n", titre_fichier);



                                  Image utilisateur

                                  Sinon j'ai des nouvelles !!!

                                  Si j'écris c:\test.txt ou c:\\test.txt je passes dans le else.

                                  Cependant, si je tape simplement test.txt, je passes dans le if, un peu bizarre non ?
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Kevin Cousin, passionné d'informatique

                                    2 septembre 2011 à 11:43:02

                                    Problème de droits pour créer le fichier?
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      2 septembre 2011 à 11:43:29

                                      Non, je suis admin
                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      Kevin Cousin, passionné d'informatique

                                        2 septembre 2011 à 11:44:09

                                        Le problème vient de cette ligne, je pense :

                                        int *pTitre_Fichier = &titre_fichier;
                                        


                                        Déjà, je n'en vois pas l'intérêt.
                                        Ensuite, titre_fichier est de type char[], pas de &, non ?

                                        PS : essaie de faire un fopen sur pTitre_Fichier, ça devrait fonctionner, non ?
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Staff désormais retraité.
                                          2 septembre 2011 à 11:44:44

                                          On voit bien que le '\n' n' est plus a la fin via le printf.

                                          Sinon il se situe ou ton fichier test.txt..?
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Fatalement vôtre
                                            2 septembre 2011 à 11:46:06

                                            Nul part ^^ je fais un r+ pour le créer justement ^^

                                            Je vais suivre les conseils de lucas et je vous donne les nouvelles
                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            Kevin Cousin, passionné d'informatique

                                              2 septembre 2011 à 11:48:11

                                              Désoler mais "r+" ne créer pas de fichier, il doit exister. Par contre w, w+ et a créent un fichier.
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                2 septembre 2011 à 11:49:58

                                                Citation : kevin.cousin

                                                Non, je suis admin


                                                Rappelle toi, tu es sous Windows, les admins sont "Windows" et les virus, ... pas toi :-°

                                                Lorsque tu crées un fichier en écrivant juste "teste.txt", il se trouve au même endroit que l'exécutable.

                                                @lucas-84: En effet c'est une erreur, mais généralement, ça ne change pas grand chose (mais c'est tout de même un erreur, tu as raison ) donc a corrigée.
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles  - ♡ Copying is an act of love.
                                                  2 septembre 2011 à 11:50:34

                                                  Damien a raison.

                                                  Citation : M@teo

                                                  "r+" : lecture et écriture. Vous pourrez lire et écrire dans le fichier. Le fichier doit avoir été créé au préalable.



                                                  Citation : man fopen

                                                  Open for reading and writing. The stream is positioned at the beginning of the file.

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  Staff désormais retraité.
                                                    2 septembre 2011 à 11:50:51

                                                    Citation


                                                    Désoler mais "r+" ne créer pas de fichier, il doit exister. Par contre w, w+ et a créent un fichier.



                                                    Mais OUI !!! Je suis bête, le problème vient de là, attends je test.

                                                    C'était ça, merci à vous tous, le problème est désormais résolu, tout fonctionne correctement !!

                                                    Il faut que je m'imprime ça dans la tête !!!!

                                                    Donc en gros il y avait deux problèmes : j'utilisais scanf (moyen moyen) et je faisais r+.

                                                    Merci encore,

                                                    Cordialement,

                                                    Kevin Cousin

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter

                                                    Kevin Cousin, passionné d'informatique

                                                      2 septembre 2011 à 11:52:34

                                                      Au passage fait attention, "a" se positionne à la fin du fichier pour écrire et "w" en efface le contenu avant d'écrire ;)
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        2 septembre 2011 à 11:53:56

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                        🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles  - ♡ Copying is an act of love.
                                                          2 septembre 2011 à 11:54:07

                                                          Ben la en fait je suis dans un switch et ce case corresponds à "créer un fichier" donc j'ai pas ce problème là pour l'instant.

                                                          Maintenant je passe à l'écriture de fichier (déjà existant) et là je vais être confronté ) ça.

                                                          Encore merci
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter

                                                          Kevin Cousin, passionné d'informatique

                                                            2 septembre 2011 à 11:55:19

                                                            @che, c'est la doc C++ ça... :euh: Ca change rien, mais il y a quelques différences, dans l'inclusion des headers notamment. ^^
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                            Staff désormais retraité.
                                                              2 septembre 2011 à 11:57:45

                                                              Citation

                                                              Rappelle toi, tu es sous Windows, les admins sont "Windows" et les virus, ... pas toi :-°



                                                              Ne t'inquiètes pas, je suis peut-être pas programmeur confirmé, mais les droits ça me connait, je suis administrateur réseau depuis un an en entreprise (en formation).

                                                              Je peut te confirmer que l'erreur ne se trouvait pas au niveau des droits (j'ai vérifié avant ^^).
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Kevin Cousin, passionné d'informatique

                                                              Fonction fgets()

                                                              × 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