Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C] ajouter une ligne dans un fichier

probleme avec des espaces

Sujet résolu
    17 avril 2006 à 12:07:21

    Bonjour, je voudrais ajouter une ligne à la fin d'un fichier.
    Je demande à l'utilisateur ce qu'il veut insérer à la fin du fichier et je l'ajoute!
    Mais la , la chaine est coupé au premier espace !
    Auriez vous un solution ?
    • Partager sur Facebook
    • Partager sur Twitter
      17 avril 2006 à 12:15:05

      Citation : NarTy

      Je demande à l'utilisateur ce qu'il veut insérer à la fin du fichier et je l'ajoute!
      Mais la , la chaine est coupé au premier espace !


      Utiliser la bonne fonction de saisie de ligne qui est fgets().

      http://mapage.noos.fr/emdel/notes.htm#saisie
      http://mapage.noos.fr/emdel/notes.htm#fichiers
      • Partager sur Facebook
      • Partager sur Twitter
      Music only !
        17 avril 2006 à 13:48:20

        Je comprends pas grand chose à tes notes !
        • Partager sur Facebook
        • Partager sur Twitter
          17 avril 2006 à 14:18:17

          Citation : NarTy

          Je comprends pas grand chose à tes notes !


          Quoi par exemple ? Soit précis, sinon, on ne peut pas avancer.
          • Partager sur Facebook
          • Partager sur Twitter
          Music only !
            17 avril 2006 à 14:21:41

            Comment te dire, je n'arrive pas à utiliser , ni fgets(); ; ni gets(); !
            Même si tu n'approuves pas l'utilisation de gets , je voudrais quand même, savoir l'utiliser !
            • Partager sur Facebook
            • Partager sur Twitter
              17 avril 2006 à 14:22:10

              Au lieu de scanf, utilise fgets. Si tu veux qu'il fasse office defonction de saisie utilise l'entrée standard, c'est à dire stdin.

              fgets(ligne, sizeof ligne, stdin);
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                17 avril 2006 à 14:26:37

                Vas chercher tout seul au lieu de nous demander tout pour ton éditeur de texte :p
                • Partager sur Facebook
                • Partager sur Twitter
                  17 avril 2006 à 14:31:44

                  Bah je pensais que le but du DEFI etait de progressé !
                  Donc , que je cherche ici ou ailleurs ca reviens au même !
                  Mais bon @+ !
                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 avril 2006 à 14:44:33

                    Citation : NarTy

                    Comment te dire, je n'arrive pas à utiliser , ni fgets(); ; ni gets(); !
                    Même si tu n'approuves pas l'utilisation de gets , je voudrais quand même, savoir l'utiliser !


                    As-tu regardé la doc de ces fonctions ? Montre le code qui ne fonctionne pas. Quand à gets(), laisse tomber, c'est un bug. Dans l'industrie, c'est "Usage interdit dans les nouveaux développements".
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Music only !
                      17 avril 2006 à 16:26:24

                      ben , voila le bout de code :
                         FILE* fichier = fopen("test.txt","a");
                         char chaine[100];
                         printf("Que voulez vous ecrire ?");
                         fgets(chaine,sizeof chaine,stdin);

                      C'est bien comme ca qu'il faut l'utiliser ? non ?
                      Si oui , ce petit bout de code ne me laisse pas le temps d'écrire quoi que ce soit !
                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 avril 2006 à 16:36:29

                        Citation : NarTy

                        ben , voila le bout de code :
                        C'est bien comme ca qu'il faut l'utiliser ? non ?


                        Oui, mais,
                        Je ne vais pas le répéter à chaque fois. Un 'bout de code', ça n'a aucun sens. Poste le code COMPLET. On ne sais pas ce que tu as fais ou pas avant, ce que tu as oublié...
                        </span>
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Music only !
                          17 avril 2006 à 18:27:50

                          bah , je vais pas te donner tout le code ! Je te passe quand même la fonction !
                          void FICHIER_addLigne(const char* nom,int ligne)
                          {
                             FILE* fichier = fopen(nom,"a");
                             char chaine[100];
                             printf("Que voulez vous ecrire ?");
                             fgets(chaine,sizeof chaine,stdin);
                          }

                          Et voici le code ou je l'appelle :
                          FICHIER_addLigne("test.txt",nbrLigne);

                          et la tu te dit , d'ou vient la variable nbrLigne ?
                          et je te réponds , de la :
                          long nbrLigne = FICHIER_compteLigne("test.txt");

                          et voila la fonction qui va avec :
                          long FICHIER_compteLigne(const char* nom)
                          {
                             int exist = AUTRE_fileExist(nom);
                             long nbr = 0;
                             if(exist == 1)
                             {
                                printf("Ce fichier n'existe pas\n");
                             }
                             else if(exist == 0)
                             {
                                FILE* fichier = fopen(nom,"r");
                                char *chaine = NULL,caractereLu;
                                do
                                {
                                    caractereLu = fgetc(fichier);
                                    if (caractereLu == '\n')
                                        nbr++;
                                } while(caractereLu != EOF);
                             }
                             return nbr+1;
                          }

                          Voila, je pense t'avoir donné tout ce dont tu as besoin !
                          • Partager sur Facebook
                          • Partager sur Twitter
                            17 avril 2006 à 18:44:39

                            Citation : NarTy

                            bah , je vais pas te donner tout le code ! Je te passe quand même la fonction !

                            Voila, je pense t'avoir donné tout ce dont tu as besoin !


                            Manque AUTRE_fileExist()
                            Cette manip s'appelle
                            "poster un code compilable complet mais réduit au minimum montrant le défaut".

                            C'est à toi de réduire et de tester ce code (tu crées un autre projet, copié collé etc.). Cette méthode n'existe pas par hasard ou pour embéter les posteurs de forums.

                            Elle est universallement reconnue comme étant une des méthodes de mise au point les plus efficaces qui soit. Elle est basée sur deux principes bien connus : "Diviser pour regner" et le principe de certitude, qui, tranposé en informatique, veut qu'on s'appuie sur des procédures qualifiées (validées). Tant que la base et que les briques sont fragiles, inutile de construire.

                            Et toujours ta logique inversée :

                               if(exist == 1)
                               {
                                  printf("Ce fichier n'existe pas\n");
                               }

                            Pour écrire ça, il faut quand même avoir l'esprit sacrément tordu, non ?

                            Tu arrives à lire un code comme ça ? Sans compter que je t'ai déjà signalé ce problème dans un autre fil. Si tu n'en tiens pas compte, est-ce bien la peine que je passe du temps à te répondre et à répéter les mêmes choses ?

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Music only !
                              17 avril 2006 à 18:54:07

                              int AUTRE_fileExist(const char* nom)
                              {
                                 FILE* fichier = NULL;
                                 fichier = fopen(nom,"r");// on essaie de lire le fichier
                                 if(fichier == NULL)
                                 {
                                    // si on y arrive pas , on retourne 1 pour dire false
                                    return 1;
                                 }
                                 else
                                 {
                                    // si on y arrive , on ferme le fichier et on retourne 0 pour true
                                              fclose(fichier);
                                    return 0;
                                 }
                              }
                              • Partager sur Facebook
                              • Partager sur Twitter
                                17 avril 2006 à 19:14:08

                                Tu as un sacré problème avec les booléens :-°

                                1 et autre = VRAI (true)
                                0 = FAUX (false)

                                Je te conseille d'ailleurs de créer des defines ou de faire un enum (anonyme ou non) :

                                #define VRAI 1
                                #define FAUX 0


                                enum {false, true};
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  17 avril 2006 à 19:22:09

                                  ah je pensais le contraire , bref ! ALORS ?
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    17 avril 2006 à 19:37:02

                                    Citation : NarTy

                                    <code type="c">int AUTRE_fileExist(const char* nom)


                                    OK. Comme je m'y attendais, le code fonctionne, et l'usage de fgets() est correct (bien qu'améliorable).

                                    Maintenant, si quand il est intégré dans ton application ce code ne marque pas d'arrêt sur le fgets(), ce n'est pas à cause ce ce code là, puisqu'il fonctionne, mais probablement à cause du fait qu'il reste un '\n' dans stdin suite à un mauvais usage de scanf() précédemment. La présence du '\n' fait croire à fgets() qu'on a déjà tapé sur <enter>... Donc, il ne s'arrête pas...

                                    C'est pour ça que je voulais tout le code... passons...

                                    Pour résoudre ce problème, il faut que chaque fonction de saisie laisse stdin parfaitement nettoyé après usage. Pour faire ça, j'ai déjà indiqué 3000 fois comment faire des entrées correctes exclusivement à base de fgets(). Mais comme j'ai l'impression de précher dans le désert, je ne sais plus quoi dire de plus...
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Music only !
                                      17 avril 2006 à 20:03:02

                                      faut pas faire fflush ?
                                      Et comment on fait pour savoir si le stdin a conservé un '\n' ?
                                      Plus généralement, comment on fait pour savoir ce que contient stdin ?
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        17 avril 2006 à 21:57:31

                                        Citation : NarTy

                                        faut pas faire fflush ?


                                        Non. N'a d'effet de manière standard que sur les flux sortants... (il existe des extensions, mais ce n'est pas portable)

                                        Citation : NarTy


                                        Et comment on fait pour savoir si le stdin a conservé un '\n' ?
                                        Plus généralement, comment on fait pour savoir ce que contient stdin ?


                                        Après une lecture avec fgets(), on teste la ligne. Si on trouve un '\n', c'est que la ligne a été lue entièrement (on en profite pour éliminer le '\n' qui est souvent plus génant qu'autre chose). Si il n'y est pas, c'est qu'il traine toujours dans le flux entrant. Il faut donc purger ce flux en lisant les caractères restants jusqu'à tomber sur ce '\n' ou un indicateur de fin de lecture.

                                        J'ai publié ce code 3000 fois :

                                        #include <stdio.h>
                                        #include <string.h>

                                        static void clean (char *s, FILE *fp)
                                        {
                                           /* search ... */
                                           char *p = strchr (s, '\n');
                                           if (p != NULL)
                                           {
                                              /* ... and kill */
                                              *p = 0;
                                           }
                                           else
                                           {
                                              /* purge */
                                              int c;
                                              while ((c = fgetc(fp)) != '\n' && c != EOF)
                                              {
                                              }
                                           }
                                        }

                                        Cette fonction s'utilise comme ceci :

                                           fgets (line, sizeof line, fp);
                                           clean (line, fp);

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Music only !
                                          17 avril 2006 à 23:06:35

                                          Merci !! En gros si je comprends bien, tu voudrais que l'on utilise TOUJOURS fgets au lieu de scanf !
                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          [C] ajouter une ligne dans un fichier

                                          × 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