2012-08-31 5 views
0

Je me bats sur celui-ci et je suis à un point où je ne progresse pas et il est temps de demander de l'aide. Ma connaissance des librairies boost est à peine meilleure que superficielle. J'essaie de faire un balayage progressif à travers une chaîne plutôt grande. En fait, c'est tout le contenu d'un fichier lu dans un objet std :: string (le fichier ne sera pas si grand, c'est la sortie d'un programme en ligne de commande).boost :: regex_search refuse de prendre mes arguments

La sortie de ce programme, pnputil, est répétitive. Je suis à la recherche de certains modèles dans un effort pour trouver le fichier "oemNNN.inf" que je veux. Essentiellement, mon algorithme est de trouver le premier "oemNNN.inf", rechercher des caractéristiques d'identification pour ce fichier. Si ce n'est pas celui que je veux, passez à la suivante.

Dans le code, il y a quelque chose comme:

std::string filesContents; 
std::string::size_type index(filesContents.find_first_of("oem")); 
std::string::iterator start(filesContents.begin() + index); 
boost::match_results<std::string::const_iterator> matches; 
while(!found) { 
    if(boost::regex_search(start, filesContents.end(), matches, re)) 
    { 
     // do important stuff with the matches 
     found = true; // found is used outside of loop too 
     break; 
    } 

    index = filesContents.find_first_of("oem", index + 1); 
    if(std::string::npos == index) break; 
    start = filesContents.being() + index; 
} 

J'utilise this example de la documentation de la bibliothèque Boost pour 1.47 (la version que je utilise). Quelqu'un s'il vous plaît expliquez-moi comment mon utilisation diffère de ce que cet exemple a (en dehors du fait que je ne stocke pas des choses dans des cartes et autres). De ce que je peux dire, j'utilise le même type d'itérateurs que l'exemple utilise. Pourtant, quand je compile le code, le compilateur de Microsoft me dit que: aucune instance de la fonction surchargée boost :: regex_search ne correspond à la liste des arguments. Pourtant, l'intellisense montre cette fonction avec les arguments que j'utilise, bien que les itérateurs s'appellent quelque chose de BidiIterator. Je ne connais pas la signification de ceci, mais étant donné l'exemple, je suppose que quel que soit le BidiIterator, il prend un std :: string :: itérateur pour la construction (peut-être une mauvaise hypothèse, mais semble logique vu le Exemple). L'exemple montre un cinquième argument, match_flags, mais cet argument a la valeur par défaut: boost :: match_default. Par conséquent, cela devrait être inutile. Cependant, juste pour les coups de pied et les sourires, j'ai ajouté ce cinquième argument et encore cela ne fonctionne pas. Comment est-ce que j'utilise mal les arguments? Surtout, quand on considère l'exemple. Ci-dessous est un programme simple qui illustre le problème sans l'algorithme de bouclage.

#include <iostream> 
#include <string> 

#include <boost/regex.hpp> 

int main() { 
std::string haystack("This is a string which contains stuff I want to find"); 
boost::regex needle("stuff"); 

boost::match_results<std::string::const_iterator> what; 
if(boost::regex_search(haystack.begin(), haystack.end(), what, needle, boost::match_default)) { 
    std::cout << "Found some matches" << std::endl; 
    std::cout << what[0].first << std::endl; 
} 

return 0; 
} 

Si vous décidez de compiler, je compile et je lie avec 1,47 de la bibliothèque de boost. Le projet avec lequel je travaille utilise intensivement cette version et la mise à jour n'est pas à moi de décider.

Merci pour toute aide. C'est très frustrant.

Andy

Répondre

2

Dans les types de général iterator sont différents.

std::string haystack("This is a string which contains stuff I want to find"); 

valeurs de retour de begin() et end() seront std::string::iterator. Mais votre type de match est

boost::match_results<std::string::const_iterator> what; 

std::string::iterator et std::string::const_iterator sont différents types. Donc, il y a quelques variantes

  1. chaîne de Déclarons ce const (à savoir const std::string haystack;)
  2. itérateurs comme const_iterators déclare (à savoir std::string::const_iterator begin = haystack.begin(), end = haystack.end();) et les passer à regex_search.
  3. utilisation boost::match_results<std::string::iterator> what;
  4. si vous avez C++ 11 vous pouvez utiliser haystack.cbegin() et haystack.cend()

example of work

+0

Merci beaucoup! Je savais que le problème devait être simple. Je venais de perdre trop de temps et j'avais besoin d'un second regard. J'ai complètement négligé l'utilisation de "const std :: string ..." dans les paramètres de la fonction. Une chose: je m'attendrais à ce que si l'objet string est const, alors appeler 'myString.begin()' retournerait un itérateur const. Cependant, j'ai dû utiliser 'std :: string :: const_iterator begin (myString.begin()) pour le faire fonctionner. Pourquoi donc? –

+0

@AndrewFalanga Comme vous pouvez le voir http://liveworkspace.org/code/57db9afe6464f944f2fecc4d8561ab91 'const std :: string.begin()' retourne 'const_iterator'. – ForEveR

Questions connexes