2015-11-07 2 views
1

J'essaie d'obtenir la quantité d'occurrences dans un fichier de chaque mot dans un fichier séparé. Le code suivant doit produire le nombre d'occurrences de chaque mot dans sl en utilisant les mots de fl mais à la place, il sort pour chaque mot même s'il y a plusieurs instances. J'essaie de comprendre ce que le problème est et pourrait faire avec de l'aide. La fonction getNextWord() renvoie simplement le mot suivant dans le fichier.Comparaison de chaînes (C++)

while(fl.isWord()){ 
     int total = 0; 
     string temp1= fl.getNextWord(); 
     while(sl.isWord()){ 
      string temp2 = sl.getNextWord(); 
      if(temp1.compare(temp2)!=0) total ++; 
      //if(temp1 == temp2) total++; 

     } 
     cout << temp1 << " " << total << endl; 
} 

La fonction isWords() est dans une classe séparée:

bool ReadWords::isWord(){ 
    if(file.good()) 
     return !eoffound; 
    else 
     return eoffound; 

listes Exemplar:

contenu fl vaches kfc

sl contenu: vaches foutues vaches pommes de poulet pommes kfc aliments gras vaches

sortie:

kfc 0

vaches 0

sortie doit être:

kfc 1

vaches 3

edi ted partie:

string ReadWords::getNextWord(){ 
    file >> theWord; 
    return theWord; 
} 
+1

quel est le problème avec 'if (temp1 == temp2) total ++;' –

+0

@BhawinParkeria Je viens de le commenter car il produit le même résultat. compare() ou == produira le même résultat mais le problème est ailleurs: p – NewToCoding

+0

pourquoi ne pas utiliser .find() member function de la chaîne? C'est plus facile et cela produira le résultat que vous voulez. Parcourez l'autre en utilisant la méthode .find() pour chaque mot de la chaîne. http://www.cplusplus.com/reference/string/string/find/ – KostasRim

Répondre

1

En supposant que vos fonctions pour analyser les fichiers sont corrects, il y a un problème dans la logique de la mise en œuvre. Le problème est que, après avoir obtenu le premier mot de fl, vous cherchez tout le fichier sl, celui-ci atteint son eof, alors les recherches suivantes ne fonctionneront pas car sl est à eof.

Ce dont vous avez besoin est un moyen de seek sl à son début après avoir terminé avec chaque mot de fl.

while(fl.isWord()){ 
    /* seek sl to beginning; then do the rest */ 
    int total = 0; 
    string temp1= fl.getNextWord(); 
    while(sl.isWord()){ 
     string temp2 = sl.getNextWord(); 
     if(temp1 == temp2) total++; 
    } 
    cout << temp1 << " " << total << endl; 
} 

EDIT: si vous ne pouvez pas trouver un moyen de rechercher le fichier, charger tous ses mots en mémoire à l'aide vector<string>, en une seule passe, puis faire la recherche sur ce vecteur pour chaque mot de fl.

Ceci corrigera le logique de votre implémentation. CEPENDANT, ce n'est pas pour dire que c'est la meilleure et la meilleure mise en œuvre (pour éviter que les puristes ne me crient dessus: P).

+0

Voilà ce que je pensais pour le passé, qui sait qui longtemps, mais depuis le fichier ifstream est un membre privé d'une autre classe, j'ai du mal à essayer d'y accéder dans les boucles . Je pense que j'ai l'air confus car je ne peux pas décrire clairement le problème mais en avoir une image dans mon esprit. J'espère que quelqu'un comprend ce que je veux dire: p – NewToCoding

+0

@NewToCoding Vous devez trouver un moyen de rechercher le fichier. Sinon, votre implémentation ne fonctionnera jamais. –

+0

@NewToCoding sauf si vous chargez d'abord les mots de sl dans un tableau, en une seule fois. Voir mon EDIT. –