std::stringstream operator>>无法将字符串转换为浮点数。

3

我不明白为什么第二个 >> 无法成功。是我做错了什么还是缺少了某些代码?

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;

工作得很理想;也大大简化了代码


1
不要再使用 stringstream,直接在 ifstream 上使用流 operator>> - Dan
1
文件 >> f1。这个文件可以像stringstream一样完成这些任务。 - Dan
很好,这将大大简化代码。 - Xeverous
1个回答

7
在第二次读取之前,您需要添加以下语句:
ss.clear(); 

为什么?

因为当你读取第一行时,字符串流中包含"0.120000",而ss>>f1将导致ss到达文件末尾。因此,eof标志被设置。

当你使用str()重置字符串流的内容时,你没有重置状态标志,因此读取尝试会失败。在重置字符串流的内容后添加ss.clear()将纠正这种情况。

在线演示


我在下一个getline之前添加了它,现在可以工作了。我知道我忘记了什么。 - Xeverous
@πάνταῥεῖ 抱歉,我得出了同样的结论,而当你发表评论时,我正在完善我的答案;-) - Christophe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接