逐行读取文件并标记行

时间:2017-02-24 17:15:40

标签: c++ tokenize

我有一个包含多行的文件。 行包含用逗号分隔的整数

在以下代码中,它仅解析第一行,但不解析重命名行。关于我做错的任何见解?

void parseLines(std::ifstream &myfile){
  std::string line, token;
  std::stringstream ss; 
  int i;
  vector<int> r;
  while(myfile) {
    getline(myfile, line);
    ss.str("");
    ss.str(line);
    if(myfile){
      cout << "SS" << ss.str() << endl;
      while (std::getline(ss, token, ',')){
        std::cout << token << std::endl;  
      }   
    }   
  }
}

2 个答案:

答案 0 :(得分:2)

  

关于我做错的任何见解?

在读取第二行的数据之前,需要重置ss的状态。

更好的是,在循环中移动ss的构造。

在此期间,

  1. while(myfile)替换为while(getline(myfile, line))
  2. 在循环内移动token的声明。
  3. void parseLines(std::ifstream &myfile){
       std::string line;
       int i;
       vector<int> r;
       while( getline(myfile, line) )
       {
          std::stringstream ss(line); 
          std::string token;
          while (std::getline(ss, token, ',')){
             std::cout << token << std::endl;  
          }   
       }
    }
    

答案 1 :(得分:2)

这里的问题是stringstream不是while循环的本地。当您第一次排出导致EOF标志设置的流时,从stringstream读取。如果您不清楚,那么即使您加载更多信息,您也永远不会从中读取任何更多信息。解决这个问题的最简单方法是使循环体的stringstream本地化,这样你就可以在每次迭代时从一个新的开始,你不必担心清理标志。这会使你的代码看起来像

while(getline(myfile, line)) // also moved the line reading here to control when to stop the loop
{
    std::stringstream ss(line);
    while (std::getline(ss, token, ',')){
        std::cout << token << std::endl;  
    }
}