2015-04-15 29 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; 
}