2012-04-05 19 views
1

Ich versuche, einige Ganzzahlen in einer Datei zu speichern, und ich speichere es mit ',' als Trennzeichen. Wenn ich jetzt die Datei lese, lese ich die Zeile mit getline() und benutze Tokenizer, um die Datei zu begrenzen. Allerdings kann ich die Zeile nicht beenden, ich brauche eine bool-Bedingung in getline, um zu beenden.So beenden Sie mit getline()

while(getline(read,line)) { 
     std::cout<<line<<std::endl; 
     std::istringstream tokenizer(line); 
     std::string token; 
     int value; 

     while(????CONDN???) { 
       getline(tokenizer,token,','); 
       std::istringstream int_value(token); 
       int_value>>value; 
       std::cout<<value<<std::endl; 
     } 
    } 

Bitte um Rat.

Antwort

2

In Ihrem Fall ist es ausreichend, getline in der gleichen Art und Weise zu verwenden, wie Sie in der äußeren Schleife zu tun:

while(getline(tokenizer, token, ',')) 

Während die meisten wahrscheinlich würde ich so etwas tun:

while(std::getline(read,line)) { // read line by line 
    std::replace(line.begin(), line.end(), ',', ' '); // get rid of commas 
    std::istringstream tokenizer(line); 
    int number; 

    while(tokenizer >> number) // read the ints 
     std::cout<<number<<std::endl; 
} 

Und zwei andere Alternativen - die Boost nutzen.

String Algorithms:

#include <boost/algorithm/string.hpp> 
... 
std::vector<std::string> strings; 
boost::split(strings, "1,3,4,5,6,2", boost::is_any_of(",")); 

oder tokenizer:

#include <boost/tokenizer.hpp> 
typedef boost::char_separator<char> separator_t; 
typedef boost::tokenizer<separator_t> tokenizer_t; 
... 
tokenizer_t tokens(line, sep); 
for(tokenizer_t::iterator it = tokens.begin(); it != tokens.end(); ++it) 
    std::cout << *it << std::endl; 

Wenn Sie nicht int, nicht-Trennzeichen zu begegnen erwarten, z.B. 1 3 2 XXXX 4. Dann müssen Sie entscheiden, was in einem solchen Fall zu tun ist. tokenizer >> number stoppt bei etwas, das nicht int ist und die istringstream Fehler Flags werden gesetzt. boost::lexical_cast ist auch dein Freund:

#include <boost/lexical_cast.hpp> 
... 
try 
{ 
    int x = boost::lexical_cast<int>("1a23"); 
} 
catch(const boost::bad_lexical_cast &) 
{ 
    std::cout << "Error: input string was not valid" << std::endl; 
} 

schließlich in C++ 11 Sie haben die stoi/stol/stoll Funktionen:

#include <iostream> 
#include <string> 

int main() 
{ 
    std::string test = "1234"; 
    std::cout << std::stoi(str) << std::endl; 
} 
+0

Dieser Code druckt nur eine Nummer ...... – howtechstuffworks

+0

@howtechstuffworks: Fest, das tut mir leid. – Anonymous

Verwandte Themen