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

Langage C++ Discussion :

paramètre string pour un constructeur


Sujet :

Langage C++

  1. #1
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 391
    Billets dans le blog
    16
    Par défaut paramètre string pour un constructeur
    bonjour,

    pourquoi, dans le débogueur gnu, j'ai nomFichier en chaine vide?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #ifndef SCANNEUR_HPP
    #define SCANNEUR_HPP
    #include <fstream>
    #include <string>
     
    constexpr int taille=6,demiTampon=taille/2-1,sentinelle1=demiTampon,sentinelle2=taille-1;
     
    class scanneur{
    public:
       scanneur(std::string nomFichier);
      ... code ....
    #endif
    scanneur.cpp:
    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
    22
    23
    24
    #include <iostream>
    #include <fstream>
    #include <string>
    #include "scanneur.hpp"
     
     
    scanneur::scanneur(std::string nomFichier):posDemi(0),derniers(0),enAvant(0),debutLex(0){
       fichier.open(nomFichier.c_str(),std::ifstream::binary);
       if(!fichier){
          std::cerr<<"impossible d'ouvrir le fichier"<<std::endl;
          exit(1);
       }
       tampon[sentinelle1]=tampon[sentinelle2]=EOF;
       charger1();
    }
     
    void scanneur::charger1(){
       fichier.read(tampon,demiTampon);
       if( (derniers=fichier.gcount()) < demiTampon)
          tampon[derniers]=EOF;
       posDemi++;
    }
     
    ... some code...


    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <string>
    #include <iostream>
    #include "scanneur.hpp"
     
     
    int main(){
       scanneur scan("test.txt");
    ...some code...
    }
    quelqu'un a une idée?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 145
    Billets dans le blog
    4
    Par défaut
    Salut,

    Comment as-tu testé/remarqué ceci ?
    A part avec un build release où les variables seront optimisées, auquel cas c'est juste que le debugger ne sait pas afficher la valeur mais elle existe et est correcte, tu ne devrais pas avoir de problème à exécuter ce code et donc à ouvrir le fichier.
    Au passage, tu devrais transmettre de tels paramètres par référence constante const&
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 391
    Billets dans le blog
    16
    Par défaut
    j'utilise le gnu deboguer. Le programme est compilé pour que ce debogueur puisse lire le code source
    le programme ne fonctiionne pas avec ou sans le débogueur.


    avec l'exempe ci-dessous ça marche très bien.
    pourquoi le code du premier post ne fonctionne-t-il pas?
    objet.hpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #ifndef OBJET_HPP
    #define OBJET_HPP
    #include <string>
     
    class objet{
    public:
       objet(std::string const& param);
       void affiche();
    private:
       std::string x;
    };
    #endif
    objet.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <string>
    #include <iostream>
    #include "objet.hpp"
    objet::objet(std::string const& k){
       x=k;
    }
     
    void objet::affiche(){
       std::cout<<x<<std::endl;
    }
    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include "objet.hpp"
     
    int main(){
       objet ob("bonjour");
       ob.affiche();
    }
    quelqu'un a une idée?

    voici le code complet:

    test.txt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    12345678901234567890123
    scanneur.hpp
    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
    22
    23
    24
    25
    26
    #ifndef SCANNEUR_HPP
    #define SCANNEUR_HPP
    #include <fstream>
    #include <string>
     
    constexpr int taille=6,demiTampon=taille/2-1,sentinelle1=demiTampon,sentinelle2=taille-1;
     
    class scanneur{
    public:
       scanneur(std::string const& nomFichier);
       void charger1();
       void charger2();
       void chargerArrierre1();
       void chargerArrierre2();
       char carSuiv();
       void reculer(int i);
    private:
       char c;
       char tampon[taille];
       int posDemi;
       int derniers;
       int enAvant;
       int debutLex;
       std::ifstream fichier/*("test.txt",std::ifstream::binary)*/;
    };
    #endif
    scanneur.cpp
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    #include <iostream>
    #include <fstream>
    #include <string>
    #include "scanneur.hpp"
     
     
    scanneur::scanneur(std::string const& nomFichier):posDemi(0),derniers(0),enAvant(0),debutLex(0){
       fichier.open(nomFichier.c_str(),std::ifstream::binary);
       if(!fichier){
          std::cerr<<"impossible d'ouvrir le fichier"<<std::endl;
          exit(1);
       }
       tampon[sentinelle1]=tampon[sentinelle2]=EOF;
       charger1();
    }
     
    void scanneur::charger1(){
       fichier.read(tampon,demiTampon);
       if( (derniers=fichier.gcount()) < demiTampon)
          tampon[derniers]=EOF;
       posDemi++;
    }
     
    void scanneur::chargerArrierre1(){
       fichier.seekg(-(derniers+demiTampon),fichier.cur);
       posDemi--;
       fichier.read(tampon,demiTampon);
       derniers=fichier.gcount();
    }
     
     
    void scanneur::charger2(){
       fichier.read(tampon,demiTampon);
       if( (derniers=fichier.gcount()) < demiTampon)
          tampon[derniers]=EOF;
       posDemi++;
    }
     
    void scanneur::chargerArrierre2(){
       if(posDemi>0){
          fichier.seekg(-(derniers+demiTampon),fichier.cur);
          posDemi--;
       }
       else
          fichier.seekg(0,fichier.beg);
       fichier.read(tampon,demiTampon);
       derniers=fichier.gcount();
    }
     
    char scanneur::carSuiv(){
       c=tampon[enAvant++];
       if(c==EOF){
          if(enAvant==sentinelle1+1){
             charger2();
             c=tampon[enAvant++];
          }
          else if(enAvant==sentinelle2+1){
             charger1();
             enAvant=1;
             c=tampon[0];
          }
       }
       return c;
    }
    main.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <string>
    #include <iostream>
    #include "scanneur.hpp"
     
     
     
    int main(){
       scanneur scan("test.txt");
       char car('\0');
       while(car!=EOF)
          std::cout<<scan.carSuiv();
       std::cout<<std::endl;
    }
    quelqu'un a une idée?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 145
    Billets dans le blog
    4
    Par défaut
    Qu'est-ce qui ne marche pas ?
    L'ouverture du fichier ? Est-il au bon endroit et accessible ? As-tu le droit de faire une telle opération ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 391
    Billets dans le blog
    16
    Par défaut
    je vois ce qui ne marchait pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main(){
       scanneur scan("test.txt");
       char car('\0');
       while(car!=EOF)
          std::cout<<scan.carSuiv();
       std::cout<<std::endl;
    }
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main(){
       scanneur scan("test.txt");
       char car('\0');
       while(car!=EOF){
          car=scan.carSuiv(); 
          std::cout<<car;
       }
       std::cout<<std::endl;
    }
    ça ne marche pas encore tout à fait mais je crois que je vais pouvoir y arriver tout seul.
    merci pour tes posts

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/10/2008, 16h41
  2. Réponses: 5
    Dernier message: 18/11/2004, 17h19
  3. Paramètres personnalisés pour l'installation windows XP
    Par SkyDev dans le forum Windows XP
    Réponses: 5
    Dernier message: 04/11/2004, 12h13
  4. [DOM] parser une String pour en faire un document XML
    Par Fladnag dans le forum Format d'échange (XML, JSON...)
    Réponses: 9
    Dernier message: 29/03/2004, 11h04
  5. [Debutant]Formater un string pour une url
    Par maxxou dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 22/03/2004, 16h17

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