2012-04-05 4 views
1

Я пытаюсь сохранить некоторые целые числа в файле, и я сохраняю его как ',' в качестве разделителя. Теперь, когда я прочитал файл, я прочитал строку, используя getline(), и использую tokenizer, чтобы разграничить файл. Однако я не могу закончить строку, мне нужно, чтобы условие bool в getline прекращалось.Как завершить работу с использованием 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; 
     } 
    } 

Прошу совета.

ответ

2

В вашем случае достаточно использовать getline таким же образом, как вы делаете во внешнем контуре:

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

Хотя, скорее всего, я хотел бы сделать что-то вроде этого:

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

И еще две альтернативы - использование 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(",")); 

или 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; 

Если вы ожидаете встретить Непро- символов int, не разделителей, например, 1 3 2 XXXX 4. Тогда вам придется решить, что делать в таком случае. tokenizer >> number остановится на то, что не является int, и будут установлены флаги ошибок istringstream. boost::lexical_cast также ваш друг:

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

Наконец, в C++ 11 вы имеете stoi/stol/stoll функции:

#include <iostream> 
#include <string> 

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

Этот код печатает только один номер ...... – howtechstuffworks

+0

@howtechstuffworks: Фиксированный, простите за это. – Anonymous