d0z*_*zer 12 c++ fstream separator
有关于使用千位/百万分隔符打印整数的问题.
我有一个文本文件,我得到了国家,城市,总人口.
我必须在文件中阅读,并按国家排序.如果国家是一个国家,我必须按人口减少排序.
Textfile就像:
澳大利亚悉尼........ ......... 10.123.456
巴西...........圣保罗....... 7.123.345
我将所有3个读成一个单独的字符串.然后我擦除所有"." 在人口字符串中.然后我使用atoi()将填充字符串转换为整数.
现在,如果国家平等,我可以按人口排序.这种方式正常.
到现在为止还挺好.但我需要千万/百万的分离器进入印刷人口.
如果我使用字符串,用"." 对于人口,排序不正常.它的排序如下:
X ........ X ...... 1.123456
X ........ X ...... 10.123.456
X ........ X ...... 2.123.232
它必须看起来像:
澳大利亚悉尼........ ......... 10.123.456
澳大利亚布里斯班........ ....... 8.123.456
有没有办法通过再次添加分隔符来操纵打印?
提前谢谢了
hmj*_*mjd 18
#include <iostream>
#include <locale>
int main()
{
// imbue the output stream with a locale.
int i = 45749785;
std::cout << i << "\n";
std::cout.imbue(std::locale(""));
std::cout << i << "\n";
}
Run Code Online (Sandbox Code Playgroud)
在我的机器上输出(和在线演示):
45749785 45,749,785
正如评论和回答的那样,詹姆斯·坎泽(James Kanze)也将输入流加入,以便在int不手动修改输入的情况下读取分离的值.
有关语言环境的详细概述,请参阅Stroustrop的附录D:语言环境.
Jam*_*nze 13
使用支持所需分隔符的区域设置来读取文件(这样可以将值读取为整数),并使用相同的区域设置来写入数据.
请注意,您可能没有这样的区域设置,或者如果您这样做,您可能不知道它的名称(并且使用命名区域设置可能会更改其他内容,您不希望更改); 我的机器上,imbue与荷兰国际集团""的行为不同根据编译器(或者外壳,我从调用它) -你不应该使用的语言环境"",如果您有严格的格式要求.(""当您希望格式依赖于用户环境规范时
,使用区域设置.)
在这种情况下,最好明确提供本地:
class MyNumPunct : public std::numpunct<char>
{
protected:
virtual char do_thousands_sep() const { return ','; }
virtual std::string do_grouping() const { return "\03"; }
};
int
main()
{
std::cout.imbue( std::locale( std::locale::classic(), new MyNumPunct ) );
std::cout << 123456789 << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当然,您也希望将此语言环境用于输入.(此代码将为您提供"C"区域设置,仅更改分组.)