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 :

[(cast)] convertir un char en int...


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 21
    Points : 20
    Points
    20
    Par défaut [(cast)] convertir un char en int...
    Bonjours, je tente de lire dans un fichier une valeur numerique.
    le probleme , est que la fonction getline ne me permet pas de recupérer une valeur directement numérique.

    jutilise une donnée de type char que je converti ensuite en int
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char uneLettre;
    int unNumero;
     
    unNumero = (int)uneLettre;
    le probleme est que jobtien le code ASCII du numero (4=52) :S

    comment puis-je faire pour convertir un code ASCII en chiffre numerique.

    ou tout autre forme de convertion/moyen me permettant dobtenir ma valeur numerique .

    merci.[/code]

  2. #2
    b4u
    b4u est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    La notation entre quotes est une convention pour désigner le code ascii d'un caractère. Par exemple, avec
    tu définis un octet en mémoire qui contiendra le code ascii du caractère '0', c'est à dire 48 en décimal.
    Ensuite dans la table ascii, il se trouve que les caractères de '0' jusqu'à '9' se suivent immédiatement. Donc ta conversion revient à calculer l'écart entre le caractère à convertir et le caractère '0'. Tu dois donc écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int unNumero = c - '0';
    (bien sur, cette opération n'est cohérente que si c contient un caractère compris entre '0' et '9' inclus)
    Si tu veux effectuer des conversions plus complexes, à partir de chaines de caractères par exemple, regarde dans la faq.

  3. #3
    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
    On peut voir comment tu extrais tes données ? Normalement un simple >> devrait suffire pour extraire un entier.

    Ensuite dans la table ascii, il se trouve que les caractères de '0' jusqu'à '9' se suivent immédiatement
    Oui, mais ce n'est pas le cas de toutes les tables.

  4. #4
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Loulou24
    Oui, mais ce n'est pas le cas de toutes les tables.
    - c'est une contrainte imposee par le C et le C++
    - le seul coded charset que je connaisse ou ce n'etait pas le cas n'a ete utilise que sur un ordinateur vendu a une vingtaine d'exemplaire au debut des annees 60 (IBM Stretch, si vous en connaissez un autre, ca m'interesse).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  5. #5
    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
    c'est une contrainte imposee par le C et le C++
    De quelle contrainte parles-tu ? Le fait que la plage '0' - '9' soit contigüe ?

    le seul coded charset que je connaisse ou ce n'etait pas le cas n'a ete utilise que sur un ordinateur vendu a une vingtaine d'exemplaire au debut des annees 60 (IBM Stretch, si vous en connaissez un autre, ca m'interesse)
    Oui, on en avait parlé il y a pas si longtemps. Je sais que ma remarque est anecdotique, c'était juste pour la petite histoire.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 21
    Points : 20
    Points
    20
    Par défaut
    (bien sur, cette opération n'est cohérente que si c contient un caractère compris entre '0' et '9' inclus)
    Si tu veux effectuer des conversions plus complexes, à partir de chaines de caractères par exemple, regarde dans la faq.
    J'ai plein de chiffre plus haut que 9 ... ( je me complique toujours la vie)

    On peut voir comment tu extrais tes données ? Normalement un simple >> devrait suffire pour extraire un entier.
    biensur,
    jutilise la fonction Getline
    dans mon fichier .ini (c'est pas vraiment un .ini en fait....) on peut lire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    [Prop]=Prop
    [Resto]=Resto
    [Section]=4
    [S#1.Table]=14
    [S#2.Table]=13
    [S#3.Table]=3
    [S#4.Table]=6
    [Total]=6
    dans mon fichier .cpp on peut lire:

    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
     
    ifstream Config("Hote.ini");
     
    string ligne,info; // variable contenant chaque ligne lue
                    // cette boucle s'arrête dès qu'une erreur de lecture survient
            		while ( getline( Config, ligne, '=' ) )
            		{
                	 	  // afficher la ligne à l'écran
                	 	  getline(Config, info);            //enregiste la valeur apres '='
                		  cout << ligne << endl;
                		  cout <<"Info:"<<info<<endl;
     
    					   string str = info;
        				   // créer le buffer pour copier la chaîne
        				   size_t size = info.size() + 1;
        				   char * buffer = new char[ size ];
        				   // copier la chaîne
        				   strncpy( buffer, info.c_str(), size );
     
           		          if(ligne == "[Prop]") {strcpy(resto.Prop,buffer);}  //stocke le nom du prop dans resto.Prop
     
    ....
    pour les info avec du texte sa fonctionne mais si je veut lire les chiffres je fonctionne de cette maniere:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	int infoTable;
    	while ( getline( Config, ligne, '=' ) )
            		{
                	 	  // afficher la ligne à l'écran
                	 	  getline(Config, infoTable);   //enregiste la valeur apres le '='
                	 	  cout << ligne << endl;
                		  cout <<"Info:"<<infoTable<<endl;
                		  if(ligne == "[Section]"){resto.Section = infoTable;} //enregistre le nombre dans resto.Section
    ...
    fonction qui ne marche pas bien sur, getline(Config, infoTable) renvoi une erreure me disant :"No matching function for call to 'getline(std::ifstream&, int&)'"


    Merci de m'aider.

  7. #7
    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 peux remplacer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getline(Config, info);            //enregiste la valeur apres '='
    Par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int info;
    Config >> info;            //enregiste la valeur apres '='
    Par exemple.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 21
    Points : 20
    Points
    20
    Par défaut
    J'ai essayer, mais lorsque je teste la valeur resto.Section j'obtien le nombre 1397903187 au lieu de 4 comme supposé.

    peut-etre que l'utilisation de ne fonctionne pas comme le getline qui lui allait chercher se qui restait sur la ligne apres le '='

  9. #9
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Loulou24
    c'est une contrainte imposee par le C et le C++
    De quelle contrainte parles-tu ? Le fait que la plage '0' - '9' soit contigüe ?
    Oui.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 21
    Points : 20
    Points
    20
    Par défaut
    S'il vous plait

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 21
    Points : 20
    Points
    20
    Par défaut
    J'ai un reflechie quelque peut et j'en suis venu a la conclusion suivante: ne sauvgardons pas l'entier en mode texte (72heure pour une belle conclusion comme celle-ci).
    Alors, comment puis-je ecrire dans mon fichier, des nombres, qui ne seront pas enregistrer comme type char ou peut importe ce qui n'est pas un int?


    Merci.

  12. #12
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Si, sauvegarde le en mode texte, tu t'évites bien des ennuis.

    Sur comment faire, c'est dans la FAQ :

    http://c.developpez.com/faq/cpp/?pag...RINGS_strtonum
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 21
    Points : 20
    Points
    20
    Par défaut
    Merci beaucoup

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

Discussions similaires

  1. convertir un char en int
    Par boby666 dans le forum C
    Réponses: 4
    Dernier message: 30/12/2007, 11h08
  2. Convertir un char en int
    Par Panaméen dans le forum C
    Réponses: 8
    Dernier message: 30/12/2007, 10h14
  3. [INGRES II] cast d'une char[] en int
    Par prem's dans le forum Autres SGBD
    Réponses: 1
    Dernier message: 05/04/2007, 15h11
  4. convertir un char en int / et prob d'espace
    Par yanchasp dans le forum C++
    Réponses: 20
    Dernier message: 07/02/2006, 19h17
  5. [Conversion]Convertir un char[] en int
    Par ThanosT dans le forum Général Java
    Réponses: 10
    Dernier message: 11/11/2005, 12h23

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