C++ comment travailler sur des fichiers .txt (débutant)

C++ comment travailler sur des fichiers .txt (débutant) - C++ - Programmation

Marsh Posté le 18-05-2006 à 10:08:04    

Bonjour à tous et à toutes,
 
Je débute en C++. Autodidacte, j’ai trouvé des tutos sur le Net avec lesquels j’ai bien compris quelques principes de base. Mais lorsque j’ai essayé d’exécuter des codes en appelant des données contenues dans un fichier .txt je me suis senti bien seul…
 
Pour me résumer : je parviens à lire le fichier .txt dans la fenêtre DOS, mais je ne comprends pas le procédé qui permet de garder les données en mémoire pour ensuite les travailler (recherche du total des hommes de plus de 40 ans exerçant une activité dans l’industrie, par exemple)
 
Voici comment je procède :
Je crée un fichier .txt avec Microsoft Visual C++, comme indiqué dans le tuto  
http://www.up.univ-mrs.fr/wcpp/V2/ [...] c/TD07.pdf
Dans le Bloc-Notes, les données sont rangées en lignes et paraissent inexploitables ; il semble qu’il y a des caractères spéciaux qui marquent le retour à la ligne.  
Après lecture avec le code http://glinfrench.apinc.org/article.php3?id_article=69

