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 valeur fichier texte


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 36
    Points : 23
    Points
    23
    Par défaut Récupérer valeur fichier texte
    Bonjour à vous.
    J'ai un probleme sur un fichier texte que je veux lire dans mon application en c++.

    Mon fichier texte a des lignes de cette forme
    tito 1,245 1,54354 2,63745 5,35421 1

    J'arrive à lire le fichier et à récupérer la ligne qui m'interesse (c'est à dire la ligne qui corespond à tito). Cette ligne est alors stockée dans un string de la manière suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ifstream fichier_lu("C:\\youpi.txt");
    string line;
    while(getline(fichier_lu,line)){
        if(line.find("tito")==0){
            string value = line.substr(0,line.find("\n"));
        }
    }
    Mon probleme est que dans cette ligne, j'aimerais récupérer les valeurs qui sont des doubles pour les utiliser par la suite. Si vous avez une idée je prend car ça fait un moment que je cherche.

  2. #2
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut
    Essayes cela:
    Dans un premier temps déclares les variables suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string col0;
    double col1 col2 col3 col4 col5;
    et pour la lecture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fichier_lu >> col0 >> col1 >> col2 >> col3 >> col4 >> col5;
    Je ne sais pas si c'est possible, mais peut être qu'en modifiant la locale de ton flux tu peux faire en sorte que la décimale soit une virgule plutôt qu'un point (comme il semble que c'est le cas dans ton fichier).

    Autre solution: T'arranger pour que toutes les ',' de ta ligne soient remplacées par des '.'
    Ancien membre du projet "Le Dernier Âge".

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 36
    Points : 23
    Points
    23
    Par défaut
    En fait, j'arrive à convertir le string en double en faisant de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    string val1, val2, val3, val4, val5;
    double Y1, Y2, Y3, Y4; 
    std::istringstream iss1(val2);
    iss1 >> Y1;
    ...
    Mais le soucis c'est que quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(line.find("toti")==0)
        fichier_lu >> val1....
    Il y'a n'importe quoi dans val1 mais pas ce que je veux

  4. #4
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut
    C'est normal si tu as fait un getline() auparavant: tu as déjà tu ton flux jusqu'à la prochaine ligne, et donc les doubles ne sont pas modifiés (et d'ailleurs ils gardent la valeur imprévisible qu'ils ont dès leur déclaration.
    Je vais essayer de mettre au point quelques lignes de code. J'éditerai plus tard.
    Edit: Et voila, je n'ai pas testé par-contre.
    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
    	string str;
    	double nbrs[5];
    	ifs("some_file"); // fichier contennant "tito 1,245 1,54354 2,63745 5,35421 1"
    	if (!ifs.is_open()) {
    		return;
    	}
    	while (!ifs.eof()) {
    		for (int i=0; i < 6; ++i) {
    			string tmp;
    			ifs >> tmp;
    			if (i != 0) {
    				istringstream iss(tmp.assign('.', tmp.find(',')));
    				iss >> nbrs[i-1];
    			} else {
    				tmp str;
    			}
    		}
    		// autres oérations....
    	}
    Ancien membre du projet "Le Dernier Âge".

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 36
    Points : 23
    Points
    23
    Par défaut
    En effet, je viens de remarquer que en fait, il lit la ligne d'après mais comme dans mon fichier texte je n'ai pas de ligne après, il sort n'importe quoi.

    Si tu arrive à faire un petit bout de code qui résoud ce problème c'est sympa.

  6. #6
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut
    Code posté (très sommaire).
    Ancien membre du projet "Le Dernier Âge".

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 36
    Points : 23
    Points
    23
    Par défaut
    Le programme fonctionne sauf qu'il récupère toujours la dernière ligne de mon fichier texte. Or je veux récupérer que la ligne qui corespond à tito (par exemple).
    Et lorsque je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while (!fichier_lu.eof()) {
        if(line.find("tito")){
            for (int i=0; i < 10; ++i) {				
                string tmp;						
                fichier_lu >> tmp;			
                if (i!=0) {
                    istringstream iss(tmp);
                    iss >> Z[i-1];
               }
            }
        }
    }
    il ne me récupère que la dernière ligne qui n'est pas la ligne qui corespond à tito

  8. #8
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut
    essayes:
    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
    	string str;
    	double nbrs[5];
    	ifs("some_file"); // fichier contennant "tito 1,245 1,54354 2,63745 5,35421 1"
    	if (!ifs.is_open()) {
    		return;
    	}
    	if (!ifs.eof()) {
    		for (int i=0; i < 6; ++i) {
    			string tmp;
    			ifs >> tmp;
    			if (i != 0) {
    				istringstream iss(tmp.assign('.', tmp.find(',')));
    				iss >> nbrs[i-1];
    			} else {
    				tmp = str;
    			}
    		}
    		// autres oérations....
    	}
    J'ai remplacé le while par iuun if, comme ça il ne boucle pas (mais ça marche que si tu veux récupérer une seule ligne contenant 1 chaîne et 4 doubles). Ah, et j'ai aussi corrigé une petite coquille.
    Ancien membre du projet "Le Dernier Âge".

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 36
    Points : 23
    Points
    23
    Par défaut
    Juste une question, ou est ce que le programme sait qu'elle ligne il doit prendre dans le fichier texte???
    Parce que là, je vois nulle part qu'on lui demande de prendre la ligne qui comporte "tito"

  10. #10
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut
    Ah, ok, je viens de comprendre, ce ne sont pas "toutes" ni "la seule" ligne(s) de ton fichiers, mais seulement certaines.
    Ben essaye d'adapter ce que j'ai fait et de le faire non pas à partir d'un flux de fichier mais d'un flux sur une chaîne (isstream) de caractère a partir d'une chaîne que tu estimes valide.
    Ancien membre du projet "Le Dernier Âge".

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 36
    Points : 23
    Points
    23
    Par défaut
    Voila, en fait mon fichier a plusieurs ligne de la même forme mais avec des nom (comme "tito") différent sur toutes les lignes. Et je veux récupérer une ligne en particulier (par ex celle qui comprend "tito").

    Je vais essayer de modifier ton bout de code pour que ca marche. Je te remercie

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 36
    Points : 23
    Points
    23
    Par défaut
    Désolé de vous redéranger mais je n'arrive pas à récupérer la ligne que je veux.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 36
    Points : 23
    Points
    23
    Par défaut
    Merci beaucoup, j'ai trouvé ma réponse à mon problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ifstream fichier_lu("C:\\youpi.txt");
    string line;
    double Z[8];
    while(getline(fichier_lu,line)){
      istringstream ss(line); // on cree un stringstream pour recuperer les valeurs de la ligne
      string keyvalue; // la string qui va contenir la clef de la ligne
      ss >> keyvalue; // on recupere la clef de la ligne
      if(keyvalue==nom_matiere) {// on la compare a la clef a trouver
        for (int i=0; i<8; i++)
          ss >> Z[i]; //on recupere les 8 valeurs suivantes de la ligne
      break; //on sort du while
      }
    }
    A+ et encore merci

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

Discussions similaires

  1. Quizz: Récupérer un fichier texte dans le répertoire courant?
    Par bilou_12 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 25/03/2012, 23h39
  2. Réponses: 1
    Dernier message: 18/10/2009, 18h50
  3. Récupérer valeur et texte d'un <html:select
    Par Bosra dans le forum Struts 1
    Réponses: 2
    Dernier message: 31/01/2008, 14h56
  4. Comment récupérer un fichier texte sur un site ?
    Par michel71 dans le forum Web & réseau
    Réponses: 3
    Dernier message: 21/10/2007, 23h52
  5. Réponses: 2
    Dernier message: 14/09/2006, 13h56

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