2012-04-05 1 views
1

J'essaie de stocker des entiers dans un fichier et je le stocke avec ',' comme délimiteur. Maintenant, quand je lis le fichier, je lis la ligne en utilisant getline() et utilise tokenizer pour délimiter le fichier, Cependant, je ne peux pas terminer la ligne, j'ai besoin d'une condition booléenne dans getline pour se terminer.Comment terminer en utilisant 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; 
     } 
    } 

Veuillez nous consulter.

Répondre

2

Dans votre cas, il suffit d'utiliser getline de la même manière que vous le faites dans la boucle extérieure:

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

Alors que le plus probable que je ferais quelque chose comme ceci:

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

Et deux autres alternatives - qui utilisent Boost.

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(",")); 

ou 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; 

Si vous prévoyez de rencontrer int non, des caractères non-séparation, par exemple 1 3 2 XXXX 4. Ensuite, vous devrez décider quoi faire dans un tel cas. tokenizer >> number s'arrêtera à quelque chose qui n'est pas int et les indicateurs d'erreur istringstream seront définis. boost::lexical_cast est aussi votre ami:

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

Enfin, vous avez 11 les fonctions stoi/stol/stoll C: de

#include <iostream> 
#include <string> 

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

Ce code imprime un seul numéro ...... – howtechstuffworks

+0

@howtechstuffworks: Fixe, Désolé. – Anonymous

Questions connexes