Partage
  • Partager sur Facebook
  • Partager sur Twitter

ajouter des données à la fin des lignes d'un fichier

Sujet résolu
    24 juillet 2007 à 16:13:14

    Bonjour,
    je construis le fichier suivant :

    #define index_V         0
    #define index_cajsr
    #define index_camyo
    #define index_cansr
    #define index_cass
    #define index_htrpnCa
    #define index_kin
    #define index_ltrpnCa
    #define index_nain
    #define index_pryr

    et je voudrai savoir comment faire pour ajouter des numéros à la fin de chaque ligne en partant de la 2ième. Finalement ça donnerait ça :

    #define index_V         0
    #define index_cajsr             1
    #define index_camyo             2
    #define index_cansr             3
    #define index_cass              4
    #define index_htrpnCa           5
    #define index_kin               6
    #define index_ltrpnCa           7
    #define index_nain              8
    #define index_pryr              9

    Voici la fonction que j'ai écrite pour rajouter les numéros, mais elle les ajoute après la dernière ligne :

    void Ecriture::ecrire_chif(string fs)
    {
            ifstream fichier_lect(fs.c_str());
            ofstream fichier_ecri(fs.c_str(), std::ios_base::app);
            string s;
            int i = 0;
            int cptr = 0;
           
            while (getline (fichier_lect,s)) i++; // nombre de lignes du fichier
           
            for (cptr=1; cptr<i; cptr++)
            {
                    fichier_ecri.seekp(cptr, std::ios_base::beg);
                    fichier_ecri <<"\t\t"<<cptr<<endl;/* ajoute des tabulations et le numéros de la ligne, mais seulement après la dernière ligne du fichier */
            }
            fichier_ecri.close();
            fichier_lect.close();
    }
     

    J'ai l'impression que la ligne

    fichier_ecri.seekp(cptr, std::ios_base::beg);
     

    ne me place pas au début.
    Voilà, si vous avez une idée, merci d'avance !!
    • Partager sur Facebook
    • Partager sur Twitter
      24 juillet 2007 à 21:45:51

      Il faut nétoyer les bits d'état.
      Mais :
      1- inutile de faire en deux passes
      2- Tu ne pourras pas (facilement) modifier le fichier de départ
      3- Pour ce genre de choses, il existe des outils imbatables (sed, perl, vim)
      • Partager sur Facebook
      • Partager sur Twitter
      C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
        25 juillet 2007 à 0:33:04

        Mais à quoi ça sert de mettre des define dans un fichier puisqu'ils sont "pré-compilés" ?
        J'avoue que je comprends pas le but de ta manoeuvre :s
        • Partager sur Facebook
        • Partager sur Twitter
          25 juillet 2007 à 13:44:30

          C'est projet que je dois réaliser dans un langage bien précis (le C++), ce n'est pas qui l'ai choisi.
          Les "# define XXX chiffre" vont me permettre d'utiliser des chiffres à la place de XXX : je ne vois pas le rapport avec la pré-compilation des fichiers (d'ailleurs si quelqu'un pouvait m'expliquer ce que c'est :p !!).
          Et aussi je voudrai savoir pourquoi l'instruction :

          fichier_ecri.seekp(cptr, std::ios_base::beg);
           

          me place à la dernière ligne, alors qu'au 1er tour cptr == 1.
          • Partager sur Facebook
          • Partager sur Twitter
            25 juillet 2007 à 14:05:53

            C'est peut-être moi qui ne comprend pas ^^

            Les #define sont placés dans un .txt c'est bien ça ? Et bien c'est là que j'ai du mal à voir à quoi ils servent, puisqu'ils sont sensés définir des constantes avant que le programme soit entièrement compilé (le préprocesseur).
            Pour faire simple : à quoi ça te sert de mettre des #define dans un .txt ?
            • Partager sur Facebook
            • Partager sur Twitter
              25 juillet 2007 à 14:59:43

              Salut,

              @ TylerDurden : en fait, on s'en moque que son fichier contiennent des "define" ou d'autres instructions ressemblant à du C. Il s'agit de son fichier de données (celui sur lequel opère son programme) et le but est de modifier ce fichier. :)

              C'est bien ça, setsuko974 ?

              Dans ce cas, le conseil que je te donnerais, c'est de ne pas essayer de modifier "sur place" le fichier, mais plutôt de créer un nouveau fichier. Ça devrait être beaucoup plus simple.

              En gros, tu lis le fichier d'entrée ligne par ligne, et à chaque ligne lue, tu l'écris dans le fichier de sortie, en rajoutant le numéro à la fin (juste avant le saut de ligne) ; et ainsi de suite.
              • Partager sur Facebook
              • Partager sur Twitter
                25 juillet 2007 à 18:00:31

                Oui oui pour son problème, on se fiche de ce qu'il fait, mais j'aurai bien aimé savoir (pour moi) à quoi ça servait de mettre des define dans un fichier externe au programme.
                • Partager sur Facebook
                • Partager sur Twitter
                  25 juillet 2007 à 18:05:43

                  TylerDurden, non c'est dans un .h que j'utilise les #define. C'est vrai que dans mon 1er post je les ai mis dans des balises Autres, je n'aurais pas dû, je merite le fouet lol :p

                  gouttegd, ce n'est pas vraiment mon fichier de données mais c'est juste qu'il faut le modifier. Je vais essayer ta technique, merci.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    25 juillet 2007 à 18:55:18

                    et le .h il est inclu dans ton projet ou c'est un .h bidon qui ne sert qu'à tester l'écriture dans un fichier?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      25 juillet 2007 à 20:01:41

                      oui, il sert, il est inclu dans d'autres fichiers.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        25 juillet 2007 à 20:05:42

                        D'accord, mais ce que tu veux faire est donc impossible puisque lors de la compilation, le pré-processeur va interpréter tes #define. En gros, ce que tu veux faire nécessite l'exécution du programme, mais pour être exécuté il faut le compiler, et après ça tes define ne peuvent plus être modifiés.
                        A moins que j'ai encore loupé un truc xD
                        • Partager sur Facebook
                        • Partager sur Twitter
                          25 juillet 2007 à 20:23:51

                          C'est bon, j'y suis arrivée avec l'aide d'un autre forum. cliquez ici pour ceux que ça intéresse.
                          Merci à tous !! :D
                          • Partager sur Facebook
                          • Partager sur Twitter
                            26 juillet 2007 à 8:59:21

                            Citation : TylerDurden

                            D'accord, mais ce que tu veux faire est donc impossible puisque lors de la compilation, le pré-processeur va interpréter tes #define. En gros, ce que tu veux faire nécessite l'exécution du programme, mais pour être exécuté il faut le compiler, et après ça tes define ne peuvent plus être modifiés.
                            A moins que j'ai encore loupé un truc xD



                            Non c'est un peu comme ça que procèdent tous les EDI (Environnement de Développement Intégré) WYSWYG (What You See Is What You Get) et tous les générateurs de code, il génèrent des fichiers sources qui sont ensuite compilés. Le programme qui crée ou renseigne le fichier, n'est pas celui qui l'utilise ;)
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
                              26 juillet 2007 à 17:31:23

                              Pour infos:
                              En C ou C++ le précompilateur se charge de supprimer (en temporaire) les commentaires et d'utiliser toute les clause qui commence par "#"...

                              Donc c'est le précompilateur qui va remplacer les mot-clés défini avec un #define par la valeur associée.

                              Ainsi lors que le compilateur tourne il ne se souci pas des commentaires et les fichiers sont prêt.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                26 juillet 2007 à 22:54:13

                                ??
                                J'ai l'impression qu'il y a deux choses:
                                - son problème exprimé : il veut modifier un fichier par programmation C++ -- peu importe qu'il y ait des #define ou des #toto dedans.

                                - le fait que vous avez interprété qu'il utilisera dans son programme le fichier qu'il cherche à modifier.


                                Dans le premier cas, le C++ n'est pas le langage le plus adapté, mais c'est ce que son prof lui demande.

                                Dans le second cas, là effectivement il s'y prend très mal. D'un cela ne marchera pas, de deux un simple enum ferait bien mieux l'affaire.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                                  27 juillet 2007 à 11:05:26

                                  lmghs, je suis une fille, le pronom personnel "elle" serait mieux adapté.
                                  Sinon, moi je vois pas pourquoi enum serait mieux que define.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    27 juillet 2007 à 18:21:50

                                    Enum... peut-être même struct ou classe dans le 2e cas énoncé par Imghs : Si tu penses modifier les #define de ton programme durant son exécution. Ce n'est pas possible... Si c'est le .h d'un autre programme alors il n'y a pas de problèmes.

                                    Par contre, je préfère personnellement les constantes et les enum parce qu'il peuvent être définis dans un espace de nom, dans une classe ou struct et ainsi plus de problèmes de résolution de nom!

                                    Ex : classe PanierALinge et classe PanierAFruit. Disons que le PanierALinge peux contenir 20 objets et que le PanierAFruit peut en contenir 9. Les deux peuvent déclarer une constantes interne MAX. sinon avec des defines on devrait faire un MAX_LINGES et MAX_FRUITS...

                                    Disons maintenant que tu importe une autre classe dans une bibliothèque que tu n'as pas développée qui elle est un SacDEpicerie qui contient 12 fruits et qui fait un define MAX_FRUITS 12... Alors tu te retrouve avec 2 define du meme nom est-ce que le compilteur plante? pas nécessairement... soit tu te retrouve avec des classes non fonctionelles ou que le compilateur ne compile pas.

                                    Ici la solution simple est de modifier le nom de ta constantes mais dans un projet plus gros il se peut que 2 bibliothèques définissent la meme constante alors impossible de compiler et sa amène beaucoup de complication pour les faires modifiées (SI elle sont modifiables, peut-être que l'entreprise a fait faillite et que ce n'est plus supporté)

                                    Voilà pourquoi on propose plutot des constantes englobable dans d'autres structures.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      28 juillet 2007 à 18:18:12

                                      Accessoirement, un #define n'a aucune existence pour le compilateur vu que le pré-compilateur l'a déjà remplacé avant de démarrer la compilation. Du coup, ce n'est pas débuggable.

                                      Mais ce que je voulais dire est tout autre:
                                      enum Index {
                                          index_V = 0, // en fait implicite
                                          index_cajsr, index_camyo, index_cansr, index_cass,
                                          index_htrpnCa, index_kin, index_ltrpnCa, index_nain, index_pryr
                                      };

                                      Et là pas besoin d'incrémenter les valeurs, c'est automatiquement incrémenté de 1 à chaque fois.
                                      Donc retour à la vrai question. Le but final est-il de modifier des fichiers ou d'avoir des constantes facilement maintenues/générées ?

                                      Et pour rebondir sur la remarque de MatteX, on peut même écrire:
                                      struct Index {
                                          enum type {
                                              V, cajsr, camyo, cansr, cass,
                                              htrpnCa, kin, ltrpnCa, nain, pryr,
                                              LAST_VALUE
                                          };
                                          static std::string toString(type v); // convertion -> chaine à écrire
                                          static type toEnum(std::string const& s); // convertion -> enum à écrire
                                      };

                                      Qui s'utiliserait de la sorte:
                                      Index::type monEnum = Index::V;


                                      PS: Désolé pour le pseudo, je n'avais pas fait attention au -ko.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.

                                      ajouter des données à la fin des lignes d'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