Code :
  1. #include <fstream.h>
  2. void main()
  3. {
  4. // on déclare une nouvelle instance de la classe ifstream
  5. ifstream fichierAlire;
  6. // on ouvre le fichier statistiques.txt
  7. fichierAlire.open("statistiques.txt" );
  8. // on vérifie que l'ouverture s'est bien passée
  9. if(fichierAlire)
  10. {
  11. char c;
  12. // on lit tout le fichier
  13. while(!fichierAlire.eof())
  14. {
  15. // caractere par caractere
  16. c = fichierAlire.get();
  17. // on affiche le caractere lu
  18. cout<<c;
  19. }
  20. // on oublie pas de fermer le fichier
  21. fichierAlire.close();
  22. }
  23. else
  24. {
  25. // si l'ouverture n'a pas marché
  26. cout<<"Erreur"<<endl;
  27. }


 
j’obtiens des données sur 4 colonnes dans la fenêtre DOS => (ce qui me fait penser que la forme des données dans le Bloc-Notes n’a pas d’importance)

1ère colonne : sexe (F ou M)
2ème colonne : age de la personne
3ème colonne : lieu d’habitation (P=Paris, L = Lyon, M= Marseilles…)
4ème colonne : catégorie socio professionnelle (1 agriculteur, 2 industriel, 3 profession libérale…)


 
résultat obtenu dans la fenêtre DOS :

F       45      L       0
H       55      P       1
F       45      L       1
F       46      L       1
F       55      P       2
F       42      M      3
F       58      L       2
F       52      P       3
F       48      P       3
H       57      M      2
H       56      L       1
H       52      L       2
H       55      L       1
H       44      L       3
F       56      M      2
H       52      M      1
F       35      L       3
H       47      M      2
H       58      M      1
H       62      M      1
H       58      P       1
F       25      P       1
F       22      L       2
H       45      M      2
F       64      M      1
F       38      M      2
H       53      M      3
H       52      P      2
H       59      P      4
H       58      P      1
H       41      L      1
F       43      M      3
H       69      M      2
F       50      L       1
H       38      M      3
H       51      M      1
F       49      P       2
F       41      M      3
H       35      L       1
H       34      M      2
H       36      M      3
F       42      L       1
H       47      L       3
F       69      M      1
H       62      M      3
F       49      M      1
H       59      L       1
F       43      L       2
H       57      P       1
H       33      L       1
F       59      M      3
H       35      L       2
F       57      P       1
H       48      L       3
F       61      P       2
H       58      M      1
F       58      L       3
H       42      M      2
H       43      M      1
H       48      M      2
H       46      M      2
F       55      L       2
F       53      M      1
F       63      M      2
F       45      P       2
H       59      L       1
H       68      M      2
F       41      L       3
F       36      M      1
H       52     L        2


pour trouver des combinaisons du type combien de femmes de 40  à 50 ans travaillent dans l’agriculture dans la région de Lyon, je suppose qu’il faut construire des tableaux… je ne suis pas trop à l’aise avec ce procédé….
J’ai donc utilisé un exemple qui fonctionne avec un fichier .txt qui reprend la même forme que le fichier DOS
http://www.iro.umontreal.ca/~dift1 [...] pitre2.doc(5ème page, notée 32), avec toutefois une nuance sur le contenu des colonnes : la 3ème colonne (taille, déclarée double) doit être convertie en char.

/*
   Fichier : Version0.cpp  (sera amélioré : voir Version1.cpp)
*/
 
#include <iostream>  // pour cin, cout, ...  
#include <iomanip>   // pour les manipulateurs du formatage
#include <string>    // pour la gestion des chaînes de caractères
#include <fstream>   // pour les fichiers
using namespace std;
 
void  lire(char nomALire[], char sexe[], int num[], double taille[],  
            double poids[], int *p)
 
//je suppose que char nomALire[] est ajouté aux 4 autres tableaux ? pour avoir les données en mémoire ?
 
{  ifstream  aLire (nomALire, ios::in); // localiser et ouvrir pour la lecture
int n = 0 ; // initialiser le compteur
 // lire, remplir et compter
     while (aLire >> sexe[n] >> num[n] >> taille[n] >> poids[n] )
         n++;
 
  *p = n;
     aLire.close();    
}
 
void  afficher(char sexe[], int num[], double taille[], double poids[],  
          int nbPers, string message)
{  
 cout << "Contenu des tableaux " << message << ":" << endl << endl ;
 
    for (int i = 0; i < nbPers ; i++)
  cout << i << " )\t" <<  num[i]  
       << "\t\t" << taille[i]
    << "\t\t" << poids[i] << endl;
 cout << endl;
 
}
 
void permuter (int * p, int * r)
{
 int tempo = *p;
 *p = *r;
 *r = tempo;
}
 
void permuter (char * p, char * r)
{
 char tempo = *p;
 *p = *r;
 *r = tempo;
}
 
void permuter (double * p, double * r)
{
 double tempo = *p;
 *p = *r;
 *r = tempo;
}
 
 
void trier(char sexe[], int numero[], double taille[], double poids[],  
          int nbPers)
{  
 int i, j, indMin;
 
    for (i = 0; i < nbPers-1 ; i++)
 {   indMin = i;
  for (j = i+1; j < nbPers-1 ; j++)
      if ( numero[j] < numero[indMin] )
          indMin = j;
if (indMin != i)
  {  
   permuter(&numero[i], &numero[indMin]);
   permuter(&sexe[i], &sexe[indMin]);
   permuter(&taille[i], &taille[indMin]);
   permuter(&poids[i], &poids[indMin]);
  }
 }
 
}
 
int main()
{
 const int MAX_PERS = 20; //et si le nombre de données n'est pas constant ?  
            char   sexe[MAX_PERS];
 int    numero[MAX_PERS];
 double taille[MAX_PERS], poids[MAX_PERS];
 int    nbPers;
 
 // transmission du nombre de personnes via pointeur (style du C)
 lire("R:\\mesures.dta", sexe, numero, taille, poids, &nbPers);
 
 afficher(sexe, numero, taille, poids, nbPers, "apres la lecture" );
 
 trier(sexe, numero, taille, poids, nbPers);
 
 afficher(sexe, numero, taille, poids, nbPers, "apres le tri selon les numeros" );
 
 return 0;
}


 
je ne comprends pas trop les instructions "permuter" ...
 :pt1cable:  
 
Je n’obtiens pas de résultat « cannot convert parameter 5 from 'char [20]' to 'int []' «  
 
Il n’est peut-être pas nécessaire de faire des tableaux, des boucles de recherches sont peuvent elles convenir ???
 
 y aurait-il quelqu’un de sympa pour me sortir de ce mauvais pas ?
 
merci d'avance
 :jap:  
 
albert
 
 

Reply

Marsh Posté le 18-05-2006 à 10:08:04   

Reply

Marsh Posté le 18-05-2006 à 13:19:19    

bon en gros :  
Pour les tableaux : std::vector, les chaines de caractéres c'est std:string.
Pour les tri, y a std::sort ...


Message édité par Joel F le 18-05-2006 à 13:23:04
Reply

Marsh Posté le 18-05-2006 à 13:30:38    

salut Joel F,
tu connais un tuto ciblé sur le sujet?
 :??:

Reply

Marsh Posté le 18-05-2006 à 13:45:43    

Reply

Marsh Posté le 18-05-2006 à 14:47:47    

merci _darkalt3_
 
de la lecture en perspective
 
 
je peux avoir une explication de la raison pour laquelle on trouve des permutations des déclarations ??:
void permuter  

permuter(&numero[i], &numero[indMin]);  
   permuter(&sexe[i], &sexe[indMin]);  
   permuter(&taille[i], &taille[indMin]);  
   permuter(&poids[i], &poids[indMin]);


est-ce pour avoir la possibilité d'intervertir les colonnes dans le fichier .txt ?

Reply

Sujets relatifs:

Leave a Replay

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