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 fichier d'entiers avec ifstream et affecter les valeurs à un tableau ?


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Cimentage
    Inscrit en
    Septembre 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Cimentage
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2014
    Messages : 44
    Par défaut Lire un fichier d'entiers avec ifstream et affecter les valeurs à un tableau ?
    Salut à tous !

    Je viens solliciter votre aide car j'aimerais mettre en place un système me permettant de récupérer cette série de chiffres située dans un fichier externe .txt :

    47 23 77 12 88
    22 89 21 17 12

    J'aimerais que les séries soient stockées dans un double tableau de type [y][x].

    Que ma première série de chiffres soit donc en Y = 0 ( x étant le nombre d'INT contenus dans la ligne )
    et que la seconde ligne en Y soit égale à 1 ( et puis ainsi de suite pour d'autres éventuelles lignes ) !

    En gros, j'aimerais détecter ma fin de ligne afin d'incrémenter ma valeur Y et d'y stocker à nouveau tous les int de cette ligne là dans mon X.

    Comment faire pour passer à la ligne suivante sans passer par getline du coup ?

    J'ai commencé par faire 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #include <iostream>
    #include <fstream>
     
    using namespace std;
     
    int main()
    {
        int x = 0;
        int y = 0;
     
        int tab[10][10];
        int i = 0;
     
        ifstream flux("fichier.txt");
     
        while (!flux.eof())
        {
            flux >> i;
            tab[y][x] = i;
            x++;
        }
     
        for (int i = 0 ; i < 10 ; i++)
        {
            cout << tab[y][i] << " ";
        }
     
        return 0;
    }
    Merci énormément d'avance à ceux qui m'aideront à résoudre ce problème qui me turlupine ! :-)

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 144
    Billets dans le blog
    4
    Par défaut
    Tu peux peut-être lire un char et voir s'il s'agit d'un retour à la ligne, m'enfin pourquoi ne pas vouloir utiliser getline ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre averti
    Homme Profil pro
    Cimentage
    Inscrit en
    Septembre 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Cimentage
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2014
    Messages : 44
    Par défaut
    Salut Bousk :-)

    C'est pour la conversion string > int avec atoi que je n'arrive pas vraiment à manier dans ce cas de figure..

    J'ai essayé de la manière suivante mais je dois avouer que je suis complètement largué.

    Merci encore pour ta participation :-)

    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
    #include <iostream>
    #include <fstream>
    #include <cstdlib>
     
    using namespace std;
     
    int main()
    {
        int x = 0;
        int y = 0;
     
        int tab[10][10];
        int index = 0;
     
        ifstream flux("fichier.txt");
     
        string ligne;
     
        while (!flux.eof())
        {
            getline(flux, ligne);
     
            for (int i = 0 ; i < ligne.length() ; i++)
            {
                if (ligne[i] != ' ')
                {
                    index = atoi(ligne.c_str());
                    tab[y][x] = index;
                    x++;
                }
            }
            x=0;
            y++;
            cout << endl;
        }
     
        for (int t = 0 ; t < 2 ; t++)
        {
            for (int u = 0 ; u < 10 ; u++)
            {
                cout << tab[t][u];
            }
            cout <<endl;
        }
     
        return 0;
    }
    Le code m'affiche le résultat suivant :

    47474747474747474747
    22222222222222222222

    J'implore à nouveau votre aide

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 144
    Billets dans le blog
    4
    Par défaut
    L'idée serait d'utiliser getline pour délimiter les lignes aisément, puis rien n'interdit d'utiliser >> pour récupérer les entiers de la ligne récupérée par getline. Comme dans ton premier post.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    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
    Par défaut
    Voici un exemple qui fonctionne (C++11). C'est simpliste, je ne traite pas les cas où le fichier dépasse le tableau, je ne traite le fait que ce soit un double tableau.

    Code c++ : 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
    #include <fstream>
    #include <sstream>
    #include <iostream>
    #include <array>
     
    using namespace std;
     
    int main() {
      array<array<int, 10>, 10> tab {};
      ifstream flux("fichier.txt");
      std::string current_line;
     
      // Read file
      int y = 0;
      while(std::getline(flux,current_line)) {
        std::istringstream input(current_line);
        int x = 0;
        while(input >> tab[y][x++]);
        ++y;
      }
     
      // Dump result
      for (auto& v : tab) {
        for (auto& value : v)
          cout << value << " ";
        cout << "\n";
      }
     
      return 0;
    }

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 144
    Billets dans le blog
    4
    Par défaut
    Aussi, si tu ne connais pas le nombre de lignes, l'utilisation d'un std::vector sera préférable.
    Si le nombre de colonnes est aussi inconnu, voires peut varier d'une ligne à l'autre, idem.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Membre averti
    Homme Profil pro
    Cimentage
    Inscrit en
    Septembre 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Cimentage
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2014
    Messages : 44
    Par défaut
    Bonsoir à vous ! :-]

    Bousk, Jblecanard > Vous êtes au TOP ! J'ai enfin réussi à résoudre mon problème grâce à vous !!!! :-D

    Merci infiniment, une fois de plus, vous êtes les meilleurs :-)

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

Discussions similaires

  1. fichier binaire lecture avec ifstream
    Par debutant100 dans le forum Langage
    Réponses: 1
    Dernier message: 19/09/2011, 19h43
  2. Lire un fichier PDF (text) avec Matlab
    Par schecter dans le forum MATLAB
    Réponses: 3
    Dernier message: 08/03/2010, 06h33
  3. Lire un fichier CSV envoyé avec une requête POST
    Par Marm B dans le forum Langage
    Réponses: 6
    Dernier message: 26/08/2009, 13h31
  4. Lire un fichier d'entier avec SDL en C
    Par gsaly dans le forum SDL
    Réponses: 15
    Dernier message: 07/05/2007, 20h41
  5. Réponses: 1
    Dernier message: 02/05/2007, 09h22

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