lire un fichier txt et sauvegarder certaine valeur dans un tableau int

lire un fichier txt et sauvegarder certaine valeur dans un tableau int - C++ - Programmation

Marsh Posté le 29-11-2007 à 18:06:28    

Bonjour à tous,
 
Je continue à découvrir le c++ et j'essai de récupérer dans un tableau d'entier un fichier qui ressemble à ca :
[DEBUT]
|0|0|1|32|0|33
|67|0|1|45|0|113
|24|0|2|0|1|27
 
Dans ce fichier je veux récupérer toutes les valeurs entières sauf celles en bout de ligne : je dois récupérer: 0 0 1 32 0 67 0 1 45 0 24 0 2 0 1
(j'espère je suis claire !:p)
 Pour celà j'ai créé la fonction suivante :

Code :
  1. void monprog::readFromFile(char* filename){
  2.         std::ifstream fichier( filename );
  3. string data = "";
  4. string::iterator cii;
  5.     if ( fichier ) // ce test échoue si le fichier n'est pas ouvert
  6.     {
  7.         std::stringstream buffer; // variable contenant l'intégralité du fichier
  8.         // copier l'intégralité du fichier dans le buffer
  9.         buffer << fichier.rdbuf();
  10.        
  11.         fichier.close();
  12.         // manipulations du buffer...
  13.         //std::cout << "Taille du buffer : " << buffer.str().size() << '\n';
  14.  data = buffer.str();
  15.  data.find("|" );
  16.                //comment parcourir la suite ??
  17.     }
  18. }

Reply

Marsh Posté le 29-11-2007 à 18:06:28   

Reply

Marsh Posté le 30-11-2007 à 15:14:21    

Bonjour,
ben c'est simple : tu fais une boucle qui te mets l'entier dans un tableau en fonction d'un index et quand tu rencontres un '\n' au lieu d'un nombre, tu décrementes ton index pour ne pas prendre en compte le dernier numéro!

Reply

Marsh Posté le 01-12-2007 à 10:53:32    

breizhbugs a écrit :

Bonjour,
ben c'est simple : tu fais une boucle qui te mets l'entier dans un tableau en fonction d'un index et quand tu rencontres un '\n' au lieu d'un nombre, tu décrementes ton index pour ne pas prendre en compte le dernier numéro!


oui oui sur le principe je vois bien, mais c'est la syntaxe c++ que je maitrise pas trop... :)
comment lui dire de ne pas tenir compte de | et comment savoir qu'un nombre est à 1 2 ou 3 chiffres ?
 
merci pour ta réponse :)

Reply

Marsh Posté le 01-12-2007 à 11:13:45    

qqch comme ca ?

Code :
  1. for (data.getline()) //pour parcourir les ligne du fichier
  2. {
  3.   int j = 0;
  4.   data.getline()::iterator cii; //ca permet de mettre l'iterator au début de la 2 eme ligne ???
  5.   for (data.getline()::iterator cii; cii.begin(); cii.end()) // pour parcourir la ligne
  6.   {
  7.     cii >> tab[j] // qu'est ce que ca va faire avec le caractère | ??
  8.     j++
  9.   }
  10. }

Reply

Marsh Posté le 01-12-2007 à 19:12:32    

