C ++有一个名为“固定”的I / O操纵器'以固定(非科学)形式输入/输出浮点数。它适用于输出,但我不明白如何使输入正常工作。
考虑这个例子:
#include <sstream>
#include <iostream>
using namespace std;
int main() {
double value;
istringstream("1.4e1") >> fixed >> value;
cout << value << endl;
}
在我看来,它应该像这样工作。输入流有一些字符串。当我们对它应用fixed
操纵器并尝试读取双/浮点数时,它应该停在第一个不是数字或点的字符上(不接受第二个/第三个/更多次点)。因此,正确的输出将为1.4
(当我们遇到'e'
时,我们会停止处理输入。)
相反,此代码输出14
。为什么?它是如何工作的以及fixed
对输入流的目的是什么?如何从输入流中读取双精度并在'e'
处停止(将其保留在输入流中)?
答案 0 :(得分:0)
你应该使用std :: scientific 我试过这样:
#include <sstream>
#include <iostream>
using namespace std;
int main() {
double value;
cin >> std::fixed>> std::scientific >> value;
cout << std::scientific<<value << endl;
}
输入:1.4e1
输出:1.400000e + 01
答案 1 :(得分:0)
这个问题有点误导。 1.4e1 = 1.4 * 10¹ = 1.4 * 10 = 14
。
[...]它应该停在第一个不是数字或点的字符上(点 不接受第二次/第三次/更多次。)
为什么会这样? e1
中的1.4e1
是部分的数字:没有它,意思就不同了。如果你想正确地解析它,你必须阅读它。
因此,正确的输出将是1.4(我们停止处理输入 遇到'e')。
如果您正在读取一个整数类型,当满足非数字字符([0-9])或其他条件触发(例如上溢或下溢)时“停止”解析,这将适用。
答案 2 :(得分:0)
我需要将值读为
1.4
,在输入流中保留e
。有可能吗?
对此没有标准操纵器,我相信有一种定义自定义操纵器的方法,但它太复杂了。我还没有找到关于如何在SO上做到这一点的答案,我只找到a question about output stream modifier。
让我们转向至少某种解决方案。那将是你自己解析它:
#include <iostream>
#include <sstream>
#include <string>
#include <cctype>
int main()
{
std::istringstream iss("1.4e1");
double value;
{
std::string s;
while(iss.peek() != 'e' && !std::isspace(iss.peek()))
s.push_back(iss.get());
std::istringstream(s) >> value;
}
std::cout << value << std::endl;
}