为什么我可以从C++文件中读取 int 值,但不能浮点?

Why can I read int values from file in C++ but not float?

本文关键字:但不能 int 读取 我可以 C++ 文件 为什么      更新时间:2023-10-16
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int main()
{
//Create a dynamic array to hold the values
vector<int> integers;
//Create a dynamic array to hold the values
vector<double> floating;
int x;
double d;
int sum1=0;
double sum2=0.0;
string line;
ifstream infile;
infile.open("data.txt", ios::in);
while(infile >> x)
{
integers.push_back(x);
}
while(infile >> d)
{
floating.push_back(d);
}
int index = 0;
infile.close();
for(int i=0; i<integers.size(); i++)
{
sum1 += integers[i];
}
for(int i=0; i<floating.size(); i++)
{
sum2 += floating[i];
}

整数输出按预期工作。但是双倍值不是吗?此外,双精度值在整数值之后开始,所以我没有将文件指针移动到其他位置。

当你这样做时

while(infile >> x)
{
integers.push_back(x);
}

循环将一直运行,直到infile >> x的结果为 false。infile >> x的结果是infile的状态。 如果infilegood()那么它是真的,否则是假的。 一旦循环到达infile不再good()的点,它就会停止。 由于您没有做任何事情来更改infile之后的状态,因此当您到达

while(infile >> d)
{
floating.push_back(d);
}

infile仍然很糟糕,所以它false并跳过循环。

若要重置infile的状态,需要调用clear来重置错误状态。 那会给你

while(infile >> x)
{
integers.push_back(x);
}
infile.clear();
while(infile >> d)
{
floating.push_back(d);
}

但这仍然会有问题,因为while(infile >> x)在达到双精度值的第一个.之前不会失败。 这意味着您读入的第一个双精度值和最后一个整数值都将不正确。 解决此问题的一种方法是使用std::string读取文件,然后解析字符串以确定它是整数还是浮点值并相应地进行转换。 另一种选择是拆分数据,并将整数放在一个文件中,将双精度放在另一个文件中。

将值作为string读取,然后将其解析为floatint

string s;
while(infile >> s)
{
if (s.find('.') != string::npos) { // float
floating.push_back(stof(s));
} else {
integers.push_back(stoi(s));
}
}

如果您希望指数格式为float例如1e10包括在内,您可能还想处理这种情况:(s.find('.') != string::npos) || (s.find('e') != string::npos).

相关文章: