web-dev-qa-db-fra.com

Fractionner une chaîne en un tableau en C++

Duplicate possible:
Comment diviser une chaîne en C++?

J'ai un fichier d'entrée de données et chaque ligne est une entrée. dans chaque ligne, chaque "champ" est séparé par un espace ""; il est donc nécessaire de fractionner la ligne par espace. d'autres langages ont une fonction appelée split (C #, PHP etc) mais je ne peux pas en trouver un pour C++. Comment puis-je atteindre cet objectif? Voici mon code qui obtient les lignes: 

string line;
ifstream in(file);

while(getline(in, line)){

  // Here I would like to split each line and put them into an array

}
13
Ahoura Ghotbi
#include <sstream>  //for std::istringstream
#include <iterator> //for std::istream_iterator
#include <vector>   //for std::vector

while(std::getline(in, line))
{
    std::istringstream ss(line);
    std::istream_iterator<std::string> begin(ss), end;

    //putting all the tokens in the vector
    std::vector<std::string> arrayTokens(begin, end); 

    //arrayTokens is containing all the tokens - use it!
}

En passant, utilisez des noms qualifiés tels que std::getline, std::ifstream, comme je l’ai fait. Il semble que vous ayez écrit using namespace std quelque part dans votre code, ce qui est considéré comme une mauvaise pratique. Alors ne fais pas ça:

22
Nawaz
vector<string> v;
boost::split(v, line, ::isspace);

http://www.boost.org/doc/libs/1_48_0/doc/html/string_algo/usage.html#id3115768

4
Benjamin Lindley

J'ai écrit une fonction pour une exigence similaire, Peut-être pouvez-vous l'utiliser!

std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) 
{
    std::stringstream ss(s+' ');
    std::string item;
    while(std::getline(ss, item, delim)) 
    {
        elems.Push_back(item);
    }
    return elems;
}
3
Vijay

Essayez strtok . Recherchez-le dans la référence C++:.

3
LucianMLI

Le code ci-dessous utilise strtok() pour scinder une chaîne en jetons et les stocker dans un vecteur.

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>

using namespace std;


char one_line_string[] = "hello hi how are you Nice weather we are having ok then bye";
char seps[]   = " ,\t\n";
char *token;



int main()
{
   vector<string> vec_String_Lines;
   token = strtok( one_line_string, seps );

   cout << "Extracting and storing data in a vector..\n\n\n";

   while( token != NULL )
   {
      vec_String_Lines.Push_back(token);
      token = strtok( NULL, seps );
   }
     cout << "Displaying end result in  vector line storage..\n\n";

    for ( int i = 0; i < vec_String_Lines.size(); ++i)
    cout << vec_String_Lines[i] << "\n";
    cout << "\n\n\n";


return 0;
}
1
Software_Designer

C++ est mieux utilisé avec le boost de bibliothèque presque standard.

Et un exemple: http://www.boost.org/doc/libs/1_48_0/doc/html/string_algo/usage.html#id3115768

0
Tristram Gräbener

Utilisez un jeton stringstream ou read by token à partir de votre ifstream.

Pour le faire avec un stringstream:

string line, token;
ifstream in(file);

while(getline(in, line))
{
    stringstream s(line);
    while (s >> token)
    {
        // save token to your array by value
    }
}
0
jli