C++ comment travailler sur des fichiers .txt (débutant) - C++ - Programmation
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 ...
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]); |
est-ce pour avoir la possibilité d'intervertir les colonnes dans le fichier .txt ?
Marsh Posté le 18-05-2006 à 10:08:04
Bonjour à tous et à toutes,
Je débute en C++. Autodidacte, jai trouvé des tutos sur le Net avec lesquels jai bien compris quelques principes de base. Mais lorsque jai essayé dexé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 lindustrie, 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 quil 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
jobtiens 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 na pas dimportance)
1ère colonne : sexe (F ou M)
2ème colonne : age de la personne
3ème colonne : lieu dhabitation (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 lagriculture dans la région de Lyon, je suppose quil faut construire des tableaux je ne suis pas trop à laise avec ce procédé .
Jai 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" ...
Je nobtiens pas de résultat « cannot convert parameter 5 from 'char [20]' to 'int []' «
Il nest peut-être pas nécessaire de faire des tableaux, des boucles de recherches sont peuvent elles convenir ???
y aurait-il quelquun de sympa pour me sortir de ce mauvais pas ?
merci d'avance
albert