Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1152 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1651005
Boulou
Wingfoil
Posté le 29-11-2007 à 18:06:28  profilanswer
 

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. }

mood
Publicité
Posté le 29-11-2007 à 18:06:28  profilanswer
 

n°1651369
breizhbugs
Posté le 30-11-2007 à 15:14:21  profilanswer
 

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!

n°1651646
Boulou
Wingfoil
Posté le 01-12-2007 à 10:53:32  profilanswer
 

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 :)

n°1651650
Boulou
Wingfoil
Posté le 01-12-2007 à 11:13:45  profilanswer
 

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. }

n°1651712
Boulou
Wingfoil
Posté le 01-12-2007 à 19:12:32  profilanswer
 

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. }

n°1651794
breizhbugs
Posté le 02-12-2007 à 12:47:34  profilanswer
 

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
n°1651813
Boulou
Wingfoil
Posté le 02-12-2007 à 14:42:38  profilanswer
 

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.   }


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
[BATCH] Nombre de fichier ??fileupload.servlet.ServletFileUpload récuperer chemin du fichier
[RESOLU]Enregistrement classe dans fichierLancer téléchargement d'un fichier à la base du serveur.
sql et fichier ".dat"[Flash/AS] lire les musiques en boucle
Avoir un fichier de langues pour un site statiqueInsertion fichier dans base de donnée
Changer la valeur d'un cookie[FORTRAN] Problème lecture fichier
Plus de sujets relatifs à : lire un fichier txt et sauvegarder certaine valeur dans un tableau int


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR