当我使用imbue
设置时,我遇到了一些非常奇怪的行为
cin
的区域设置。
// example.cpp
#include <iostream>
#include <iomanip>
#include <locale>
int main(){
# ifdef LOCALE
std::cin.imbue(std::locale(LOCALE));
# endif
long temp;
const bool status = static_cast<bool>(std::cin >> temp);
std::cout << std::boolalpha << status << " " << temp << std::endl;
}
如果我不灌输当前的代码,我可以编译并运行此代码而不会出现问题 区域设置。
$ g++ example.cpp -o no-imbue -std=c++1y -stdlib=libc++ -Wall -Wextra -Werror
$ echo 100 | no-imbue
true 100
$ echo 1001 | no-imbue
true 1001
但是,如果我灌注当前的语言环境,std::cin >> temp
开始失败
四位数字:
$ g++ example.cpp -o imbue-empty -DLOCALE='""' -std=c++1y -stdlib=libc++ -Wall -Wextra -Werror
$ echo 100 | imbue-empty
true 100
$ echo 1001 | imbue-empty
false 1001
使用"en_US.UTF-8"
作为区域设置名称而不是""
似乎具有相同的功能
效果。
$ g++ example.cpp -o imbue-utf8 -DLOCALE='"en_US.UTF-8"' -std=c++1y -stdlib=libc++ -Wall -Wextra -Werror
$ echo 100 | imbue-utf8
true 100
$ echo 1001 | imbue-utf8
false 1001
我使用clang-600.0.57
$ g++ --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.4.0
Thread model: posix
这是编译器的错误,还是我做错了什么?
答案 0 :(得分:2)
如果您输入1,001
,您的程序应该打印true
。
en_US
语言环境要求每组三位数之间使用逗号。因为您在failbit
上没有提供一个std::num_get::get()
集std::cin
。有关更多详细信息,请参阅链接,但相关的摘录如下:
第2阶段:字符提取
如果字符与千位分隔符匹配 (
std::use_facet<std::numpunct<charT>>(str.getloc()).thousands_sep()
) 并且数以千计的分离正在使用中std::use_facet<std::numpunct<charT>>(str.getloc()).grouping().length() != 0
,然后是小数点&#39;。&#39;还没有积累, 记住角色的位置,但角色是 否则被忽略。如果小数点已经累积, 字符被丢弃,第2阶段终止。
和
第3阶段:转换和存储
此后,检查数字分组。如果在舞台上丢弃了数千个分隔符中的任何一个的位置 2与提供的分组不匹配
std::use_facet<std::numpunct<charT>>(str.getloc()).grouping()
,std::ios_base::failbit
被分配到err
。