[Résolu] porté d'une variable vector

porté d'une variable vector [Résolu] - C++ - Programmation

Marsh Posté le 16-04-2008 à 12:07:35    

Bonjour,
 
je dois remplir un tableau à deux dimension de type :

Code :
  1. vector < vector <char*> > monTableau;


 
pour se faire j'utilise le code suivant :

Code :
  1. // while line != data  or EOF
  2.     while ( (!monFichier.eof()) ) { // keep reading until end-of-file or line DATA
  3.     // reset line vector
  4.     ligne.clear();
  5.      // ligneLue read line
  6.         monFichier.getline(ligneLue,2000);
  7.    // split using ','
  8.    ligneDecoupe = strtok(ligneLue,"," );
  9.    while(ligneDecoupe != NULL){
  10.   // copy to the ligne vector
  11.   ligne.push_back(ligneDecoupe);
  12.   // split using ','
  13.   ligneDecoupe = strtok(NULL,"," );
  14.     }
  15.     // add the line to the tablea
  16.     monTableau.push_back(ligne);
  17.         cout<<monTableau[i][0]<<endl;
  18.     // number of line
  19.     i++;
  20.    
  21.        
  22.     }


 
le tableau est bien rempli et il m'affiche correctement à l'écran le premier élément de chaque ligne
mais dés que je sors de la boucle et que je fais un  

Code :
  1. cout<<monTableau[0][0]<<endl;


il m'affiche une ligne vide.
quand je demande la taille via  

Code :
  1. monTableau.size();


il me retourne la bonne taille (3415 éléments)
 
de même la taille d'une ligne

Code :
  1. cout<<monTableau[0].size()<<endl;


retourne la bonne taille (5 éléments).
 
donc la question est pourquoi je n'ai plus accès à mes élements une fois sortie  de ma boucle (je pencherai pour le ligne.clear() mais je ne vois pas comment ne pas l'utiliser :cry:)


Message édité par lordankou le 16-04-2008 à 13:25:17
Reply

Marsh Posté le 16-04-2008 à 12:07:35   

Reply

Marsh Posté le 16-04-2008 à 12:23:26    

while ( (!monFichier.eof()) )  
 
ne fait pas du tout ce que tu crois.
 
dégage tous ses char*, utilise des string
 
while (getline(fichier, ligne)) {
  // faire semblant de travailler avec ligne
}

Reply

Marsh Posté le 16-04-2008 à 12:24:10    

et surtout strtok utilise une copie interne, c'est ça qui fait n'importe quoi avec tes char*

Reply

Marsh Posté le 16-04-2008 à 12:50:46    

j'ai éliminé strtok pour voir si ça venait de là

 
Code :
  1. while ( (!monFichier.eof()) ) { // keep reading until end-of-file     
  2.      // reset line vector
  3.      ligne.clear();
  4.      // ligneLue read line
  5.         monFichier.getline(ligneLue,2000);
  6.      // copy to the ligne vector
  7.      ligne.push_back(ligneLue);
  8.      // add the line to the tablea
  9.      monTableau.push_back(ligne);
  10.      cout <<monTableau[0][0]<<endl;
  11. }
  12. cout <<monTableau[0][0]<<endl;
 

donc le premier cout dans la boucle fonctionne mais de manière étrange.
en effet monTableau[0][0] affiche toujours le dernier élément rajouté et non toujours le premier.
donc monTableau.push_back(ligne) ne va pas rajouter à la fin du tableau mais à la première place
et une fois sortie du tableau monTableau[0][0] est vide (mais aucune erreur n'apparaît).

 

le while ( (!monFichier.eof()) ) parcours bien tout le fichier (j'ai affiché chaque ligne lue et il n'y a pas de problème).


Message édité par lordankou le 16-04-2008 à 12:52:42
Reply

Marsh Posté le 16-04-2008 à 13:24:54    

en effet l'utilisation de string à la place du char a fait des merveilles et tout marche.
 

Code :
  1. // create data structure in memory
  2. vector < vector <string> > creerTableData(char* nomFichier){
  3. // --------------
  4. // local variable       
  5. // --------------    
  6. vector < vector <string> > monTableau; // table of DATA  
  7. vector <string> ligne; // line of the table
  8.     ifstream monFichier; // indata is like cin
  9. istringstream ligneLue; // to read a line
  10. string maLigne;
  11. // open file in read only mode
  12.     monFichier.open(nomFichier); // opens the file
  13.     if(!monFichier) { // file couldn't be opened
  14.       cerr << "Error: file could not be opened" << endl;
  15.       exit(1);
  16.     }
  17. // while line != EOF
  18.     while ( getline(monFichier,maLigne) ) {
  19.     // reset line vector
  20.     ligne.clear();
  21.     // translate into istringstream
  22.     istringstream ligneLue(maLigne);
  23.     // result of split
  24.  string mot;
  25.  // split using ','
  26.  while ( std::getline( ligneLue, mot, ',' ) )
  27.     {
  28.         // copy to the ligne vector
  29.   ligne.push_back(mot);
  30.     }
  31.     // add the line to the tablea
  32.     monTableau.push_back(ligne);    
  33.    
  34.     }
  35. // close the file
  36.    monFichier.close();
  37. // return the vector*vector
  38. return monTableau;
  39. }

Reply

Sujets relatifs:

Leave a Replay

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