c ++ sstream,每行读取不同数量的变量

时间:2014-04-28 02:17:57

标签: c++ sstream

我正在尝试读取每行上包含不同变量的文本文件,并使用sstream将正确的值设置为矢量。

/*Example file
 "f 1 2 3"
 "f 4 5 6 7"  */

ifstream infile(file);
string line;
char a;
int i=0;v,x,y,z;

while(getline(infile,line))
{
    istringstream iss(line)

    if(line[0]=='f')
    {       
         if(iss>> a >> v >> x >> y) 
         {    
              poly[i].face[0]=v;
              poly[i].face[1]=x;
              poly[i].face[2]=y;
              poly[i].four=false;
         }
         else if(iss>> a >> v >> x >> y >> z) //this doesn't seem to get called, ever.
         {
              poly[i].face[0]=v;
              poly[i].face[1]=x;
              poly[i].face[2]=y;
              poly[i].face[3]=z;
              poly[i].four=true;
         }
        poly.push_back(Poly());
        i++;
    }

}

代码适用于包含3个变量的行,但不适用于包含4个变量的行。

2 个答案:

答案 0 :(得分:1)

这是因为第一批输入已成功读取这些变量,并且从未到达else部分。由于行的开头始终是相同的,就像存储这些值一样,您可以这样做:

 if(iss >> a >> v >> x >> y) 
 {    
      poly[i].face[0]=v;
      poly[i].face[1]=x;
      poly[i].face[2]=y;
      poly[i].four=false;

      if(iss >> z)
      {
          poly[i].face[3]=z;
          poly[i].four=true;
      }
 }

答案 1 :(得分:0)

使用>>推进流,因此它会更改下一次>>调用的内容。如果第一个if(...)失败,则会修改流iss,以便else if (...)也失败。

相反,你可以这样做:

if(iss >> a >> v >> x >> y) 
{    
      poly[i].face[0]=v;
      poly[i].face[1]=x;
      poly[i].face[2]=y;

      if (iss >> z) // if we can read the fourth value...
      {
          poly[i].face[3]=z;
          poly[i].four=true;
      }
      else
      {
          poly[i].four=false;
      }
}