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 :

Lire un tableau de taille inconnu dans un fichier


Sujet :

C++

  1. #1
    Membre éclairé Avatar de meufeu
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 355
    Par défaut Lire un tableau de taille inconnu dans un fichier
    Bonjour ou dumoins, ReBonjour,

    Dernière question pour ma part devant le gros pouce que j'ai pu avoir en venant ici
    Je voudrais lire dans mon fichier un tableau de réels sans connaitre sa taille ...

    il peut se présenter sur plusieurs lignes :

    TABLEAU =
    0. 1.1 2.3 3.45 4.568 5.7
    6.0025 7.28456 8.45789
    10.

    J'arrive jusque la à lire des entiers, des doubles, je pense qu'avec le code suivant je pourrais lire un tableau à condition qu'il soit sur une ligne et que je connaisse
    le nombre d'éléments que je vais avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <iostream>
    #include <fstream>
     
    using namespace std;
     
    int main()
    {
    int t1[6];
    int i;
    ifstream f("toto.txt");
    for(i=0;i<6;i++)f>>t1[i];
    f.close();
    return 0;
    }
    Mais sans connaitre ces deux éléments, comment faire ?
    Merci encore

  2. #2
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Avec std::getline et des vector, tu devrais t'en sortir...

    Par exemple (non testé, et sans gestion d'erreur) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    std::string ligne, mot;
    float reel;
    std::vector<float> tableau;
    while (std::getline(f, ligne))
    {
        std::istringstream iss(ligne);
        while (std::getline(iss, mot, ' '))
        {
            std::istringstream(mot) >> reel;
            tableau.push_back(reel);
        }
    }

  3. #3
    Membre expérimenté Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Par défaut
    +1 (longue vie aux vectors !)

  4. #4
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    std::string ligne, mot;
    float reel;
    std::vector<float> tableau;
    while (std::getline(f, ligne))
    {
        while (std::getline(ligne, mot, ' '))
        {
            mot >> reel;
            tableau.push_back(reel);
        }
    }
    Y a pas mal d'erreurs là-dedans

    Plutôt ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    std::ifstream File("Toto.txt");
     
    std::istream_iterator<float> Begin(File);
    std::istream_iterator<float> End;
     
    std::vector<float> Tab(Begin, End);
    Enfin s'il y a autre chose à lire après le tableau, il faudra effectivement connaître le nombre d'élément, ou connaître un délimiteur pour être sûr de ne pas déborder.

  5. #5
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Citation Envoyé par Laurent Gomila
    Y a pas mal d'erreurs là-dedans
    Ca m'étonnes pas !

    En relisant, je m'aperçois que j'avais oublié de passer par des istringstream
    (j'ai essayé de corriger mon poste en ce sens)

    Pour mon info personnelle, il y avait d'autres erreurs ?

  6. #6
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Pour mon info personnelle, il y avait d'autres erreurs ?
    Tu extrais une ligne, puis un mot, puis un float. Donc en gros dans ton tableau tu ne vas récupérer que le second nombre de chaque ligne
    Edit : même pas, j'avais pas vu que tu bouclais aussi sur l'extraction de mot (ce qui n'est pas meilleur)

    D'autant plus que tu te compliques la vie pour rien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    float reel;
    while (File >> reel) // à remplacer par une boucle for si tu connais le nombre d'éléments
        tab.push_back(reel);

  7. #7
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    D'accord, c'était très loin d'être optimisé
    En fait, je ne savais pas qu'on pouvais faire directement Mais par contre, quand tu dis :
    Citation Envoyé par Laurent Gomila
    Tu extrais une ligne, puis un mot, puis un float. Donc en gros dans ton tableau tu ne vas récupérer que le second nombre de chaque ligne
    Edit : même pas, j'avais pas vu que tu bouclais aussi sur l'extraction de mot (ce qui n'est pas meilleur)
    Je ne suis pas d'accord.
    Ce que je faisais, c'était extraire les lignes du fichier texte (en gros parce que je ne savais faire que ça ), puis extraire les mots de mes lignes, puis convetir mes mots en réel (ouf !).
    Mis à part le fait que c'est vraiment inutile, je ne vois pas d'erreur.

  8. #8
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je ne suis pas d'accord.
    Ce que je faisais, c'était extraire les lignes du fichier texte (en gros parce que je ne savais faire que ça ), puis extraire les mots de mes lignes, puis convetir mes mots en réel (ouf !).
    Mis à part le fait que c'est vraiment inutile, je ne vois pas d'erreur.
    Ok, je n'avais pas vu que tu utilisais getline sur la ligne extraite. C'est impossible : getline ne peut prendre qu'un istream comme premier paramètre.

  9. #9
    Membre émérite Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <iostream>
    #include <fstream>
     
    using namespace std;
     
    int main()
    {
    int t1[6];
    int i;
    ifstream f("toto.txt");
    for(i=0;i<6;i++)f>>t1[i];
    f.close();
    return 0;
    }

    Comme dit précédemment, c'est ultra-dangereux, tu risques ainsi le débordement tampon, ceci facilitant énormément le travail des hackers...

    A lire absolument:
    http://nicolasj.developpez.com/articles/pieges/

  10. #10
    Membre éclairé Avatar de meufeu
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 355
    Par défaut
    avec f un ifstream et c un vecteur de double, cela se fait tout seul !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    copy(istream_iterator<double>(f), istream_iterator<double>(),back_inserter(v));
    MERCI a tous !

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

Discussions similaires

  1. [AC-2007] Tableau de taille variable dans une feuille d'état
    Par spawny161184 dans le forum VBA Access
    Réponses: 3
    Dernier message: 14/11/2011, 11h29
  2. [AC-2007] Tableau de taille variable dans une feuille d'état
    Par spawny161184 dans le forum IHM
    Réponses: 0
    Dernier message: 08/11/2011, 08h55
  3. feuil qui contient un tableau de taille inconnu
    Par pikamo dans le forum Excel
    Réponses: 4
    Dernier message: 09/06/2011, 11h33
  4. Réponses: 5
    Dernier message: 15/03/2010, 12h22
  5. Selectionner un tableau de taille inconnue
    Par pythagore3_14 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/08/2008, 11h54

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