2016-08-20 58 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

相关问题