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

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1369384
albert9552​0
Posté le 18-05-2006 à 10:08:04  profilanswer
 

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
 
 

mood
Publicité
Posté le 18-05-2006 à 10:08:04  profilanswer
 

n°1369573
Joel F
Real men use unique_ptr
Posté le 18-05-2006 à 13:19:19  profilanswer
 

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
n°1369589
albert95
Posté le 18-05-2006 à 13:30:38  profilanswer
 

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

n°1369606
_darkalt3_
Proctopathe
Posté le 18-05-2006 à 13:45:43  profilanswer
 
n°1369702
albert9552​0
Posté le 18-05-2006 à 14:47:47  profilanswer
 

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 ?


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

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

 

Sujets relatifs
Une erreur de débutantFusionner des fichiers texte et les envoyer dans une base SQL
[Résolu][Oracle Text] chargement de fichiers / index[DOS] concaténer fichiers sous DOS (sans le dernier caractere)
Batch pour transférer fichiers antérieurs à 2 joursfermeture d'un programme - MFC - debutant
Fichiers ".h"[VBA ACCESS] Créer une table à partir des noms de fichiers
[Perl] Débutant : Rechercher mot-clé et extraire paragraphe[debutant] Structure de mon fichier correcte ?
Plus de sujets relatifs à : C++ comment travailler sur des fichiers .txt (débutant)


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