s21 | Bonjour,
Je vous explique mon problème :
J’ai un fichier texte de 60000 lignes.
Chaque ligne correspond à un élément.
Chaque élément appartient à une famille.
Il y a environ 60 familles. Chaque élément peut prendre un des 4 paramètres suivants : parametre1, parametre2, parametre3, parametre4. Il faut que le programme en C++ permette de dénombrer le nombre de parametre1, parametre2, parametre3, parametre4 pour chaque famille. Dans le fichier texte, le nom de la famille est le 2ème champ de chaque ligne. Le type de parametre (1,2,3,4) est le dernier champ. Chaque champ est séparé par une tabulation. Il peut y avoir des espaces entre les mots d’un meme champ.
Exemple d’une partie du fichier :
000124 famille1 inutile inuti le inutile parametre1
000125 famille1 inutile inu tile inutile parametre2
000126 famille1 inutile inutile inutile parametre2
000130 famille2 inutile inutile inutile parametre3
000134 famille2 i n utile inutile inutile parametre1
000138 famille3 inutile in utile inutile parametre4
000160 famille3 inutile inut ile inutile parametre2
000181 famille3 inutile inut ile inutile parametre3
voici mon code :
Code :
- #include <iostream>
- #include <fstream>
- #include <string>
- #include <vector>
- using namespace std;
- class maclasse
- {
- public:
- vector<string> identifiant;
- vector<int> p1;
- vector<int> p2;
- vector<int> p3;
- vector<int> p4;
- int indice;
- enum type {error=-1, P1=0, P2, P3, P4};
- maclasse ();
- ~maclasse();
- void ajouter (string& nom, int type);
- int determinertype (string& chaine);
- void analysedufichier (ifstream& lefichier, maclasse classe, string& buffer);
- void print ();
- };
- maclasse::maclasse()
- {
- indice=0;
- identifiant.resize(255);
- p1.resize(255);
- p2.resize(255);
- p3.resize(255);
- p4.resize(255);
- }
- maclasse::~maclasse(){}
- void maclasse::ajouter (string& nom, int type)
- {
- if (identifiant[indice]!=nom)
- {
- indice ++;
- identifiant [indice] = nom;
- }
- switch (type)
- {
- case P1:
- p1 [indice]++;
- break;
- case P2:
- p2 [indice]++;
- break;
- case P3:
- p3 [indice]++;
- break;
- case P4:
- p4 [indice]++;
- break;
- }
- }
- void maclasse::print()
- { cout<<”la boucle for ne fonctionne pas”<<endl;
- for (int i=0; i <indice; i++)
- {
- cout << "nom : "<< identifiant [indice] << endl;
- cout << "nombre de p1: " << p1 [indice] << endl;
- cout << "nombre de p2: " << p2 [indice] << endl;
- cout << "nombre de p3: " << p3 [indice] << endl;
- cout << "nombre de p4: " << p4 [indice] << endl;
- }
- }
- int maclasse::determinertype (string& chaine)
- {
- if (chaine=="parametre1" ) return P1;
- else if (chaine=="parametre2" ) return P2;
- else if (chaine=="parametre3" ) return P3;
- else if (chaine=="parametre4" ) return P4;
- else return -1;
- }
- void maclasse::analysedufichier (ifstream& lefichier, maclasse classe, string& buffer)
- {
- lefichier>>buffer;
- }
- int main ()
- {
- ifstream lefichier ("fichier.txt" );
- if (!lefichier) {
- cerr << "Ne peut ouvrir le fichier..." << endl;
- return EXIT_FAILURE;
- }
- maclasse classe;
- string buffer;
- string nom;
- int type;
- while (lefichier)
- {classe. analysedufichier (lefichier,classe,buffer);
- classe. determinertype (buffer) ;
- classe.ajouter (nom, type) ;
- }
-
- classe.print();
- return EXIT_SUCCESS;
- }
|
a la compilation , il n’y a pas d’erreur. Mais je n’obtiens pas ce que je veux à l’execution. Le programme ne rentre pas dans la boucle for.
Par ailleurs, dans un autre essai pour ce meme programme, sans la boucle for, en n’utilisant pas la fonction ajouter, ni enum, et en mettant directement if (chaine=="parametre1" ) p1 ++; alors j’obtiens bien à l’execution :
nom :
nombre de p1 : 2
nombre de p2 : 3
nombre de p3 : 3
nombre de p4 : 1
donc le nom de la famille ne s’affiche jamais, le programme fait la somme de chaque parametre, toutes familles confondues. Et pour le dernier parametre du fichier (que ce soit 1,2,3 ou 4), son nombre est toujours augmenté de 1 par rapport à la réalité dans le fichier. (dans l'exemple, parametre3 est le dernier du fichier. le programme en compte 3 alors qu'il n'y en a que 2.)
Voilà, ça fait beaucoup de problemes, je sais. Je débute en C++, je n’ai jamais fait de C. On m’a parlé des maps qui seraient utiles pour identifier le nom de la famille mais je ne sais pas comment ça marche.
Donc si vous pouviez m’aider à faire fonctionner correctement ce programme, je vous remercie par avance.
|