traitement dans un fichier texte

traitement dans un fichier texte - C++ - Programmation

Marsh Posté le 20-04-2007 à 19:34:58    

Bonjour,
 
J'utilise un logiciel qui me donne des informations dans un fichier de type texte sous la forme : info1,info2,info3
Les virgules servent de séparateur
Je voudrais récupérer info2 et info3 qui sont des valeurs, les transformer en valeurs numériques puis les mettre en 2 colonnes dans ce fichier (ou dans un nouveau en .txt)
 
info2 et info3 sont des valeurs décimales avec un "." il faudrait aussi que ce "." soit tranformé en ","
 
Est-ce que vous pouvez m'aider ??
 
Merci d'avance

Reply

Marsh Posté le 20-04-2007 à 19:34:58   

Reply

Marsh Posté le 20-04-2007 à 19:37:08    

ouvre ton fichier avec un std::iostream, lis chaque ligne en boucle, ensuite utilise boost::tokenizer pr découper ta ligne en token séparé par des virgules et stocke les dnas un std::vector :)

Reply

Marsh Posté le 20-04-2007 à 19:38:29    

heu est-ce que tu peux m'expliquer avec un peu plus de détails car je suis pas un pro en langage C

Reply

Marsh Posté le 20-04-2007 à 19:41:28    

Reply

Marsh Posté le 20-04-2007 à 19:42:36    

euh C++ pardon

Reply

Marsh Posté le 20-04-2007 à 19:43:48    

comment tu fais pour lire chauqe ligne tu utilises scanf ?

Reply

Marsh Posté le 20-04-2007 à 19:53:23    

getline ;)

 

Pour la lecture de ficheir texte, fais une recherche, Taz a débattu de ca 100000 fois deja :)


Message édité par Joel F le 20-04-2007 à 19:53:34
Reply

Marsh Posté le 20-04-2007 à 20:37:34    

En fait quelqu'un pourrait m'aider à démarrer car là je vois pas du tout comment faire : mes capacités en c++ sont très limités...

Reply

Marsh Posté le 22-04-2007 à 15:13:01    

J'ai commené ça avec une petite aide sur le net :
#include <stdio.h>
 
/* retourne le nombre de lignes d'un fichier texte deja ouvert */
int get_nb_lines(FILE* fp)
{
  unsigned int nb = 0;
   
  while (fgets(fp) != NULL) {
    nb++;
  }
 
  return nb;
}
 
/* recupere les valeurs dans v1 et v2 (passage par reference) */
void get_values(char* ligne, float *v1, float *v2)
{
   char* tmp:
   char* result;
    /* strtok modifie son premier argument,  
        on travaille donc sur une variable temporaire */
   strcpy(tmp, ligne);
 
   result = strtok(tmp, "\t, " );
   if(result != NULL) {
     sscanf(result, "%f", v1);
     
     result = strtok(NULL, "\t " );
     if(result != NULL) {
        sscanf(result, "%f", v2);
     }
   }  
}
 
 
int main(int argc, char* argv[])
{
  FILE* fp = NULL;
  unsigned int nb_lines = 0;
  float *value1 = NULL,
          *value2 = NULL;
  int i = 0;
  char line[256] = "";
   
   
  fp = fopen("test.dat", "r" );
  if (fp == NULL) return -1;
 
  nb_lines = get_nb_lines(fp);
 
  value1 = malloc(nb_lines * sizeof *value1);
  value2 = malloc(nb_lines * sizeof *value2);
 
  while((fgets(ligne, 256, fp) != NULL)  
          && (i<nb_lines)) {
    get_values(ligne, &(value1[i]), &(value2[i]));
    i++;
  }  
 
  /* et bien sur on libere la memoire */
  free(value1);
  value1 = NULL;
  free(value2);
  value2 = NULL;
  fclose(fp);
  fp = NULL;
 
  return  0;
}
 
 
 
 
Qu'est-ce que vous en pensez ?

Reply

Marsh Posté le 22-04-2007 à 15:15:37    

c'est du C ça, pas du C++

Reply

Marsh Posté le 22-04-2007 à 15:15:37   

Reply

Marsh Posté le 24-04-2007 à 13:34:29    

J'ai retenu que pour découper une chaîne en fonction d'un séparateur (dans mon cas une virgule), je peux procéder de la manière suivante :
 
#include <sstream>
#include <string>
#include <iostream>
 
using namespace std;
 
int main()
 
{
istringstream iss("mot1,mot2" );
string mot;
while(std::getline(iss,mot,','))
                      {
                       cout<<mot<<'\n'
                      }
}
 
 
Néanmoins cela m'oblige à écrire la ligne que je veux séparer.
Dans mon cas j'ai plus d'une centaine de lignes de la forme mot1,mot2,mot3
Après j'aimerais mettre ces données en 3 colonnes : mot1 mot2 et mot3
 
Je n'arrive pas à comprendre comment il faut faire avec tokenizer...

Reply

Sujets relatifs:

Leave a Replay

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