2013-04-07 2 views
0

est ici une partie de mon codechaîne dans un fichier texte contenant une chaîne en C++

string word; 
cin >> word; 
string keyword; 
while (file >> keyword && keyword != word){} 

Cette recherche un mot dans un fichier et si elle trouve ce mot (mot clé), il commence une chaîne à partir de là plus tard. Cela fonctionne parfaitement pour le moment. Mon problème est que lorsque la ligne est

"Julia","2 Om.","KA","1 Om. 4:2" 

si j'entre mot Julia Je ne peux pas le trouver et l'utiliser pour mes besoins (juste FYI je le compter). Il fonctionne si je recherche pour « Julia », "2 puisque c'est là où l'espace vient.

Je voudrais savoir comment puis-je changer de ligne

while (file >> keyword && keyword != word){} 

donc je peux voir quand le texte/chaîne CONTIENT cette chaîne puisqu'elle ne la trouve et ne l'accepte que si j'entre la chaîne WHOLE à la perfection

EDIT: Aussi ce que j'ai trouvé jusqu'ici est seulement strstr, strtok, strcmp. avec

+0

Donc, si vous entrez «Julia», vous voulez que ça s'arrête avec 'keyword' comme« Julia »,« 2'? »Ou voulez-vous que ça s'arrête avec' keyword' comme «Julia» '? –

+0

No , si j'entre Julia je veux qu'il trouve Julia - pour le moment il ne trouve pas, il est capable de trouver "Julia", "2 puisque c'est la partie entière mais je n'en ai pas besoin. –

Répondre

1

le problème est que vous extraire des chaînes, qui, par défaut w Mal extraire jusqu'à l'espace suivant. Donc, à la première itération, keyword est "Julia","2. Si vous voulez extraire tout séparé par des virgules, je suggère d'utiliser std::getline avec , comme délimiteur:

while (std::getline(file, keyword, ',')) 

Cela regardera à travers toutes les chaînes entre guillemets. Maintenant, vous pouvez utiliser std::string::find pour déterminer si l'entrée word se trouve dans cette chaîne entre guillemets:

while (std::getline(file, keyword, ',') && 
     keyword.find(word) == std::string::npos) 

Maintenant, cette boucle permet de faire défiler chaque chaîne entre guillemets jusqu'à ce qu'il arrive à celui qui contient word.

+0

Hmmm, j'essaie de le faire fonctionner en ce moment. Aussi 2. Om n'est pas censé être un mot-clé, si je vous ai compris à partir de votre dernier commentaire. Mon entrée est Julia et ma sortie est en fait int cnt = 1+ count (istream_iterator (fichier), istream_iterator (), mot); cout << word << "apparaît dans le texte" << cnt << "times"; comme vous pouvez le voir, j'écris Julia et je veux juste le compte de Julia, mais elle ne trouve pas Julia si elle est entourée d'autres personnages. –

+0

Donc, je ne veux pas que la boucle se termine là car j'ai besoin de compter toutes les Julia dans un fichier et il y a beaucoup de ces noms dans mon fichier. –

+0

Merci pour votre aide! Maintenant, je suis capable de trouver Julia dans ce fichier mais elle ne compte qu'une seule fois et s'arrête, dans la ligne où le nom est trouvé pour la première fois. Comme il y a 10 lignes de Julia dans ce fichier (20 000 lignes, tous les noms différents), j'ai encore besoin de faire une boucle, une idée de comment je pourrais faire ça? –

3

Vous pouvez utiliser des méthodes de std :: string comme find.

#include <string> 
#include <iostream> 
// ... 
std::string keyword; 
std::string word; 

getline(file, keyword); 
do 
{ 
    std::cin >> word; 
} 
while (keyword.find(word) == std::string::npos); 
+0

Bien que ce soit ce que je pensais qu'ils décrivaient au début, je ne pense pas que ce soit ce qu'ils veulent. Ils ne veulent pas que "Julia", "2" corresponde à "Julia" –

+0

@sftrabbit Il veut trouver Julia même si elle est entourée d'autres personnages, ce qui permet de retrouver Julia même si elle est entourée d'autres personnages – Patashu

+0

Oui , c'est ce que je voulais dire Patashu Désolé pour la confusion et merci pour vos réponses :) Je vais essayer de le faire fonctionner maintenant –

0

Utilisez cette méthode de istream pour obtenir une ligne entière au lieu d'un seul « mot »:

http://www.cplusplus.com/reference/istream/istream/getline/

Ensuite, utilisez strstr, pour trouver l'emplacement d'une chaîne (comme Julia) dans une chaîne (la ligne du fichier):

http://www.cplusplus.com/reference/cstring/strstr/

+0

Merci, strstr s'adapte plus avec printf cependant. Je vais essayer d'utiliser la méthode std :: string find. –

+0

@Jack Longen Je préfère aussi la réponse de Julien – Patashu

Questions connexes