2013-12-10 62 views
0

如何使istringstream無法完全讀取帶後綴的數字字面值?使用istringstream(C++)獲得很長的後綴

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

int main() { 
    long long x = 123ULL; // shows 123ULL is a valid long long literal 

    istringstream iss("123ULL"); 

    iss >> x; 
    cout << "x is " << x << endl; 

    char extra; 
    iss >> extra; 
    cout << "remaining characters: "; 
    while(!iss.eof()) 
    { 
     cout << extra; 
     iss >> extra; 
    } 
    cout << endl; 

    return 0; 
} 

這段代碼的輸出是

x is 123 
remaining characters: ULL 

這種行爲是由地方來控制?任何人都可以指出我清除istringstream::operator>>(long long)接受哪些字符串的文檔?

回答

1

是的,它由語言環境控制(通過num_get方面),但沒有聽說過的語言環境支持C++語言文字,並且這將是錯誤的地方來定製它。

流是用於通用I/O,而C++整數文字後綴是非常專用的。

默認num_get構面的確切行爲在22.4.2.1節中的C++ 11標準中進行了描述。說明部分參考了C標準庫中的strto*函數系列。你可以找到一個稍微精簡版在這裏:

http://en.cppreference.com/w/cpp/locale/num_get/get

+0

感謝。你能否建議用C++解釋C++數字文字的標準方法? – ricab

+0

你會爲它編寫一個包裝器類型('struct CppInt')並重載'operator >>'。您可能希望將後綴信息添加到結構中,例如它可以有一個'bool unsigned'和'enum Type type'(對於後綴'L'和'LL'),如果你的程序關心的話。但是,如果你正在解析後綴爲整數文字的東西,那麼流可能是解析它的錯誤方法;你應該看看像Boost.Spirit這樣的解析器生成器。 –