IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

amelioration de code


Sujet :

C++

  1. #1
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut amelioration de code
    bonjour voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <iostream.h>
    #include <stdio.h>
    #include <fstream>
    using namespace std;
    int main ()
    {
      FILE * pFile;
      pFile = fopen ("new.c","w");
      ifstream fichier( "log_normal_sigma0.2" );
      string  ligne;
    {while ( getline( fichier, ligne ) ){
    if (ligne[0]==1){{fprintf (pFile,"%c\n",ligne[0]);}
    }}}}
    merci de m'aider.
    ps: si on enleve la condition if, ca marche, mais ca ecrit toutes les valeurs.


    Ce programme est censé ecrire dans le fichier new la premiere valeur de chaque ligne du fichier log_normal_sigma0.2, uniquement si la valeur est égale à 1.
    Je ne vois pas pq ca ne fonctionne pas.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu veux comparer au caractère '1', pas à celui ayant 1 comme code ASCII (enfin je suppose). Essaye ça :

    De plus ce mélange C/C++ est plutôt bizarre, surtout sur une même fonctionnalité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include <fstream>
    #include <iostream>
    #include <string>
     
    using namespace std;
     
    int main ()
    {
        ofstream fichier_out("new.c");
        ifstream fichier_in("log_normal_sigma0.2");
     
        string ligne;
        while (getline(fichier_in, ligne))
        {
            if (ligne[0] == '1')
               fichier_out << ligne[0] << endl;
        }
     
        return EXIT_SUCCESS;
    }
    PS : tu aurais effectué une exécution pas à pas, ou simplement écrit les valeurs de ligne dans un fichier, tu aurais tout de suite compris pourquoi ça ne marchait pas

  3. #3
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    merci pour toutes ces réponses.

    1)j'ai du mal a faire la différence entre C++,C. Si tu l'as ecrit en C, merci de le convertir en C++.

    2)PS : tu aurais effectué une exécution pas à pas, ou simplement écrit les valeurs de ligne dans un fichier, tu aurais tout de suite compris pourquoi ça ne marchait pas

    J'utilise code::blocks. Je ne sais pas faire de marche pas à pas. Alors merci de me l'indiquer, si tu le sais.

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    1)j'ai du mal a faire la différence entre C++,C. Si tu l'as ecrit en C, merci de le convertir en C++.
    Regarde l'intitulé du forum
    FILE*, fopen, fprintf ... C
    ifstream, ofstream, >>, <<, ... C++

    J'utilise code::blocks. Je ne sais pas faire de marche pas à pas. Alors merci de me l'indiquer, si tu le sais.
    Je n'utilise pas Code::Blocks, mais ça doit se trouver dans le menu de debogage.
    C'est aussi pour ça que je t'ai indiqué une autre solution : afficher la valeur de ligne[0] pour voir que ce n'était pas 1.

  5. #5
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    re-merci et re-bonjour

    voici une nouvelle version du code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <fstream>
    #include <iostream>
    #include <string>
     
    using namespace std;
     
    int main ()
    {
        ifstream file_in("new.c");
        ifstream fichier_in("log_normal_sigma0.2");
        ofstream fichier_out("new.c");
        string ligne,ligne2;
        while (getline(fichier_in, ligne))
        {
          while(getline(file_in,ligne2))
            if (ligne[0] != ligne2[0])
               fichier_out << ligne[0] << endl;
        }
     
        return EXIT_SUCCESS;
    }

    alors, par rapport au premier, celui -ci ne recopie la valeur du fichier log_normal_sigma0.2 dans le fichier new uniquement si celle-ci n'a pas deja ét é ecrite dans le fichier new. Bien sur, ca ne fonctionne pas.
    Est-ce un problème d'initialisation ?

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Le problème est que tu manipules ton fichier new.c avec deux flux différents, un en lecture et un en écriture. Tu devrais faire ton traitement en 2 passes.

    Et pense à utiliser les balises CODE.

  7. #7
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    Tu devrais faire ton traitement en 2 passes.??
    C'est a dire?
    ca donnerai quoi au niveau du code?

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    D'abord tu lis, tu stockes ça de manière triée dans un conteneur (par exemple std::set) pour pouvoir avoir une recherche logarithmique, et après tu écris.
    Tu peux aussi utiliser std::tr1::unordered_set pour avoir une recherche en temps constant.

    À part ça ta comparaison sur le premier caractère me semble incorrecte. C'est pas des nombres que tu veux comparer ?
    Boost ftw

  9. #9
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    ok, merci, j'essayerai.
    Autre chose:
    quand on ecrit par ex: while (getline(fichier_in, ligne)) quelle est en réalité la condition qui n'est pas mentionnée ?
    est-ce: while (getline(fichier_in, ligne)!='0')?
    est-ce while (getline(fichier_in, ligne)!=EOF)?
    .........

    ??
    merci

  10. #10
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Aucun des deux.
    C'est beaucoup plus compliqué que ça.

    Si ça t'intéresse prends un bouquin sur les iostreams.
    Boost ftw

  11. #11
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    ok
    la c'est un programme qui est cencé renvoyer la n ieme ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     int prog(int m ) {
     int i;
         ifstream file("new.c");
         string line;
       for(i=1;30;i++){
        if (i==m)
        {
        getline(file,line);
        cout<<line;
        }}}
     
    int main(){
      prog(5);}
    forcément, ca fonctionne pas. Le problème est que j'aimerais trouver un moyen qui permette d'incrémenter les lignes du fichier.

  12. #12
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    en fait, j'y suis arrivé autrement.

    Alors si vous connaissez une fonction qui permette de récupérer la n ieme ligne automatiquement, sans avoir de faire de boucle while, je suis preneur.
    voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int prog(int m ) {
     int i=0;
         ifstream file("new.c");
         string line;
       while(getline(file,line)){
        if (i==m)
        {
        cout<<line;
        }
        i++;}}
     
    int main(){
      prog(2);}

  13. #13
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par deubelte
    Alors si vous connaissez une fonction qui permette de récupérer la n ieme ligne automatiquement, sans avoir de faire de boucle while, je suis preneur.
    C'est possible avec une boucle for correcte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    int prog (int m)
    {
      ifstream file ("new.c");
      string line;
     
      for (int i=0; i < m-1; i++)
      {
        getline(file,line);
      }
      getline(file,line);
      cout<<line;
    }
     
    int main ()
    {
      prog (5);
      return 0;
    }
    La fonction est incomplète : il faut vérifier que le fichier est bien ouvert, qu'il comporte au moins le nombre de ligne souhaité, le pas oublier de le fermer et empêcher la saisie d'un nombre négatif.

  14. #14
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    ok, merci, je cherchais justement une boucle for.

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tout ça est expliqué dans la FAQ, pense à y jeter un oeil ça pourra t'aider.

  16. #16
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut F1111111111111111111
    Suivant les conseils du forum, j'utilise ici std::set. Voici ce que je veux faire:
    je veux ranger dans un ensemble set, (nommé "ens"), deux entiers, 3 et le premier charactère d'une ligne d'un fichier nommé log_normal_sigma0.1 , qui correspond a l'entier 8.
    Lorsque je fais cout<<*ens.find(3), ca marche puisqu'il renvoie 3, mais lorsque je fais cout<<*ens.find(8), il renvoie 2 (qui est le cardinal de "ens") au lieu de renvoyer 8. Pourquoi???
    merciii

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    #include <algorithm> // definition of find()
    #include <set>
    #include <iostream>
    #include <fstream>
    #include <iostream>
    #include <string>
    using namespace std;
    int main(){
        set<string>ens;
        ofstream fichier_out("new.c");
        ifstream fichier_in("log_normal_sigma0.2");
        int m,i,p,n=1;
        string line;
      ens.insert(3);
      (getline(fichier_in,line));
              {ens.insert(line[0]);
     
      }
     cout<<*ens.find(3);

  17. #17
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Moi ça aurait plutôt été le contenu du fichier new.c que j'aurais mis dans dans ton conteneur...

    Lorsque je fais cout<<*ens.find(3), ca marche puisqu'il renvoie 3, mais lorsque je fais cout<<*ens.find(8), il renvoie 2 (qui est le cardinal de "ens") au lieu de renvoyer 8. Pourquoi???
    Il faut d'abord comparer à ens.end() pour savoir s'il s'agit d'une valeur valide.
    Sinon un autre problème c'est que tu as un conteneur de string et que tu y cherches des entiers...
    Et tu y mets soit des entiers soit des chars... C'est tout bonnement n'importe quoi.
    Je te l'ai déjà dit, ce n'est pas avec line[0] que tu récupèreras l'entier écrit sur ta ligne. Tu ne récupères que le premier octet de cette ligne, code ASCII du premier caractère.
    Boost ftw

  18. #18
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    j'ai fait autrement. je doute que ca en interesse bcp, mais voici le code. Si vous trouvez un moyen pour l'améliorer, je l'accepte.
    n'ai-je pas trop mélangé de C et de C++ ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    int main(){
        set<int>ens;
        ofstream fichier_out("new.c");
        ifstream fichier_in("log_normal_sigma0.2");
        int m,i ,n=1,ent;
         char XXX[256];
        while( fichier_in.getline(XXX,sizeof(XXX))){
              i=atoi(XXX);
              //cout<<i;
              ens.insert(i);
              }
    set<int>::iterator p;
    for( p = ens.begin(); p != ens.end(); p++ ){
     cout << * p;}

  19. #19
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include <fstream>
    #include <set>
     
    int main()
    {
        std::set<int> ens;
        int i;
     
        std::ifstream tmp("new.c");
        while(tmp >> i)
            ens.insert(i);
     
        std::ifstream fichier_in("log_normal_sigma0.2");
        std::ofstream fichier_out("new.c", std::ios::app);
        while(fichier_in >> i)
            if(ens.find(i) == ens.end())
                fichier_out << i << std::endl;
    }
    Boost ftw

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. amelioration de code par un alias
    Par bosk1000 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/08/2009, 09h09
  2. amelioration de code pour eviter select
    Par bosk1000 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 12/07/2009, 20h26
  3. comment ameliorer ce code?
    Par chrisl0 dans le forum Langage
    Réponses: 1
    Dernier message: 26/02/2009, 02h29
  4. [VBA-E] Amelioration dun code
    Par Elstak dans le forum Macros et VBA Excel
    Réponses: 28
    Dernier message: 06/06/2007, 13h51
  5. amelioration de code
    Par deubelte dans le forum C++
    Réponses: 17
    Dernier message: 21/01/2007, 21h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo