2015-04-15 27 views
6

C++有一个名为'fixed'的I/O操纵器,以固定(非科学)形式输入/输出浮点数。它对输出正常工作,但我不明白如何让输入正常工作。如何为istream/istringstream使用'fixed'floatfield?

考虑这个例子:

#include <sstream> 
#include <iostream> 
using namespace std; 

int main() { 
    double value; 
    istringstream("1.4e1") >> fixed >> value; 
    cout << value << endl; 
} 

在我看来,它应该像这样工作。输入流有一些字符串。当我们在其上应用fixed机械手并尝试读取double/float时,它应停止在不是数字或点的第一个字符上(点不能被接受的次数/次数/次数)。所以,正确的输出将是1.4(当我们遇到'e'时,我们停止处理输入)。这个代码输出14。为什么?它如何工作以及输入流的fixed的用途是什么?我怎样才能从输入流中读取一个double并在'e'处停留(将其保留在输入流中)?

+0

'std :: fixed'没有输入流的目的。算术格式化操纵器都不能用于输入流。 – 0x499602D2

+0

@ 0x499602D2好的,谢谢。解决方案呢?有没有简单的方法(无需编写解析器)读取double,在输入流中保留'e'? – JIghtuse

+0

显然没有简单的方法。我正在浏览提取器的代码,并且似乎没有办法阻止解析器使用'e'或'E'。你必须把它读入一个字符串并解析自己。 – 0x499602D2

回答

0

你应该使用std ::科学 我想是这样的:

#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

+0

不完全。我需要**读**值为'1.4',在输入流中留下'e'。可能吗? – JIghtuse

+0

@JIghtuse我清楚地知道你的问题吗? – Steephen

0

这个问题是有些误导。 1.4e1 = 1.4 * 10¹ = 1.4 * 10 = 14

它应该停止在不是数字或圆点的第一个字符上(点号 不被接受的次数/次数/次数)。

为什么会这样? 1.4e1中的e1部分的数字:没有它的含义是不同的。如果你想正确解析它,你必须阅读它。

因此,正确的输出将是1.4(当我们遇到'e'时我们停止处理输入。

如果您正在读取一个整数类型,当遇到非数字字符([0-9])或其他条件触发(例如溢出或下溢)时会“停止”解析。

+0

如果我的假设对于你的问题是正确的,我们可以尝试讨论一个解决方案。 – edmz

+0

不,我只想阅读'1.4'部分并停下来。假设我们没有最后的'1','e'只是表示某个单位的后缀。所以,输入是'1.4e'或者'1.4euro'。我不需要将数字后的任何字符读入我的编号,它会转到另一个变量。但我也需要读一个double,而不是整数。看起来没有简单的方法来做到这一点。 – JIghtuse

+0

我看到了,@JIghtuse。但'e'和'欧元'是不同的!如果你有'1.4欧元',那就行了。由于指数必须位于尾数的旁边,因此它们之间的简单空间将起作用。 – edmz

0

我需要读取一个值为1.4,在输入流中保留e。可能吗?

这里没有一个标准的操纵器,我相信有一种方法可以定义一个自定义的操作器,但它会太复杂。我还没有找到一个关于如何做到这一点的答案,我只发现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; 
}