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 :

Lien C++/.xls ou .txt


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut Lien C++/.xls ou .txt
    Bonjour,

    J'aimerai connaître la meilleure façon de faire le lien entre C++ et un fichier (.txt ou .xml).
    En fait, dans mon projet, je dois aller chercher des données situées dans un fichier comprenant juste deux colonnes (très basique) pour les utiliser dans mon implémentation c++.
    J'aurai voulu connaître vos avis...
    Merci de bien m'aider.

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Deux solution s'offrent à toi:

    • La lecture (parsing et interprétation) du fichier créée de toutes pieces en lisante un std::ifstream
    • L'utilisation de boost::serialization
    La première solution pourrait prendre une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    std::string first;
    std::string second;
    std::ifstream file("fichier.txt")
    while(file>>first>>second)
    {
        /* gestion première colonne */
        /* gestion deuxième colonne */
    }
    Pour un fichier xml, boost sera plus facile d'emploi ... je te reporte aux différents tutoriaux qui se trouve sur le site
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    Cela se fait sur les fichiers texte et excel ou seulement texte?
    Laquelle me conseilleriez-vous?
    Je veux juste aller chercher quelques données qui sont dans une table de 6 colonnes (très basique avec plein de chiffres ^^).

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    Des avis sur Boost et TniyXML??
    Lequel me conseilleriez-vous?

    Merci.

  5. #5
    Membre régulier
    Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par fab87 Voir le message
    Bonjour,

    J'aimerai connaître la meilleure façon de faire le lien entre C++ et un fichier (.txt ou .xml).
    Bonjour,
    Pour des fichiers basiques, j'ai une nette préférence pour un fichier .txt dont chaque colonne est séparée par des tabulations, que tu peux lire facilement comme ceci :

    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
           ifstream fichier;										
    
           fichier.open(chemin d'accès+nom);						
    
            if (!fichier){			/* Test de l'ouverture correcte du fichier */
                cout << "Erreur lors de l'ouverture du fichier " << endl;
                exit(1);
            }
    
            string ligne; int nb_lignes = 1;
            
            while (getline(fichier, ligne)){	/* Lecture des données ligne par ligne */
                ++nb_lignes;
                if (nb_lignes > 1)             /* Si tu as une ligne de titre dans ton fichier*/
                    fichier >> 1_colonne >> 2_colonne >> 3_colonne;
            }
            fichier.close();

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    D'accord je vous remercie pour votre réponse.
    Néanmoins, n'est-il pas plus propre de mettre le fichier en xml et de le gérer avec Boost par exemple? En fait je suis en stage pour dix semaines et j'aurai voulu faire un truc propre. Je n'ai que 6 tables à gérer et elles contiennent 6 colonnes chacune.
    Merci.

  7. #7
    Membre régulier
    Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par fab87 Voir le message
    D'accord je vous remercie pour votre réponse.
    Néanmoins, n'est-il pas plus propre de mettre le fichier en xml et de le gérer avec Boost par exemple? En fait je suis en stage pour dix semaines et j'aurai voulu faire un truc propre. Je n'ai que 6 tables à gérer et elles contiennent 6 colonnes chacune.
    Merci.
    Tout est possible, mais il faut alors lire balise par balise, et ce n'est pas la même longueur de code, même avec Boost...

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    Oui mais c'est plus propre je pense nan?
    D'autres avis m'intéresseraient aussi pour comparer

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    Etant donné que je manipule que des nombres, je pense que je vais utiliser ta solution dasycarpum. Je délimiterai chaque élément d'une colonne par ";" et chaque colonne par une tabulation par exemple.

    Si d'autres personnes ont des avis différents, n'hésitez-pas...
    J'ai vraiment envie d'avoir plusieurs avis.
    Merci.

  10. #10
    Membre régulier
    Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par fab87 Voir le message
    Etant donné que je manipule que des nombres, je pense que je vais utiliser ta solution dasycarpum. Je délimiterai chaque élément d'une colonne par ";" et chaque colonne par une tabulation par exemple.
    Ce que tu décris c'est quasi du .csv... tu peux utiliser ç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
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    struct Data{            /* Exemple de structure de ton fichier .csv */
    	string colA;
    	int colB;
    	int colC;
    	double colD;
    	int colE;
    };
     
    int Ouverture(string nom_fichier){
     
    	ifstream fichier;										
     
    	string chemin = nom_fichier + ".csv" ;					
     
    	fichier.open(chemin.c_str());							
     
    	if (!fichier){											
    		cout << "Erreur lors de l'ouverture du fichier " 
    			 << chemin
    			 << endl;
    		system ("PAUSE");
    		exit(1);
    	}
    	else
    		cout << "\nOuverture reussie" << endl;
     
    	string ligne;
    	int nb_lignes = 0;
    	int max_colonne = 0;
     
    	vector<Data>tableau;     /* vector tableau de type structure Data */
    	Data donnees;               /* variable donnees de type structure Data et son initialisation */
            donnees.colA = ""; donnees.colB = 0; donnees.colC = 0;donnees.colD = 0;donnees.colE = 0;
     
    	while (getline(fichier, ligne)){
     
                    stringstream fluxLigne(ligne);
    		string cell;
    		int nb_cell = 0;
     
    		if (nb_lignes > 0){
    			while (getline(fluxLigne, cell, ';')){
    				switch (nb_cell){
    					case 0:
    						donnees.colA = cell;
    						break;
    					case 1:
    						donnees.colB = atoi(cell.c_str());
    						break;
    					case 2:
    						donnees.colC = atoi(cell.c_str());
    						break;
    					case 3:
    						donnees.colD = atof(cell.c_str());
    						break;
    					case 4:
    						donnees.colE = atoi(cell.c_str());
    						break;
    				}
    				++nb_cell;
    			}
    			tableau.push_back(donnees); /* Stockage des données dans le vector tableau */
    		}
    		++nb_lignes;
    	}
    	for (int i = 0; i < nb_lignes-1 ; ++i )   /* Vérification */
    		cout << tableau[i].colA << "\t" << tableau[i].colB << "\t" << tableau[i].colC << "\t" << tableau[i].colD << "\t" << tableau[i].colE << endl;
     
    	fichier.close();										
     
    	return nb_lignes;									
    }
     
    int main()
    {
    	string nom;
     
    	cout << "Inscrivez le nom du fichier .csv à ouvrir : ";
    	cin >> nom;
     
    	int lignes = Ouverture(nom);
     
    	cout << "Fichier de " << lignes << " lignes" << endl;
    }
    Bon courage

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    C'est très gentil de ta part je te remercie vraiment beaucoup, je vais regarder çà alors =)
    J'ai juste à mettre mon fichier en .csv c'est çà?
    Et pour info puis-je tester çà sur code blocks? Ou dois-je le faire obligatoirement sur visual?
    Merci encore...

  12. #12
    Membre régulier
    Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par fab87 Voir le message
    C'est très gentil de ta part je te remercie vraiment beaucoup, je vais regarder çà alors =)
    J'ai juste à mettre mon fichier en .csv c'est çà?
    Et pour info puis-je tester çà sur code blocks? Ou dois-je le faire obligatoirement sur visual?
    Merci encore...
    Chez moi les 2 fonctionnent, il suffit d'adapter l'un ou l'autre détail spécifique comme le system("PAUSE") pour Visual ou return 0 pour CB, et bien sûr de ne pas oublier les
    #include<iostream>
    #include<fstream>
    #include<sstream>
    #include<string>
    #include<vector>

    Bonne soirée

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    Merci pour tout!

    Donc là ton programme permet d'afficher le nombre de lignes du fichier?
    Comment fait-on pour récupérer certaines données afin de les utiliser dans une fonction?

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    OOPS je suis désolé j'avais pas bien vu je suis fatigué donc ton prog permet d'afficher toutes les données du fichier ainsi que le nombre de lignes. Est-il possible de récupérer certaines données pour les utiliser dans une fonction (j'le répète au cas où que tu l'ai pas vu).
    Encore un grand merci!

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    Dans mon cas, je ne gère que des doubles car je gère des micromètres!

    string cell;

    case 3:
    donnees.colD = atof(cell.c_str());
    break;

    atof permet de convertir des char en double mais si ma se contenait 0,00005 il m'affiche 0 donc çà ne fonctionne pas.
    Est-ce que le problème vient de cell qui doit être déclaré en char nan?
    Merci.

  16. #16
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Salut

    Le problème est que tu ne fais pas du C++. Voir la FAQ et cet exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      std::string nombre_chaine = "0.00005";
      std::istringstream nombre_stream(nombre_chaine);
      double nombre;
      nombre_stream >> nombre;
    Find me on github

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    C'est bon je viens de trouver le problème, il fallait mettre des points au lieu des virgules dans mon csv.

  18. #18
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    Re!
    J'ai eu un chamgement d'organisation des fichiers (vive les clients! )
    Il sera défini de la sorte :

    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
    Position;Défaut translation y;Position;Défaut translation x;Position;Défaut translation z;Position;Défaut rotation x;Position;Défaut rotation y;Position;Défaut rotation z
    -4;3;-360;0,825;-4;23;-4;2,3;-4;2,23;-4;21,3
    0;2;-320;2,25;0;12;0;1,2;0;1,222;0;1,62
    4;5;-280;4,17;4;15;;;4;1,675;4;2,5
    ;;-240;5,16875;6;13;;;;;12;4
    ;;-200;2,6725;;;;;;;67;45
    ;;-160;-0,32375;;;;;;;;
    ;;-120;-2,1275;;;;;;;;
    ;;-80;-2,79;;;;;;;;
    ;;-40;-1,40625;;;;;;;;
    ;;0;-0,00875;;;;;;;;
    ;;40;-0,005;;;;;;;;
    ;;80;-0,2275;;;;;;;;
    ;;120;-1,60875;;;;;;;;
    ;;160;-4,85;;;;;;;;
    ;;200;-4,68875;;;;;;;;
    ;;240;-2,92875
    ;;280;0,60925
    ;;320;1,07625
    ;;360;0,2875
    Comment peut-on compter le nombre de lignes pour la 1ère colonnes (ici 3) ?
    Parce que j'utilise un tant que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (getline(fichier, ligne))
    Mais le problème c'est qu'il me donne le même nombre de lignes pour chaque colonnes (le nombre de lignes de plus élevé). Je voudrais qu'il puisse me donner le nombre de lignes de la 1ère colonnes par exemple mais je sais pas comment le faire arrêter avant une case vide en fait.

    Merci.

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

Discussions similaires

  1. Probleme de conversion xls en txt
    Par Ckelito dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 02/02/2008, 10h36
  2. Macro : .xls to .txt sans espace ni tabulation
    Par kyzeur dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 25/07/2007, 15h45
  3. Enregistrement feuille xls sous txt
    Par anisr dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 25/02/2007, 14h32
  4. [VBA-E] .XLS vers .TXT (enregistrement fixe)
    Par turbo74 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 17/03/2006, 15h45
  5. [FLASH MX 2004] liens javascript et fichier txt externe
    Par Shekhdamas dans le forum Flash
    Réponses: 4
    Dernier message: 23/02/2006, 18h52

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