2011-12-09 27 views
11

Eventuali duplicati:
How to split a string in C++?dividere una stringa in un array in C++

Ho un file di input di dati e di ogni riga è una voce. in ogni riga ogni "campo" è separato da uno spazio bianco "" quindi ho bisogno di dividere la linea per spazio. altri linguaggi hanno una funzione chiamata split (C#, PHP ecc.) ma non riesco a trovarne uno per C++. Come posso raggiungere questo obiettivo? Ecco il mio codice che ottiene le linee:

string line; 
ifstream in(file); 

while(getline(in, line)){ 

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

} 

risposta

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

Tra l'altro, utilizzare qualificata nomi come std::getline, std::ifstream come ho fatto io. Sembra che tu abbia scritto using namespace std da qualche parte nel tuo codice che è considerato una cattiva pratica. Quindi non farlo:

+0

Puoi fornire un link a una discussione sul perché è una cattiva pratica usare 'using namespace x'? – jli

+0

@jli: aggiunto il link alla mia risposta. Guardalo. – Nawaz

+2

@Nawaz grazie, osservando le altre mie domande, la sintassi che sto usando e il modo in cui sto imparando il C++ dai miei istruttori all'università è altamente discutibile: S !!!!! –

0

utilizzare un stringstream o leggere token token dal tuo ifstream.

di farlo con uno 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

Ovviamente è possibile utilizzare boost se lo si desidera, o un'altra funzione STL per eseguire la copia fuori dallo stringstream. – jli

+0

Se l'input termina in spazi vuoti, questo ciclo while interno genera un token vuoto aggiuntivo alla fine. L'idiomatico C++ 'while (s >> token)' non lo fa. – Cubbi

+0

Questo è vero. Può anche modificare per usare quel metodo. – jli

3

Prova strtok. Cercalo nel riferimento C++ :.

+3

'strtok' è una cosa della libreria C, mentre il poster sta chiedendo come farlo correttamente con C++. – jli

+2

e C++ non è c? (... OMG tutti quegli anni mi hanno mentito tutti: D). Da quando la libreria c ha smesso di funzionare in C++ (o è diventata errata)? – LucianMLI

+0

Se li mescoli, aggiungi dipendenze non necessarie, tra le altre cose. – jli

3

Ho scritto una funzione per un mio più semplice requisito. potresti 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

Il seguente codice utilizza strtok() per dividere una stringa in token e memorizza i token in un vettore.

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