为什么我可以在 C++ 中从文件中读取 int 值而不是浮点数?

Cha*_*Adm 1 c++ file-handling

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

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

Nat*_*ica 8

当你做

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

}
Run Code Online (Sandbox Code Playgroud)

循环将运行直到结果infile >> x为假。的结果infile >> x是 的状态infile。如果infilegood(),则为真,否则为假。一旦该循环到达infile不再good()停止的点。既然你没有做任何事情来改变之后的状态infile,当你到达

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

}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

}
Run Code Online (Sandbox Code Playgroud)

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