2013-12-10 61 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这样的解析器生成器。 –