0
votes

C ++ séparez une chaîne par espaces et virgules

J'essaie de lire dans un fichier texte, séparez les valeurs d'entier par des virgules et des espaces blancs "" et ajoutez chaque entiers à l'exclusion de "", "à un vecteur d'entiers. Le code suivant n'imprime que la première valeur. Qu'est-ce que je fais mal? XXX

et voici le fichier texte "scores.txt" :: xxx


2 commentaires

Note latérale: Les guillemets célibataires désignent un caractère. ',' essaie de tracer 2 caractères dans un seul caractère. Les résultats de cela sont quelque peu étranges. La plupart des compilateurs donneront un avertissement. N'ignorez pas les avertissements. Ils sont la première ligne de défense contre les erreurs logiques.


Vous auriez pu faire juste un std :: remplacer de toutes les virgules avec un espace, puis utilisez std :: istringstream sans tous ces peek appels.


4 Réponses :


1
votes

Je l'ai compris si quelqu'un se passe sur ceci à la recherche d'une réponse. Utilisez xxx

pour vérifier s'il s'agit d'un espace blanc ou d'une virgule au lieu de xxx


1 commentaires

Ce n'est pas une solution complète. Ce code seul détectera l'espace dans le flux d'entrée et l'ignorera. Cela laisse la virgule dans le flux d'entrée à ramasser par ss >> i , et ss >> i ne peut pas analyser une virgule. Il doit être enveloppé dans une boucle.



0
votes

Il n'y a pas besoin de recourir à Peek () et Ignorer () .

Vous pouvez simplement remplacer toutes les virgules par un espace, puis utiliser std :: istringingstream. xxx

EXEMPLE LIVE


0 commentaires

0
votes

Cela devrait fonctionner. Il analyse la ligne de fichier par ligne, correspondant à toutes les chaînes requises, puis à les convertir en int tout en les ajoutant au std :: vecteur code>.

#include <regex>
#include <string>
#include <vector

   int main()
    {
        std::ifstream fileIn("Scores.txt")
        std::string str;
        std::regex words_regex("[^, ]+");
        std::vector<int> vecOfStrs();

        while (std::getline(fileIn, str)) 
         {
            if (str.size() > 0) 
           {
              auto words_begin = std::sregex_iterator(s.begin(), s.end(), words_regex);
              auto words_end = std::sregex_iterator() 
              for (std::sregex_iterator i = words_begin; i != words_end; ++i)                             
                 vecOfStrs.emplace_back(std::stoi(*i.str())); 

           }   
       }

    }


0 commentaires

1
votes

Changez votre boucle à cela et ça va marcher! Testé-le sur mon côté avec le reste de votre code.

for(string i; ss >> i;)//treat as string for string manipulation
{
    size_t pos=str.find(',');  //look for a comma
    if(pos!=std::string::npos) i.erase(pos); //if comma is found, erase it!
    vecOfStrs.push_back(stoi(i));  //convert string to integer
}


0 commentaires