C++ 为什么我可以从C++;但不是浮动? #包括 #包括 #包括 使用名称空间std; int main() { //创建一个动态数组来保存这些值 向量整数; //创建一个动态数组来保存这些值 矢量浮动; int x; 双d; int sum1=0; 双sum2=0.0; 弦线; 河流充填; open(“data.txt”,ios::in); 而(内嵌>>x) { 整数。推回(x); } 而(填充>>d) { 浮动。推回(d); } int指数=0; infle.close(); 对于(int i=0;i

C++ 为什么我可以从C++;但不是浮动? #包括 #包括 #包括 使用名称空间std; int main() { //创建一个动态数组来保存这些值 向量整数; //创建一个动态数组来保存这些值 矢量浮动; int x; 双d; int sum1=0; 双sum2=0.0; 弦线; 河流充填; open(“data.txt”,ios::in); 而(内嵌>>x) { 整数。推回(x); } 而(填充>>d) { 浮动。推回(d); } int指数=0; infle.close(); 对于(int i=0;i,c++,file-handling,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 v

当你这样做时

#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];
    }
循环将一直运行,直到
infle>>x
的结果为false。
infle>>x
的结果为
infle
的状态。如果
infle
good()
则为true,否则为false。一旦该循环到达
infle
不再为
good()的点
它会停止。因为在此之后,当您到达

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

}
infle
仍然不好,因此它是
false
,循环被跳过

要重置
infle
的状态,您需要调用
clear
重置错误状态。这将为您提供

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

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

如果这样做

#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];
    }
循环将一直运行,直到
infle>>x
的结果为false。
infle>>x
的结果为
infle
的状态。如果
infle
good()
则为true,否则为false。一旦该循环到达
infle
不再为
good()的点
它会停止。因为在此之后,当您到达

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

}
infle
仍然不好,因此它是
false
,循环被跳过

要重置
infle
的状态,您需要调用
clear
重置错误状态。这将为您提供

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

}

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

将值读取为
字符串,然后将其解析为
浮点值或
整数

字符串s;
而(填充>>s)
{
如果(s.find('.')!=string::npos){//float
浮动。向后推(stof(s));
}否则{
整数。推回(stoi(s));
}
}

如果您希望将
float
的指数格式(例如
1e10
)包括在内,那么您可能还需要处理这种情况:
(s.find('..)!=string::npos)|(s.find('e')!=string::npos)
将值作为
字符串读取,然后将其作为
float
int进行解析

字符串s;
而(填充>>s)
{
如果(s.find('.')!=string::npos){//float
浮动。向后推(stof(s));
}否则{
整数。推回(stoi(s));
}
}

如果您希望将
float
的指数格式(例如
1e10
)包括在内,那么您可能也希望处理这种情况:
(s.find('..)!=string::npos)|(s.find('e')!=string::npos)
data.txt
看起来如何?预期结果是什么?这是文本文件中的简单数据:“2 7-6-13 78 34-1 2.5 5.6-8.13”data.txt
看起来如何?预期结果是什么?这是文本文件中的简单数据:“2 7-6-13 78 34-1 2.5 5.6-8.13”调用infle.clear()后,文件中的数据是:“2 7-6-13 78 34-1 2.5 5 5.6-8.13”,它的读数是2.5等于0.5。@ChaoSAdm我刚刚在答案中添加了解释为什么会发生这种情况的内容,并给了你一些潜在的解释fixes@ChaoSAdm这是因为当
操作符>
读入
int
时,它将
2.5
作为整数
2
读取,并将
.5
保留在流中以便下次读取。sam
5.6
-8.13
也可能发生这种情况。
操作符>
遇到不属于被读取类型的字符时停止读取。
字符不适用于
int
,因此
操作符>
停止读取。文件中的数据是:2 7-6-13 78 34-1 2.5 5.6-8.13“调用infle.clear()后,它的读数是2.5等于0.5。@ChaoSAdm我刚刚在答案中添加了解释为什么会发生这种情况的内容,并给了你一些潜在的解释fixes@ChaoSAdm这是因为当
操作符>
读入
int
时,它将
2.5
作为整数
2
读取,并将
.5
保留在流中以便下次读取。sam
5.6
-8.13
也可能发生这种情况。
操作符>
遇到不属于所读入类型的字符时停止读取。
字符不适用于
int
,因此
操作符>