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 :

Problème de fichier


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Par défaut Problème de fichier
    Bonjour à tous ami développeur, je suis nouveau sur le site.

    Je viens quérir votre aide car j'ai un soucis dans la lecture de fichier et l'interprétation de celui ci.

    En gros , voila mon soucis :
    J'ouvre un fichier ascii de base , la encore pas de probleme.
    Toutefois ce dossier à été fait par MATLAB et donc ressemble à :

    % voici les données
    % donnée1 donnée2 donnée3 donnée4 donnée5
    9.51454e+010 5.78125e+011 7.01564e+011 2.05645e+011 7.54212e+010

    Le problême est la , ce que je voudrais réaliser c'est la lecture des nombres dans ce fichier et que chacun de ces nombres sortent sous une variable double et que les lignes avec des % soient ignoré.

    Merci d'avance à ceux qui pourront m'aider

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Par défaut
    Toujours pas de réponse
    Mon code se présente sous cette forme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     ifstream in ;
    in.open("mon fichier" , "r" );
    et c'est à partir de la que je ne vois pas comment récupérer mes 5 nombres dans une variable "double" en ignorant les lignes avec les %

  3. #3
    Membre éclairé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    Avril 2008
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : Avril 2008
    Messages : 190
    Par défaut
    Salut à tous !

    Le mieux, c'est d'utiliser autant que possible les flux de la bibliothèque standard. Je te donne un petit exemple pas testé, juste pour te montrer le principe. Dans cet exemple, je parts du principe qu'après l'en-tête, tu peux avoir plusieurs lignes de données, que tu ne connais pas leur nombre a priori et que tu veux tous les enregistrer :

    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
     
    #include <fstream>
    #include <string>
    #include <sstream>
    #include <list>
     
    [...]
     
    struct Exemple {
      double donnee1, donnee2, donnee3, donnee4, donnee5;
    };  //  struct Exemple
     
    [...]
     
    std::ifstream fichier (nomFichier);
    std::string chaine;
     
    std::getline(fichier, chaine);
    std::getline(fichier, chaine);
     
    std::list<Exemple> liste;
     
    for (std::getline(fichier, chaine); fichier; std::getline(fichier, chaine)) {
      std::istringstream ist (chaine);
      Exemple temporaire;
      ist >> temporaire.donnee1 >> temporaire.donnee2 >> temporaire.donnee3
          >> temporaire.donnee4 >> temporaire.donnee5;
      liste.push_back(temporaire);
    }
    getline lit une ligne de ton fichier, jusqu'au caractère fin de ligne (\n), tandis que istringstream (de l'en-tête sstream) est un flux portant sur les chaînes de caractères, à utiliser comme n'importe quel flux. Du coup, la conversion de chaine de caractère en flottant est automatique.

    À adapter selon ton besoin.

    À bientôt.

    Le Farfadet Spatial

    Edition : un peu plus d'explications.

  4. #4
    Membre éclairé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    Avril 2008
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : Avril 2008
    Messages : 190
    Par défaut
    Salut à tous !

    Heu... Pourquoi faire simple quand on peut faire compliqué ?

    Bref, pas besoin d'un flux sur une chaîne, je l'ai mis par réflexe parce qu'en ce moment je lis des fichiers et je fais des tests sur le format avant de traiter les données. Version plus simple :

    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 <fstream>
    #include <string>
    #include <list>
     
    [...]
     
    struct Exemple {
      double donnee1, donnee2, donnee3, donnee4, donnee5;
    };  //  struct Exemple
     
    [...]
     
    std::ifstream fichier (nomFichier);
    std::string chaine;
     
    std::getline(fichier, chaine);
    std::getline(fichier, chaine);
     
    std::list<Exemple> liste;
     
    while (fichier) {
      Exemple temporaire;
      fichier >> temporaire.donnee1 >> temporaire.donnee2
              >> temporaire.donnee3 >> temporaire.donnee4 >> temporaire.donnee5;
      liste.push_back(temporaire);
    }
    À bientôt.

    Le Farfadet Spatial

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Par défaut
    Salut et merci pour tes réponses,

    si je comprend bien ton code , celui-ci ouvre le fichier , lit les 2 premieres lignes et passe à la troisieme ligne , la les données sont lues de façon simple et stocké comme float .

    Mais si le fichier comporte plus 3 mais 4 lignes et seulement sur la 4 ieme ligne apparaisse les données.
    Du coup ca ne marchera plus ?

    Ne faudrais-t'il pas mettre un :

    while(fichier.good())
    {
    getlines

    et à partir de cet endroit analyser la chaine si celle-ci commence par un % ou tout au caractère n'étant pas un chiffre.
    Si il s'agit d'un chiffre ouvrir une autre boucle "while" contenant un opérateur >> pour stocker les doubles juqu'a la fin de la ligne

    et cela justa qu'a la fin du fichier ?

  6. #6
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut,

    dans ton cas utiliser les stringstreams me parait approprié.

    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
    #include <fstream>
    #include <string>
    #include <sstream>
    #include <vector>
     
    using namespace std;
     
    ....
    ifstream f("fichier.txt");
     
    if (!f) {
      ...
    }
     
    string buffer;
    vector<double> mesnombres; //contiendra tes données
     
    while (getline(f, buffer))
    {
         if (f[0] < '0' || f[0] > '9')
         {
             //C'est pas un chiffre donc on passe à la ligne suivante
             continue;
         }
         //C'est un chiffre
         istringstream in;
         in.str(buffer);
     
         //Là tu peux rentrer tes données
         double tmp;
         while (in >> tmp)
         {
               mesnombres.push_back(tmp);
         }
    }
    ...

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

Discussions similaires

  1. [Delphi 3] Problème avec fichier ressource .RES
    Par delphim dans le forum EDI
    Réponses: 2
    Dernier message: 28/06/2005, 18h11
  2. [Servlet] Probléme écriture fichier
    Par hedgehog dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 23/05/2005, 15h17
  3. Problème lecture fichier en C++
    Par cali1983 dans le forum C++
    Réponses: 17
    Dernier message: 20/05/2005, 09h36
  4. Problème ouverture fichier par double clic...
    Par sankookai dans le forum MFC
    Réponses: 4
    Dernier message: 11/05/2005, 09h13
  5. Problème avec fichier texte
    Par jpdelx dans le forum ASP
    Réponses: 7
    Dernier message: 13/11/2003, 13h17

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