2016-08-20 55 views
3

我不明白爲什麼第二個>>失敗。我做錯了什麼或缺少一些代碼?std :: stringstream operator >>無法將字符串轉換爲浮點數

std::ifstream file; 
std::stringstream ss; 
std::string str; 
float f1, f2; 

file.open("file.txt"); 
getline(file, str); 
ss.str(str); 
ss >> f1; 

getline(file, str);//when packed inside if(), evalueates to true 
ss.str(str); 
ss >> f2; //when packed inside if(), evalueates to false - but why it fails? 


std::cout<<"str = "<<str<<"\n"; 
std::cout<<"ss.str() = "<<ss.str()<<"\n"; 
std::cout<<"f1 = "<<f1<<"\nf2 = "<<f2<<"\n"; 

文件:

0.120000 
0.120000 

輸出:

str = 0.120000 
ss.str() = 0.120000 
f1 = 0.12 
f2 = 2.06831e+032 

我已經嘗試了多個文件,此代碼,顯然只有第一次插入浮動作品,文件在結尾處的空行

編輯

丹指出,我試圖直接從文件中提取浮動:

file.open("file.txt"); 
file >> f1; 
file >> f2; 

理想的工作;也simplyfies代碼很多

+1

溝'的'流操作stringstream',只需使用>>單曲在'ifstream'本身。 – Dan

+0

你是什麼意思? – Xeverous

+1

'file >> f1'。該文件可以像stringstream一樣執行這些操作。 – Dan

回答

6

你有第二次嘗試之前添加以下語句爲:

ss.clear(); 

爲什麼?

因爲當您讀取第一行時,字符串流包含"0.120000"ss>>f1將導致ss到達文件末尾。這樣就可以設置eof標誌。

當您使用str()重置字符串流的內容時,不會重置狀態標誌,以致嘗試讀取將失敗。在重置字符串流的內容之後添加ss.clear()將會糾正這種情況。

Online demo

+0

我在下一個getline之前添加了它;現在工作。我全新的我忘記了一些東西 – Xeverous

+0

@πάνταῥεῖ對不起,我得出了同樣的結論,當你發表評論時,我正在完成我的回答;-) – Christophe

相關問題