Remplir un tableau à partir d'un fichier - ifstream -

Remplir un tableau à partir d'un fichier - ifstream - - C++ - Programmation

Marsh Posté le 15-02-2008 à 21:26:11    

Bonsoir,
 
Je voudrais qu'une personne puisse me trouver l'erreur dans mon code ! Je m'explique, je souhaite récupérer des données numériques (int) d'un fichier (Essai.txt) afin de remplir mon tableau tab[]. Je n'arrive pas à remplir mon tab avec les données de mon fichier. J'obtiens des 0 partout dans mon tableau.
Par la même occasion, si vous avez aussi des remarques à me faire concernant ma syntaxe en C++, n'hésitez pas.
Je vous joins mon code:
 
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <string>
 
void get_min(int [], int);
using namespace std;
 
int main(void)
{
    ifstream f_entree("Essai.txt", ios::in);
////////////////////////////////////////////////////
// Vérification de la bonne ouverture du fichier //
//////////////////////////////////////////////////
    if(!f_entree)
    {
        cerr << "Erreur d'ouverture\n";
         
        system("PAUSE" );
        return (-1);
    }
////////////////////////////////////////////////
// Comptage du nombre de lignes d'un fichier //
//////////////////////////////////////////////
    int Nbr_lignes = 0;
    string line;
     
    while(getline(f_entree, line))
    {
        ++Nbr_lignes;
    }
 
//////////////////////////////////////////////
 
    int dim = Nbr_lignes;
     
////////////////////////////////////////////
// Déclaration d'un tableau dynamique 1D //
//////////////////////////////////////////    
   int *tab = new int [dim];
//////////////////////////////////////////
   
//////////////////////////////////
// Initialisation d'un tableau //
////////////////////////////////
    for(unsigned int indice = 0; indice < dim; indice++)
    {
        tab[indice] = 0;
    }
////////////////////////////////
 
///////////////////////////////////////////////////////////////
// Saisir les valeurs dans le tableau à partir d'un fichier //
/////////////////////////////////////////////////////////////
   for(int i = 0; i < dim ; i++)
 {
  f_entree >> tab[i];
 }
/////////////////////////////////////////////////////////////
    f_entree.close();
 
    get_min(tab, dim);
     
    system("PAUSE" );
    return EXIT_SUCCESS;    
}

Reply

Marsh Posté le 15-02-2008 à 21:26:11   

Reply

Marsh Posté le 15-02-2008 à 22:23:30    

faut te replacer au début du flux avec clear()/seekg(0)
 
sinon un vector<int> ça sera mieuxe.


Message édité par bjone le 15-02-2008 à 22:25:18
Reply

Marsh Posté le 16-02-2008 à 11:57:53    

Merci bjone.
Je vais étudier ta piste sur clear()/seekg(0). Cpdt je ne comprends pas pourquoi ce code ne fonctionne pas car dans un autre programme j'ai utilisé cette même démarche et j'ai réussi à remplir mon tab. Mais dans celui ci non.  
Sinon en effet l'utilisation de vector<> serait mieux mais par la suite je voudrais utiliser un tableau à 2D ! Puis je donc utiliser vector<> pour constituer un tableau à 2d par exemple ? Si oui comment sera la syntaxe ? Merci
Bon samedi

Reply

Marsh Posté le 16-02-2008 à 12:10:17    

Ok cela a l'air de fonctionner lol.
J'ai donc rajouté ces deux lignes avant la boucle qui remplit mon tableau à partir du fichier:
    f_entree.clear();
    f_entree.seekg(0, ios::beg);
Alors maintenant, j'aimerai bien que l'on m'explique ces deux lignes, chaque terme de ces deux lignes.
Et aussi obtenir une réponse concernant donc la possibilité de construire un tableau à 2D avec vector<> (connaitre la syntaxe afin d'y parvenir).
Je vous en remercie.

Reply

Marsh Posté le 16-02-2008 à 12:34:37    

vector c'est moche pour les tableaux multi-dim. boost::multi_array est plus approprié.

Reply

Marsh Posté le 16-02-2008 à 18:43:50    

Ok très bien. Je ne connais absolument pas boost::multi_array. Je vais faire quelques recherches dessus. Merci bien. et pour f_entree.clear();
    f_entree.seekg(0, ios::beg); pourriez vous m'expliquer le rôle de chaque terme afin que je puisse comprendre. Merci
Bonne soirée.

Reply

Marsh Posté le 16-02-2008 à 19:18:42    

et bien tu as un fichier texte ayant un (seul) entier par ligne (enfin j'espère sinon sprotch).
 
si tu comptes toutes les lignes jusqu'à la fin du fichier, ta deuxième boucle qui récupère entier par entier, sera déjà à la fin du fichier et n'aura rien à lire.
 
donc le clear() et là pour réinitialiser l'état du flux
seekg() est là pour te repositionner au début du flux. (ça échoue si le flux est en état d'erreur)
 
accessoirement, ton truc peut être bancal, car si tu as plusieurs chaines de texte représentant un entier par ligne, il y aura un nombre d'itérations différentes entre la passe de comptage de ligne et la passe de récupération des entiers, entrainant un dépassement de l'espace alloué.

Reply

Marsh Posté le 16-02-2008 à 20:47:25    

Merci beaucoup pour tes explications. Ils m'ont permis d'y voir plus clair.
A priori pour l'instant tout fonctionne correctement.
Par la suite, j'aurais certainement encore des questions... Je me ferai un plaisir de vous les poser sur ce forum qui est très réactif.
Merci et bonne soirée.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed