2011-12-09 27 views
11

Duplicar posibles:
How to split a string in C++?dividir una cadena en una matriz en C++

que tienen un archivo de entrada de datos y cada línea es una entrada. en cada línea, cada "campo" está separado por un espacio en blanco "", así que necesito dividir la línea por espacio. otros lenguajes tienen una función llamada split (C#, PHP etc.) pero no puedo encontrar uno para C++. ¿Cómo puedo conseguir esto? Aquí está mi código que obtiene las líneas:

string line; 
ifstream in(file); 

while(getline(in, line)){ 

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

} 

Respuesta

20
#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! 
} 

Por cierto, utilice calificados nombres tales como std::getline, std::ifstream como yo. Parece que has escrito using namespace std en algún lugar de tu código, lo que se considera una mala práctica. Así que no hacer eso:

+0

¿Puede proporcionar un enlace a una discusión sobre por qué es una mala práctica usar 'using namespace x'? – jli

+0

@jli: Agregué el enlace a mi respuesta. Míralo. – Nawaz

+2

@Nawaz gracias, En cuanto a mis otras preguntas, la sintaxis que estoy usando y la forma en que estoy aprendiendo C++ de mis instructores en la universidad es muy cuestionable: S !!!!! –

0

O utiliza un identificador de stringstream o leído por testigo de su ifstream.

hacerlo con 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

Por supuesto, puede usar boost si lo desea, u otra función STL para copiar el stringstream. – jli

+0

Si la entrada termina en espacios en blanco, este ciclo while interno genera un token vacío adicional al final. El idiomático C++ 'while (s >> token)' no. – Cubbi

+0

Esto es cierto. También puede editar para usar ese método. – jli

3

Trate strtok. Búscalo en la referencia de C++ :.

+3

'strtok' es una cosa de la biblioteca C, mientras que el póster pregunta cómo hacerlo correctamente con C++. – jli

+2

y C++ no es c? (... OMG todos esos años me mintieron a todos: D). ¿Desde cuando la biblioteca c ha dejado de funcionar en C++ (o se ha vuelto incorrecta)? – LucianMLI

+0

Si los mezcla, agrega dependencias innecesarias, entre otros problemas. – jli

3

He escrito una función para un requisito similar de la mía. puede ser que usted puede usarlo!

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; 
} 
1

El código siguiente utiliza strtok() para dividir una cadena en tokens y almacena las señales en un vector.

#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; 
}