如何使用'固定' floatfield for istream / istringstream?

时间:2015-04-15 17:16:16

标签: c++ input io inputstream

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'处停止(将其保留在输入流中)?

3 个答案:

答案 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;
}