J'ai un flux d'entrée contenant des entiers et des caractères de signification spéciaux "#". Il se présente comme suit: ... 12 18 16 # 22 24 26 15 # 17 # 32 35 33 ...
Les jetons sont séparés par un espace. Il n'y a pas de modèle pour la position de "#".Tokenize stringstream basé sur le type
je tentais de tokenizer le flux d'entrée comme ceci:
int value;
std::ifstream input("data");
if (input.good()) {
string line;
while(getline(data, line) != EOF) {
if (!line.empty()) {
sstream ss(line);
while (ss >> value) {
//process value ...
}
}
}
}
Le problème avec ce code est que le traitement s'arrête lorsque le premier « # » est rencontré.
La seule solution que je peux penser est d'extraire chaque jeton individuel dans une chaîne (pas '#') et utiliser la fonction atoi() pour convertir la chaîne en entier. Cependant, c'est très inefficace car les jetons majoritaires sont entiers. Appeler atoi() sur les jetons introduit de gros frais généraux.
Y a-t-il un moyen d'analyser le jeton individuel par son type? c'est-à-dire, pour les entiers, l'analyser comme des entiers alors que pour '#', l'ignorer. Merci!
est d'utiliser getline acccepable deux fois? si c'est le cas, utilisez 'getline (data, line, '#');' fisrt. – andre
@ahenderson Je n'ai pas compris votre point. L'une des signatures de fonction de getline est: istream & getline (istream & is, chaîne & str, char delim); En passant '#' comme troisième argument de getline, getline() prendra '#' comme délimiteur. – itnovice
J'ai posté une réponse. – andre