C++ 文件 IO:读取“29.0”的输入加倍但输出为“29”,即删除“.0”
C++ File IO: read input of "29.0" to double but output is "29", i.e. ".0" removed
我使用以下代码从文件中读取数据。
输入文件是
29.0 45.0 0.0 15.0
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(){
string fileName;
cout << "input the file: ";
cin >> fileName;
double temp1=0.0, temp2=0.0, temp3=0.0, temp4=0.0;
ifstream fin;
fin.open(fileName.c_str());
if(!fin.is_open()){
cout << "Could not open file" << endl;
}
fin >> temp1 >>temp2 >>temp3 >>temp4;
cout << temp1 << " " << temp2 << " " << temp3 <<" " <<temp4 <<endl;
fin.close();
}
但我得到的是 29 45 0 15
而不是 29.0 45.0 0.0 15.0
如果我将数据文件更改为29.1 45.1 0.1 15.1
,那么我得到的正好是29.1 45.1 0.1 15.1
。
有人知道为什么会这样吗?
如果您想保留“.0”等当且仅当它出现在输入中时,您需要将值作为文本读取 - 例如进入 std::string
秒。当您读入 double
s 时,将存储逻辑值(在确切的文本值在 double
中没有按位表示的情况下会尽可能地存储逻辑值,例如 0.1
无法准确表示),由输出代码猜测您想要的位数 - 默认情况下,它猜测尾随的“.0”对 [=26 没有价值=].
您可以使用像 std::fixed
and std::setprecision
这样的 io 操纵器来更改它 - 两个页面都有有用的示例,为方便起见,下面复制了 setprecision
一个:
#include <iostream>
#include <iomanip>
#include <cmath>
#include <limits>
int main()
{
const long double pi = std::acos(-1.L);
std::cout << "default precision (6): " << pi << '\n'
<< "std::precision(10): " << std::setprecision(10) << pi << '\n'
<< "max precision: "
<< std::setprecision(std::numeric_limits<long double>::digits10 + 1)
<< pi << '\n';
}
输出:
default precision (6): 3.14159
std::precision(10): 3.141592654
max precision: 3.141592653589793239
我使用以下代码从文件中读取数据。 输入文件是
29.0 45.0 0.0 15.0
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(){
string fileName;
cout << "input the file: ";
cin >> fileName;
double temp1=0.0, temp2=0.0, temp3=0.0, temp4=0.0;
ifstream fin;
fin.open(fileName.c_str());
if(!fin.is_open()){
cout << "Could not open file" << endl;
}
fin >> temp1 >>temp2 >>temp3 >>temp4;
cout << temp1 << " " << temp2 << " " << temp3 <<" " <<temp4 <<endl;
fin.close();
}
但我得到的是 29 45 0 15
而不是 29.0 45.0 0.0 15.0
如果我将数据文件更改为29.1 45.1 0.1 15.1
,那么我得到的正好是29.1 45.1 0.1 15.1
。
有人知道为什么会这样吗?
如果您想保留“.0”等当且仅当它出现在输入中时,您需要将值作为文本读取 - 例如进入 std::string
秒。当您读入 double
s 时,将存储逻辑值(在确切的文本值在 double
中没有按位表示的情况下会尽可能地存储逻辑值,例如 0.1
无法准确表示),由输出代码猜测您想要的位数 - 默认情况下,它猜测尾随的“.0”对 [=26 没有价值=].
您可以使用像 std::fixed
and std::setprecision
这样的 io 操纵器来更改它 - 两个页面都有有用的示例,为方便起见,下面复制了 setprecision
一个:
#include <iostream>
#include <iomanip>
#include <cmath>
#include <limits>
int main()
{
const long double pi = std::acos(-1.L);
std::cout << "default precision (6): " << pi << '\n'
<< "std::precision(10): " << std::setprecision(10) << pi << '\n'
<< "max precision: "
<< std::setprecision(std::numeric_limits<long double>::digits10 + 1)
<< pi << '\n';
}
输出:
default precision (6): 3.14159
std::precision(10): 3.141592654
max precision: 3.141592653589793239