2013-03-05 43 views
0

新问题Stringstream将值读入失败?

boost::tokenizer<> token(line);标记小数点!我怎样才能阻止这种情况发生?

下面的问题现已解决。

我试图从一个stringstream中将值转换为双精度向量。

std::ifstream filestream; 
filestream.open("data.data"); 
if(filestream.is_open()){ 
    filestream.seekg(0, std::ios::beg); 

    std::string line; 
    std::vector<double> particle_state; 
    particle_state.resize(6); 
    while(filestream >> line){ 

     boost::tokenizer<> token(line); 

     int i = -1; 
     for(boost::tokenizer<>::iterator it=token.begin(); it!=token.end(); ++it){ 
      std::cout << *it << std::endl; // This prints the correct values from the file. 

      if(i == -1){ 
       // Ommitted code 
      } 

      else{ 
       std::stringstream ss(*it); 
       ss >> particle_state.at(i); // Offending code here? 
      } 
      i ++; 
     } 
     turbovector3 iPos(particle_state.at(0), particle_state.at(1), particle_state.at(2)); 
     turbovector3 iVel(particle_state.at(3), particle_state.at(4), particle_state.at(5)); 
     // AT THIS POINT: cout produces "(0,0,0)" 
     std::cout << "ADDING: P=" << iPos << " V=" << iVel << std::endl; 

    } 


    filestream.close(); 
} 

内容输入文件的:

electron(0,0,0,0,0,0); 
proton(1,0,0,0,0,0); 
proton(0,1,0,0,0,0); 

更多关于turbovector3:

turbovector3是一个数学向量类。 (重要的是,它的工作原理 - 实质上它是一个带有3个项目的向量,它使用三个双打的构造函数初始化)。

编辑修改的代码:

std::stringstream ss(*it); 
if(ss.fail()){ 
    std::cout << "FAIL!!!" << std::endl; // never happens 
} 
else{ 
    std::cout << ss.str() << std::endl; // correct value pops out 
} 
double me; 
ss >> me; 
std::cout << "double:" << me << std::endl; // correct value pops out again 
particle_state.at(i) = me; // This doesn't work - why? 
+0

我实际上看不出这段代码有什么问题。 – 2013-03-05 17:28:26

回答

1

你递增省略代码i?如果不是你的else子句永远不会被调用。尝试输出stringstream缓冲区的内容:

std::cerr << ss.str(); 

还要检查是否从ss阅读实际上失败:

if (ss.fail()) 
     std::cerr << "Error reading from string stream\n"; 
+0

'i ++'在if语句中被调用。我会更新这个。 – user3728501 2013-03-05 17:39:33

+0

ss不会失败。还有什么可能是错的? – user3728501 2013-03-05 17:41:22

+0

正确的值在ss内......这很奇怪...... – user3728501 2013-03-05 17:42:36

0

解决方案!我fluked,发现这个网站:Link

的解决方案是将标记生成器改成这样:

boost::char_delimiters_separator<char> sep(false,"(),;"); 
boost::tokenizer<> token(line,sep); 

现在,它的作品!