2013-03-05 47 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); 

現在,它的作品!