2012-10-15 4 views
0

Possible en double:
How do I tokenize a string in C++?Essayer de tokenizer une chaîne

Je possède ce fichier texte

q1 t q2 

q2 e q3 

q3 x q4 

q4 t q5 q6 q11 

q5 | q6 q11 

Je veux extraire chaque élément qui est séparé par un espace . Par exemple, dans la première ligne je veux être capable d'extraire "q1" "t" et "q2" comme des jetons séparés.

Je pense qu'il ya deux façons d'aller sur ce

  1. lecture du fichier, jeton par jeton, en utilisant ifstream >>. Le problème que j'ai avec cette approche est que je ne sais pas comment dire quand la fin d'une ligne a été atteinte pour que je puisse passer à la ligne suivante.

  2. L'autre approche consiste à obtenir la ligne entière à la fois avec getline(); Le problème avec cette approche est que je dois scinder la chaîne moi-même, et chaque ligne est différente, donc je ne suis pas sûr que ce soit la meilleure idée. Je suis assez époustouflé, il n'y a pas de manière construite pour le faire, en plus de strtok() qui semble ne pas être du tout ce que je veux. Merci les gars toute aide est appréciée.

+0

Alors voulez-vous un tableau linéaire géant contenant tous les jetons dans le fichier? Si c'est le cas, le premier fonctionne bien, et peut être augmenté avec le constructeur de 'std :: vector' en prenant deux itérateurs. – chris

+0

Si vous êtes des jetons aussi bien séparés par des espaces (y compris des sauts de ligne), 'while (fs >> str)' fonctionnera totalement pour vous. – WhozCraig

+0

Soit vos nouvelles lignes ont une signification. Ensuite, allez 'getline()' et alimentez la ligne par une chaîne de caractères pour obtenir des jetons. Ou bien vos newlines * n'ont pas de sens, alors la lecture de 'ifstream' les ignorera comme n'importe quel autre espace. – DevSolar

Répondre

3

Utilisez getline, et tokenize la chaîne résultante, le mettre dans un std::stringstream et extraire les jetons de cela.

std::string line_string; 
while (getline(file, line_string)) { 
    std::istringstream line(line_string); 
    std::string token; 
    while (line >> token) { 
     do something with token 
    } 
} 
+0

C'est ce que je ferais aussi ... C'est un excellent moyen de concocter un fichier de configuration simple quand vous êtes pressé =) – paddy

+0

Génial, en train d'essayer ça maintenant, ça a l'air facile! –

0

Si vous voulez seulement utiliser la bibliothèque standard, vous pouvez aller avec getline puis utilisez un stringstream-ifstream>> mot par mot.

Sinon le C++ est en effet assez limité en termes de traitement de texte et vous pouvez faire plus facilement avec strings et les flux de Qt, ou string algorithms de boost (y compris split), qui s'intègrent bien avec les chaînes STL.