std :: stringstream operator >>无法将字符串转换为float

Xev*_*ous 3 c++ stringstream

我无法理解为什么第二个>>失败.我做错了什么或遗漏了一些代码?

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";
Run Code Online (Sandbox Code Playgroud)

文件:

0.120000
0.120000
Run Code Online (Sandbox Code Playgroud)

输出:

str = 0.120000
ss.str() = 0.120000
f1 = 0.12
f2 = 2.06831e+032
Run Code Online (Sandbox Code Playgroud)

我已经在多个文件上尝试了这个代码,显然只有第一次插入到float中,文件末尾有一个空行

编辑

正如Dan指出的那样,我尝试直接从文件中提取浮点数:

file.open("file.txt");
file >> f1;
file >> f2;
Run Code Online (Sandbox Code Playgroud)

理想的工作; 也简化了很多代码

Chr*_*phe 6

您必须在第二次尝试阅读之前添加以下语句:

ss.clear(); 
Run Code Online (Sandbox Code Playgroud)

为什么?

因为当你读过的第一行,字符串流包含"0.120000"ss>>f1会导致ss到达文件的末尾.这样就设置了eof标志.

使用时重置stringstreams的内容时str(),不会重置状态标志,因此尝试读取将失败.在重置stringstreams的内容后添加ss.clear()将纠正这种情况.

在线演示