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 :

récupérer des données en double à partir d'un fichier texte


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut récupérer des données en double à partir d'un fichier texte
    Pour un programme en c++ codé grâce à xcode, j'ai besoin d'écrire et de lire des données sur un fichier texte.

    Ces données sont des nombres que j'aimerais utiliser comme double dans mon programme.
    J'ai essayé d'utiliser les opérateurs de flux par défaut de c++ (<< et >>) mais s'ils fonctionnent à merveille pour les string et les tableaux de char, ils ne fonctionnent pas pour les int, float et autres double.

    En effet, quand j'essaie de stocker une donnée lue sur le fichier dans un double, rien ne se passe et ce dernier garde sa valeur précédente. Il n'y a pas de problème de portée de variable. De plus, cela arrête tout le reste des surcharges de >> mais je pense que cela est logique vu l'échec de l'opération précédente.

    L'opérateur << ne fonctionne pas non plus pour les double avec le même phénomène que pour l'opérateur de lecture : pas d'action ni de message d'erreur et arrêt des opérations suivantes.

    J'ai essayé de surcharger moi même ces opérateurs pour les doubles. Cela m'a confirmé qu'ils existent bien puisque cela renvoye un message d'erreur avertissant de l'ambiguité de leur utilisation.

    Cependant, ces opérateurs fonctionnent sur un élément cout ou cin pour un double.

    Merci d'avance.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 11
    Points : 14
    Points
    14
    Par défaut
    Je pense qu'il faut que tu utilise le flux >> sur un istringstream, et non sur le string lui-même.

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    Tu as peut être un problème de locale : les doubles dans ton fichier sont sous la forme 3,14 et ton code cherche à les lire sous la forme 3.14; ou l'inverse. Peux-tu montrer une ligne de ton fichier de données et le code qui essai de la lire ?

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Voici une ligne de mon fichier :
    aa 1050.00 (JXB-KA-E) 37.15 -17.20 37.20 41.90 1 26

    Et le code associé pour lire cette 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <limits>
     
    int main() {
    ifstream fichier("/Users/Arnaud_HENRY/Documents/X/3A/EA/C++/Simulation/JXB_09_11.txt", ios::in);
     
    	if(fichier)
    	{
    		double nombre1=0.1, nombre2=0.2;
    		string chaine="chaine";
    		while (!fichier.eof()) {
                         fichier >> chaine >>nombre1;
                         fichier.ignore(numeric_limits<int>::max(), ')');
    		     fichier >> nombre2;
                         fichier.ignore(numeric_limits<int>::max(), '\n'); //on parcourt le texte jusqu'à la fin de la ligne
                         }
     
     
    		cout << chaine << " \n " << nombre1 << '\t' << nombre2 << endl;
    	}
    	else cerr << "Impossible d'ouvrir le fichier !" << endl;
    return 0;}
    L'exécution me retourne
    aa
    0.1 0.2

    Pour l'écriture, le programme test est
    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 <iostream>
    #include <fstream>
    #include <string>
     
    int main(){
     
    ofstream fichier("/Users/Arnaud_HENRY/Documents/X/3A/EA/C++/test_write.txt", ios::out | ios::trunc);
     
    		if(fichier)
    		{
    			double  db = 123.02;
    			int i=23;
    			string chaine = "chaine";
    			fichier << "je suis un fichier sortie" << '\n' << chaine << i  << '\n' << db;
    			cout << "operation done";
    		}
    		else cerr << "Impossible d'ouvrir le fichier !" << endl;
    		fichier.close();
    return 0;}
    et le résultat dans le fichier est :
    je suis un fichier sortie
    chaine


    Par contre le code suivant fonctionne parfaitement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void test_in_out(){
    	double nombre;
    	cout << "Entrez un nombre pour l'imprimer" << '\t';
    	cin >> nombre;
    	cout << nombre;
     
    }
    J'espère avoir été suffisamment complet. Si tu as besoin d'autres précisions, n'hésite pas.

    Merci

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Essaies ça :
    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
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <limits>
    #include <locale>
    int main() {
       std::ifstream fichier("file.txt", std::ios::in);
     
       std::cout<<"Decimal point : "<<std::use_facet<std::numpunct<char> >(fichier.getloc()).decimal_point ()<<"\n";
     
     
    	if(fichier)
    	{
    		double nombre1=0.1, nombre2=0.2;
    		std::string chaine="chaine";
    		while (!fichier.eof()) {
             fichier >> chaine >>nombre1;
             fichier.ignore(std::numeric_limits<int>::max(), ')');
             fichier >> nombre2;
             fichier.ignore(std::numeric_limits<int>::max(), '\n'); //on parcourt le texte jusqu'à la fin de la ligne
             std::cout << chaine << " \n " << nombre1 << '\t' << nombre2 << std::endl;
          }
     
     
    	}
    	else std::cerr << "Impossible d'ouvrir le fichier !" << std::endl;
    return 0;}
    et regardes ce que tu as pour Decimal point.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci pour ce joli code.

    Quand je fais tourner le programme, la console me renvoie le message suivant :

    terminate called after throwing an instance of 'std::bad_cast'
    what(): std::bad_cast
    Program received signal: “SIGABRT”.
    sharedlibrary apply-load-rules all
    (gdb)


    qui provient de la ligne
    std::cout<<"Decimal point : "<<std::use_facet<std::numpunct<char> >(fichier.getloc()).decimal_point ()<<"\n";

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par calinou_2007 Voir le message
    Merci pour ce joli code.

    Quand je fais tourner le programme, la console me renvoie le message suivant :

    terminate called after throwing an instance of 'std::bad_cast'
    what(): std::bad_cast
    Program received signal: “SIGABRT”.
    sharedlibrary apply-load-rules all
    (gdb)


    qui provient de la ligne
    std::cout<<"Decimal point : "<<std::use_facet<std::numpunct<char> >(fichier.getloc()).decimal_point ()<<"\n";

    Quel est ton environnement : O.S. ? Compilateur ? STL du compilateur ou autre ? Options de compilation ? Unicode ou ANSI ?

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    J'utilise xcode 3.2 sous OSX 10.6.2.
    La STL est celle du compilateur.
    Pour les réglages des options de compilation, tu trouveras ci-joint le descriptif des options de mon projet.

    J'ai déjà essayé de changer les options de l'architecture en lui imposant de tourner en 32 bits, sans résultat.
    Images attachées Images attachées  

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Et si tu fais juste ça :
    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
     
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <limits>
    #include <locale>
    int main() {
       std::ifstream fichier("file.txt", std::ios::in);
     
       if(fichier){
          std::locale mylocale("");
          fichier.imbue(mylocale);
          std::cout<<"Decimal point : "<<std::use_facet<std::numpunct<char> >(fichier.getloc()).decimal_point ()<<"\n";
       }
       return 0;
    }

  10. #10
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    XCode 3.2 ?
    Est-ce que le comportement observé ne serait pas un contrecoup du bug décrit ici ?

    Edit : ici aussi.

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci Arzar !

    C'est bien la solution à ce satané problème.

    Pour résumer, il suffit d'effectuer les manips suivantes


    1. Project -> Edit Active Target ...
    2. onglet Build tab
    3. sélectionner "preprocessor" (in "GCC 4.2 - Preprocessing")
    4. supprimer _GLIBCXX_DEBUG=1 et _GLIBCXX_DEBUG_PEDANTIC=1

    et ensuite, ça marche !

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

Discussions similaires

  1. [PHP 5.4] récupérer des données qui se trouvent dans un fichier JSON
    Par aspkiddy dans le forum Langage
    Réponses: 12
    Dernier message: 28/04/2015, 15h43
  2. Réponses: 1
    Dernier message: 04/05/2009, 20h01
  3. Réponses: 12
    Dernier message: 21/02/2007, 09h44
  4. Réponses: 1
    Dernier message: 29/01/2007, 19h22
  5. Réponses: 2
    Dernier message: 25/01/2007, 13h20

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