为什么我可以从C++文件中读取 int 值,但不能浮点?
Why can I read int values from file in C++ but not float?
#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
的状态。 如果infile
是good()
那么它是真的,否则是假的。 一旦循环到达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
读取,然后将其解析为float
或int
。
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)
.
相关文章:
- 是否可以将函数导入命名空间,但不能导出它?
- std::unique_ptr 在 GCC 中工作,但不能在 Visual Studio 中编译
- 声明C++具有动态大小的数组类型在 Linux 中工作正常,但不能在 Windows 中工作
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- std::chrono::d uration 可以按秒初始化,但不能按毫秒初始化?
- Python/C++:可以导入犰狳(arma::)但不能导入子程序arma::arma_rng::randn
- 为什么我可以从C++文件中读取 int 值,但不能浮点?
- C++程序在将 int 与 cin 一起使用时有效,但不能使用字符串
- SqLite c++,可以创建数据库,但不能将 anthing 插入到表中
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- 16 位系统中的程序如何访问大于 65535 的整数,但不能访问地址
- C++:返回本地对象,但不能正常工作
- 进程为包含double但不包含int的模板返回了-103741819(0xC0000005)
- 警告C4018,包含int和UINT32,但不包含int和UCHAR
- 可以访问一个类中的播放器结构,但不能访问另一个类中的播放器结构
- 返回实例变量的c++方法可以访问变量中的数据,但不能更改它,但在编译时不会生成错误
- 结构C++可以用 0 初始化,但不能用另一个 int 初始化
- C++为什么字符串的地址尽管是十六进制格式,但不能存储在 long int 变量中?
- C++为什么 int 变量可以声明为类的私有数据成员,但不能声明为字符串变量
- c++模板实例化可以使用int、long等,但不能使用float、double等