如何使用getline()终止

How to terminate using getline()

本文关键字:终止 getline 何使用      更新时间:2023-10-16

我正在尝试将一些整数存储在文件中,并使用","作为分隔符进行存储。现在,当我读取文件时,我使用getline()读取该行,并使用tokenizer来分隔文件。但是,我不能终止该行,我需要getline中的一些bool条件才能终止。

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

请提供建议。

在您的情况下,以与在外循环中相同的方式使用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。

字符串算法:

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

或标记化器:

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