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