bon j'arrive à avancer de ligne en ligne et dans les lignes, par contre je n'arrive pas à récupérer les bonnes valeurs... :(

Code :
  1. void readFromFile(char* filename){
  2.  // le constructeur de ifstream permet d'ouvrir un fichier en lecture
  3.     std::ifstream fichier( filename );
  4. string s;
  5. int i = 0 ;
  6. int j = 0 ;
  7.     if ( fichier ) // ce test échoue si le fichier n'est pas ouvert
  8.     {
  9.         std::stringstream buffer; // variable contenant l'intégralité du fichier
  10.         // copier l'intégralité du fichier dans le buffer
  11.         buffer << fichier.rdbuf();
  12.         // nous n'avons plus besoin du fichier !
  13.         fichier.close();
  14.         // manipulations du buffer...
  15.         //std::cout << "Taille du buffer : " << buffer.str().size() << '\n';
  16.  getline(buffer,s);
  17.  while (!buffer.eof())
  18.  {
  19.   getline(buffer,s);
  20.   for(string::iterator iterateur = s.begin(); iterateur!=s.end(); iterateur++)
  21.   {
  22.    if ( *iterateur !='|')
  23.    {
  24.     *iterateur >> tab[i][j];
  25.    }
  26.   }
  27.  }
  28.     }
  29. }

Reply

Marsh Posté le 02-12-2007 à 12:47:34    

J'aurais bien aimé que quelqu'un prenne le relais car je suis pas a l'aise avec le c++ "pur" et les strings!
Personnellement je ferais un mini parser caracteres par caractere:

Code :
  1. void readFromFile(char* filename)
  2. {
  3. // le constructeur de ifstream permet d'ouvrir un fichier en lecture  
  4. std::ifstream fichier( filename );
  5. std::string s;
  6. int i = 0 ;
  7. int j = 0 ;
  8. char c;
  9.     if ( fichier ) // ce test échoue si le fichier n'est pas ouvert  
  10.     {
  11.  std::stringstream buffer; // variable contenant l'intégralité du fichier  
  12.         // copier l'intégralité du fichier dans le buffer  
  13.         buffer << fichier.rdbuf();
  14.         // nous n'avons plus besoin du fichier !  
  15.         fichier.close();
  16.         // manipulations du buffer...  
  17.         //std::cout << "Taille du buffer : " << buffer.str().size() << '\n';  
  18.  int nombre = 0;
  19.  bool dansnombre = false, derniernombre = false;
  20.  while (buffer.good())     // tant qu'on n'est pas a la fin du buffer
  21.  {
  22.   c = buffer.get();       // on extrait un caractere
  23.               // std::cout << c;
  24.   switch (c)
  25.   {
  26.    case '0': case '1': case '2': case '3': case '4':
  27.    case '5': case '6': case '7': case '8': case '9':
  28.                                                                 // on forme le nombre:
  29.     if (dansnombre == false)
  30.      nombre = 0;
  31.     nombre = 10*nombre + (c - '0');
  32.     std::cout << nombre << std::endl;
  33.     dansnombre = true;
  34.     derniernombre = false;
  35.     break;
  36.    case '|': //un nombre correct est suivi directement par '|' donc on l'affiche
  37.     if (dansnombre == true && derniernombre == false)
  38.     {
  39.      std::cout << "---->:" << nombre << std::endl;
  40.     }
  41.     dansnombre=false;
  42.     break;
  43.    case '\n':
  44.     derniernombre = true;
  45.     break;
  46.    default: //pour supprimer les espaces!
  47.     ;
  48.   }
  49.  }
  50.     }
  51. }


Les nombres qui sont précédé de "----->" sont a rangé dans ton tableau.
Le principe est qu'un nombre acceptable est suivi directement (avec ou sans espace) de "|" et ce sur la meme ligne


Message édité par breizhbugs le 02-12-2007 à 13:06:13
Reply

Marsh Posté le 02-12-2007 à 14:42:38    

merci,
en fait je me suis débrouillé avec boost ;)

Code :
  1. void readFromFile(char* filename){
  2.  // le constructeur de ifstream permet d'ouvrir un fichier en lecture
  3.     std::ifstream fichier( filename );
  4. string s;
  5. int i = 0 ;
  6. int prems = 1;
  7.     if ( fichier ) // ce test échoue si le fichier n'est pas ouvert
  8.     {
  9.         std::stringstream buffer; // variable contenant l'intégralité du fichier
  10.         // copier l'intégralité du fichier dans le buffer
  11.         buffer << fichier.rdbuf();
  12.         // nous n'avons plus besoin du fichier !
  13.         fichier.close();
  14.         // manipulations du buffer...
  15.         //std::cout << "Taille du buffer : " << buffer.str().size() << '\n';
  16.  getline(buffer,s);
  17.  while (!buffer.eof())
  18.  {
  19.   if(i < 1024)
  20.   {
  21.    getline(buffer,s);
  22.    int j = 0 ;
  23.    typedef boost::tokenizer<boost::char_separator<char> > my_tok;
  24.    // séparateur personnalisé
  25.     boost::char_separator<char> sep( "|" );
  26.    // construire le tokenizer personnalisé
  27.    my_tok tok( s, sep );
  28.    // itérer la séquence de tokens
  29.    for ( my_tok::const_iterator k = tok.begin(); k != tok.end(); ++k )
  30.    {
  31.      // afficher chaque token extrait
  32.     //std::cout << *k << '\n';
  33.     if (j != 1024)
  34.     {
  35.      tab[i][j] = boost::lexical_cast< int >( *k );
  36.      j++;
  37.     }
  38.     else
  39.     {}
  40.    }
  41.    i++;
  42.   }

Reply

Sujets relatifs:

Leave a Replay

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