繁体   English   中英

逐行读取文件并标记化行

[英]Reading file line by line and tokenizing lines

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

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

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

任何关于我做错事的见解?

必须先重置ss状态,然后才能读取第二行中的数据。

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

当它

  1. while(myfile)替换为while(getline(myfile, line))
  2. 在循环内移动token的声明。

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

这里的问题是stringstream对于while循环而言不是局部的。 第一次从stringstream流读取时,将耗尽该流,这将导致EOF标志被设置。 如果您不清除该内容,那么即使您加载更多内容,也永远不会从中读取更多信息。 解决此问题的最简单方法是使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;  
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM