2016-09-11 8 views
-1

J'ai un fichier que j'entrais qui a un tas de lignes qui ressemblent (* blah blah 4324 blah *) 23. Ce que j'essaie de faire est de tout enlever entre les parenthèses et gardez le nombre juste après la parenthèse fermée. Ce code continue à provoquer le blocage de mon programme et peut-être vous faire grincer des dents. J'ai regardé autour d'ici pour différentes choses comme Getline mais là, je trouve qu'il me montre tout avant le suppresseur. Merci d'avance.Suppression de la section entre parenthèses sur chaque ligne si elle est présente

+0

Comment cela fait-il planter votre programme? Avez-vous un message d'erreur? Comment 'cleanNums' est-il défini? Nous avons besoin d'un peu plus d'informations pour vous aider à résoudre votre problème. – Frxstrem

+0

Utilisez le débogueur pour résoudre votre problème. :) et l'exemple post minimal, complet et vérifiable http://stackoverflow.com/help/mcve –

+0

Que faire s'il y a une ligne sans parenthèses? Que pensez-vous que ['find'] (http://en.cppreference.com/w/cpp/string/basic_string/find) reviendra alors? Que pensez-vous qu'il se passe quand vous appelez ['erase'] (http://en.cppreference.com/w/cpp/string/basic_string/erase) avec ces valeurs? –

Répondre

0

Vous pouvez utiliser std::getline pour lire après la fermeture ')' caractère alors vous savez la prochaine lecture sera votre numéro:

int main() 
{ 
    std::ifstream ifs("test.txt"); 

    std::string skip; // read in parts you want to skip 
    int value;  // the value you want to keep 

    // skip data upto and past ')', then read number 
    while(std::getline(ifs, skip, ')') >> value) 
     std::cout << "found: " << value << '\n'; // output just the number 
} 
2

Comme il n'y a pas de déclaration donnée, je suppose que cleanNums est un std::vector<std::string>.

Maintenant à l'extrait de code de la question: std::string::find() renvoie un size_type (c'est-à-dire généralement un certain type entier) pour la position où la chaîne donnée a été trouvée. Donc openParen et closeParen sera l'index où les parenthèses d'ouverture et de fermeture sont trouvées - si elles sont trouvées du tout. std::string::erase(), lorsqu'il est appelé avec size_type - les arguments de type interprètent ces arguments comme l'index de départ et la longueur de la pièce qui doit être effacée. Cependant, vous l'appelez comme s'il s'agissait de l'index de départ et du dernier index de la partie à supprimer. Donc, ce que vous avez à faire est d'utiliser ces deux indices pour calculer la longueur de la partie qui doit être enlevée avant de passer à erase().

Et il y a un autre problème, probablement celui qui provoque le crash de votre programme: Vous ne vérifiez pas si les deux appels std::string::find() ont effectivement trouvé quelque chose. Parce que si ce n'est pas le cas, alors ils retournent std::string::npos, ce qui est généralement plus grand que la taille de la plupart des chaînes. Cela a pour conséquence que les index sont hors plage et std::string::erase() génère une exception std::out_of_range. Boom, crash du programme!

Alors, quelle est la leçon ici? Ne pas supposer quel type de paramètres attend une fonction/méthode, si vous n'êtes pas sûr à ce sujet, mais le rechercher dans votre référence C++ préférée. C'est correct si le compilateur ne lit pas la documentation d'une fonction qu'il utilise/compile, mais le programmeur devrait lire la documentation d'une fonction qu'il/elle utilise au moins une fois.