Bonjour,

Je suis débutant en C++ et je suis entrain d'ébaucher un programme qui se comporte de la manière suivante :

-D'un côté, il y a des fichiers textes qui contiennent des listes de mots : fichiers de vocabulaire.

-De l'autre côté, il y a des fichiers qui contiennent des textes : fichiers que l'on va comparer avec les fichiers de vocabulaires.


J'ai plusieurs fonctions,

1: une qui permet de transformer les fichiers textes en vector <string>,

cette dernière fait appel à une autre qui s'occupe de mettre ce texte en minuscule :

a -La fonction textToList:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 vector<string> textToList(ifstream& txt, string ligne){
 
                vector<string> vliste;
 
 
                while(! txt.eof()){
                    txt >> ligne;
                    toLower(ligne);
                    vliste.push_back(ligne);
                }
 
         return vliste;
   }
b-La fonction ToLower:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
void toLower(basic_string<char>& s) {
 
                for (basic_string<char>::iterator p = s.begin(); p != s.end(); ++p) {
 
                    *p = tolower(*p);
                }
 
           }

2: Et enfin, une dernière qui, elle,

me permet de rechercher dans le texte les mots de vocabulaire,

et,

si ces derniers sont présents, de les remplacer par le nom du fichier (dans lequel a été trouvé le mot de vocabulaire).

a- La fonction searcher:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
vector<string> searcher(vector<string> voc, vector<string> txt, string name){
 
                for(int i = 0; i < txt.size(); i++){
 
                        for(int j=0; j < voc.size(); j++){
                                if(voc[j] == txt[i]){
                                    txt[i] = name;
                                }
                        }
                    }
 
                return txt;
            }
dans laquelle: voc est la liste de vocabulaire, txt est le texte, name est le nom du fichier duquel provient la liste de vocabulaire.



Je rencontre un résultat inattendu et cela à cause d'une erreur que je ne comprends pas:


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
 
int main()
{
 
    vector <string> filenames;
    string ligne;
    vector<string> tableau;
 
    vector<string> finale;
 
    ifstream liste("liste.txt");
 
    ifstream txtFile("texts.txt");
    vector<string> texte;
 
    if(liste){
 
            // Text to list transforme le fichier liste en vecteur
 
        filenames = textToList(liste, ligne);
        texte = textToList(txtFile, ligne);
 
                // Premier test:
            cout << "Premier test :" << endl;
 
                // Ecrit les noms des fichiers
            for(int k = 0; k < filenames.size() - 1; k++){
 
                cout << filenames[k] << endl;
            }
 
                //Deuxième test
            cout << endl << endl << "deuxieme test :" << endl << endl;
 
 
                //ouvre les fichiers de vocabulaire de la liste un à un
            for(int i = 0; i < filenames.size()-1; i++){
 
                    ifstream file(filenames[i].c_str());
 
                    cout << "Nom du fichier : " << filenames[i] << endl << endl;
 
 
                        //Text to list, transforme chaque fichier de vocabulaire en un même vecteur
                    tableau = textToList(file, ligne);
                    cout << "Mot original : " << tableau[i] << endl;
 
 
                    finale = searcher(tableau, texte, filenames[i]);
                    cout << "Mot Final : " << finale[i] << endl;
 
                    cout << "Nom du fichier maintenant : " << filenames[i] << endl;
                    tableau.clear();
 
 
 
 
 
 
            }
 
 
    }
 
    else{
 
        cout << "ERROR:2" << endl;
    }
 
 
 
                for(int j = 0; j < finale.size()-1; j++){
 
                            cout << finale[j] << endl;
                    }
 
 
    return 0;
}
Comme on le voit, "filenames" reçoit les noms de fichier (stockés dans un fichier "liste.txt")

ces noms de fichiers sont ensuite utilisés par le flux "file" dans une boucle for:

ifstream file(filenames[i].c_str());



"Tableau" reçoit le vocabulaire contenu dans ce fichier, il est une liste de vocabulaire, qui est censée se remplir

puis se vider à chaque nouveau fichier ouvert par "file".



Ensuite, le texte dans lequel on chercher ses mots est stocké dans "texte", et le résultat dirigé vers "finale".

Donc, le résultat de "finale" devrait être le texte initial qui, lorsqu'il comporte un mot de ces fichiers de vocabulaire,

est remplacé par l'expression contenue dans filenames[i].


Mais cela ne fonctionne pas :



Dans le fichier liste.txt :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
com.txt test.txt tt.txt
Dans le fichier com.txt:
test.txt:
tt.txt:



Dans le fichier texts.txt (le texte dans lequel on recherche):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
bonjour salut alors comment ça va bonjour salut hello comment ça va mon gars bonjour mon vieux bonjour les fraises patates douces c'est cool


(quand-il s'agit de choisir des exemples pour faire des tests, je ne connais pas vraiment de carences en inspiration.)



Et, je reçois ce résultat :


Nom : test2.png
Affichages : 129
Taille : 1,5 Ko

Le système que j'emploie ne semble prendre compte que d'un seul fichier.



(je m'excuse de ce post un peu long)



Sauriez-vous, avec votre regard neuf et savant, m'éclairer sur ce problème ?

Je vous remercie de votre patience, et j'espère que ce n'est pas trop confus.

Merci beaucoup.