C++ 学习(2) ---- std::cout 格式化输出
std::cout 格式化输出简介C++ 通常利用cout输出数据,和printf()函数相比,cout实现格式化输出数据的方式更加多样化;
一方面,cout 作为 ostream 类的对象,该类中提供有一些成员方法,可实现对输出数据的格式化;另一方面,为了方面用户格式化输出数据,C++ 标准库专门提供了一个 <iomanip> 头文件,该头文件中包含有大量的格式控制符,也就是流操纵算子,利用上更加方便;
cout 格式化输出有两种方法,一种是直接利用成员函数,另一种是利用流操纵算子,下面分别举行介绍:
利用成员函数
cout 的基类是 ostream 类,ostream 类 中还包含一些可实现格式化输出的成员方法,这些成员方法都是从 ios 基类(以及 ios_base类)中继续来的,cout(以及 cerr、clog)也能调用:
成员函数说明flags(fmtfl)当前的格式全部更换为fmtfl,fmtfl 可以是一种格式,也可以是多种格式precision(n)设置输出浮点数的精度为 nwidth(w)指定输出宽度为 w 个字符fill(c)在指定输出宽度的情况下,输出宽度不敷用 c 添补setf(fmtfl, mask)在当前格式的根本上,追加 fmtfl 格式,而且删除 mask 格式,其中mask参数可以省略unsetf(mask)在当前格式的根本上,删除 mask 格式 对于上面函数中的 flags 函数的fmtfl参数,setf() 函数中的 fmtfl 参数以及 unsetf() 函数可以选择下面的值:
标志作用ios::boolapha把 true 和 false 输出为字符串ios::left输出数据在本域宽范围内向左对齐ios::right输出数据在本域宽范围内向右对齐ios::internal数值的符号位在域宽内左对齐,数值右对齐,中间由添补字符添补ios::dec设置整数的基数为 10ios::oct设置整数的基数为 8ios::hex设置整数的基数为 16ios::showbase逼迫输出整数的基数(八进制数以 0 开头,十六进制数以 0x 打头)ios::showpoint逼迫输出浮点数的小点和尾数 0ios::uppercase在以科学记数法格式 E 和以十六进制输出字母时以大写表现ios::showpos对正数表现“+”号ios::scientific浮点数以科学记数法格式输出ios::fixed浮点数以定点格式(小数形式)输出ios::unitbuf每次输出之后革新全部的流 setf(fmtfl, mask)和 unsetf(fmtfl, mask) 中的mask 参数,可以传递为下面的几个:
标志作用ios::adjustfieldios::left , ios::right , ios::internalios::basefieldios::dec ,ios::oct ,ios::hexios::floatfieldios::scientific , ios::fixed 利用 cout 成员函数的示例步调如下:
bool testCoutUsingflags() {
{
// setf(fmt,mask) 在当前格式的基础上追加 fmt flag, 并且删除 mask 格式
std::cout.setf(std::ios::boolalpha);
bool a = true;
std::cout << "bool a:" << a << std::endl;
int m = 100;
std::cout.setf(std::ios::hex, std::ios::basefield);
std::cout << "int m:" << m << " bool a " << a << std::endl;
// 去除相应的标志
std::cout.unsetf(std::ios::boolalpha);
std::cout << "hex print int m:" << m << " bool a " << a << std::endl;
std::cout.setf(std::ios::dec, std::ios::basefield);
int n = 0x110;
std::cout << "dec print int n:" << n << std::endl;
std::cout.setf(std::ios::oct, std::ios::basefield);
std::cout.setf(std::ios::showbase);
std::cout << "oct print int n:" << n << std::endl;
}
{
std::cout.setf(std::ios::fixed, std::ios::floatfield);
float f = 1 / 3.0f;
std::cout << "float f in fixed is:" << f << std::endl;
std::cout.precision(10);
std::cout << "float f precision 10 in fixed is:" << f << std::endl;
std::cout.setf(std::ios::scientific, std::ios::floatfield);
std::cout.precision(3);
std::cout << "float f in scientific is:" << f << std::endl;
std::cout.setf(std::ios::uppercase);
std::cout << "float f in scientific uppercase is:" << f << std::endl;
}
{
std::cout.width(50);
std::cout.fill('_');
std::cout.setf(std::ios::left, std::ios::adjustfield);
std::cout << "this is my demo" << std::endl;
std::cout.unsetf(std::ios::adjustfield);
std::cout.width(50);
std::cout.fill('_');
std::cout.setf(std::ios::right, std::ios::adjustfield);
std::cout << "this is my demo" << std::endl;
}
return true;
}
输出结果如下:
bool a:true
int m:64 bool a true
hex print int m:64 bool a 1
dec print int n:272
oct print int n:0420
float f in fixed is:0.333333
float f precision 10 in fixed is:0.3333333433
float f in scientific is:3.333e-01
float f in scientific uppercase is:3.333E-01
this is my demo___________________________________
this is my demo
this is my demo
利用流操纵算子
流操纵算子实在iomanip中定义的,要利用这些流操纵算子,必须包含此头文件:
注意下面的 *号,表现默认利用的算子,好比: 在默认情况下,整数利用十进制形式输出
流操纵算子作用*dec以十进制形式输出整数hex以十六进制形式输出整数oct以八进制形式输出整数fixed以小数形式输出浮点数scientific以科学计数法计数形式输出浮点数left左对齐,宽度不敷的时候添补字符到右边*right右对齐,宽度不敷的时候添补字符到左边setbase(b)设置输出整数的进制,b=8、10或者16setw(w)指定输出宽度为w个字符,或者输入字符串读取w个字符setfill(c)指定输出宽度的情况下,输出宽度不敷用字符c添补(默认是利用空格添补)setprecision(n)输出浮点数的精度为 n, 就是小数点后应该暴露的位数boolaplha把 true 和 false 输出为字符串noboolalpha把true 和 false 输出为0,1showbase输出数值进制的前缀noshowbase不输出数值进制的前缀showpoint总是输出小数点*noshowpoint只有当小数部分存在时才表现小数点showpos在非负数中表现+*noshowpos在非负数中不表现+uppercase十六进制利用 A~E,设置表现前缀,那么前缀输出为0X*nouppercase十六进制利用 a~e,设置表现前缀,那么前缀输出为0x 利用流操纵算子控制输出的综合步调如下:
bool testCoutUsingStreamflags() {
// stream operation flag will take effect all time util you set another flag
bool a = false;
std::cout << "bool a:" << std::boolalpha << a << std::endl;
std::cout << "bool a:" << std::noboolalpha << a << std::endl;
// showbase and dec oct & hex
int m = 80;
std::cout <<"dec int m:" << std::dec << std::showbase << m << std::endl;
std::cout << "hex int m:" << std::hex << std::showbase << m << std::endl;
std::cout << "oct int m:" << std::oct << std::showbase << m << std::endl;
// std::showpos 显示 + -
std::cout << "dec int m:" << std::dec << std::showbase << std::showpos << m << std::endl;
// setw and setfill
std::cout << std::left << std::setw(50) << std::setfill('_') << "hello world" << std::endl;
std::cout << std::right << std::setw(50) << std::setfill('_') << "hello world" << std::endl;
std::cout << std::internal << std::setw(50) << std::setfill('_') << "hello world m:" << m << std::endl;
std::cout << std::noshowpos << std::endl;
int n = 100;
std::cout << std::setbase(16) << std::showbase << "int n:" << n << std::endl;
float f = 1 / 3.0f;
// 0.333333
std::cout << std::fixed << "f = " << f << std::endl;
// 0.33333
std::cout << std::fixed << std::setprecision(5) << "f = " << f << std::endl;
// 3.33333e-1
std::cout << std::scientific << std::setprecision(5) << "f = " << f << std::endl;
// 3.33333E-1
std::cout << std::scientific << std::uppercase << std::setprecision(5) << "f = " << f << std::endl;
// std::showpoint 强制输出浮点数的小点和尾数0
std::cout << std::fixed << std::showpoint << std::setprecision(5) << "f = " << f << std::endl;
{
// print pointer 指针有做特殊的处理
int* ptr = new int(10);
std::cout << std::showbase << std::hex << ptr << std::endl;
std::cout << std::showbase << std::hex << reinterpret_cast<intptr_t*>(ptr) << std::endl;
delete ptr;
}
return true;
}
输出结果如下:
basic test main enter
basicCplusplusCout::testbasicCplusplusCoutImpl enter
bool a:false
bool a:0
dec int m:80
hex int m:0x50
oct int m:0120
dec int m:+80
hello world_______________________________________
_______________________________________hello world
____________________________________hello world m:+80
int n:0x64
f = 0.333333
f = 0.33333
f = 3.33333e-01
f = 3.33333E-01
f = 0.33333
000001E419046150
000001E419046150
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]