在C++程序输出数据时,往往使用默认格式,由系统根据数据类型来输出;但是当我们想要输出特定格式的数据时,可以通过使用控制符来达到我们的目的。例如:以八进制、十进制或十六进制,科学计数法输出,添加+号,设置输出字段位域与对齐方式,实数的有效位数或小数位数等。
常见的控制符如下表
控制符 | 描述 |
oct | 设置整数基数为8,即八进制 |
dec | 设置整数基数为10,即十进制 |
hex | 设置整数基数为16,即十六进制 |
setbase(n) | 设置整数基数为n,n值为8、10或16 |
setw(n) | 设置下一字段输出位域的宽度为n位,即设置后下一<< <<间的内容 |
setiosflags(ios::left) | 输出数据位域中左对齐,相对于setw(n)的变化 |
setiosflags(ios::right) | 输出数据位域中右对齐,相对于setw(n)的变化 |
setfill(c) | 输出数据位域中空白填充c字符,例如:setfill('*') |
setprecision(n) | 设置实数输出的有效位数为n为,包括整数和小数,当setiosflags(ios::scientific)和setiosflags(ios::fixed)项设置后表达为小数的位数 |
setiosflags(ios::scientific) | 设置浮点数以科学计数法输出(用e描述) |
setiosflags(ios::fixed) | 设置浮点数固定小数位数,由setprecision(n)决定 |
setiosflags(ios::uppercase) | 设置以科学计数法或十六进制输出时字母大写 |
setiosflags(ios::showpos) | 设置正数输出时,前边添加+号 |
setiosflags(ios::shipws) | 忽略前导空格 |
resetiosflags | 取消对应控制符设置的功能,括号内为上述可能的内容;例如:setiosflags(ios::scientific)和setiosflags(ios::fixed)不能同时设置,需先取消前者后者才有效。 |
上述控制符定义在头文件iomanip中,编写程序时需要添加该头文件。
代码示例:
1 #include <iostream> 2 #include <iomanip> 3 4 using namespace std; 5 int main(void) 6 { 7 int a = 10; 8 cout << "设置基数为dec :" << dec << a << endl; 9 cout << "设置基数为hex :" << hex << a << endl; 10 cout << "设置基数为otc :" << oct << a << endl; 11 cout << "不再设基数值 :" << a << endl; // 依旧保持最近的输出格式,即oct格式输出 12 cout << "设置基数值为10:" <<setbase(10) << a << endl; 13 14 char *p = "hello"; 15 16 /* setw(n)设置位域宽度,设置宽度仅下一字段有效 */ 17 cout << "位域20:" << setw(20) << p << endl; // 设置输出位域,仅下一个字段有效,即设置后接的<< << 18 cout << "位域20:" << setw(20) << "123" << "456" << "789" << "-->位域123字段有效" << endl; 19 20 /* 21 setiosflags(ios::left) :左对齐,取消在前面加re 22 setiosflags(ios::right) :右对齐,取消在前面加re 23 注意 :设置其中一项后,要取消后才能设置另一项,否则无效。 24 */ 25 cout << setiosflags(ios::right); // 右对齐 26 cout << "在右边:" << setw(20) << p << endl; 27 cout << resetiosflags(ios::right); // 关闭右对齐 28 cout << setiosflags(ios::left); // 左对齐 29 cout << "在左边:" << setw(20) << p << endl; 30 31 /* setfill(c) 空白填充,需配合setw(n), 位域当中未显示的填充c字符,如'*'*/ 32 cout << "以下空白填充*:" << setfill('*') << endl; // 空白填充 33 cout << setw(20) << p << endl; 34 cout << resetiosflags(ios::left) << setiosflags(ios::right); // 关闭左对齐,开始右对齐 35 cout << setw(20) << p << endl; 36 37 /* 38 setprecision(5):设置实数有效数据个数或小数个数 39 setiosflags(ios::scientific): 科学计数法输出,与fix不同时出现,添re+取消设置 40 setiosflags(ios::fixed) :设置浮点数以固定的小数位数显示,与scientific不同时出现,添re+取消设置 41 setiosflags(ios::uppercase):字母大写 42 setiosflags(ios::showpos):正数显示+号 43 */ 44 double fValue = 123.456789; 45 cout << "输出浮点数:" << fValue << endl; 46 cout << "以下设置一直有效-->" << endl; 47 // 设置输出实数有效数字个数,包含正数和小数,当以固定形式和科学计数法输出时,则指有效小数位数 48 cout << "有效数字设为5 :" << setprecision(5) << fValue << endl; 49 cout << "科学计数法输出 :" << setiosflags(ios::scientific) << fValue << endl; // 以科学计数方式输出 50 cout << "输出字母大写 :" << setiosflags(ios::uppercase) << fValue << endl; // 科学计数字母E和十六进制字母X等输出大写 51 cout << "输出正数添加+号:" << setiosflags(ios::showpos) << fValue << endl; // 输出正数添加+号 52 cout << "固定小数位数 :" << resetiosflags(ios::scientific) << setiosflags(ios::fixed) ; // 固定实数以小数格式输出的位数,即设置后有效输出个数变成有效小数位数 53 cout << setprecision(5) << fValue << endl; 54 55 //cout << setiosflags(ios::shipws) <<" 忽略前导空格" << endl; // 不支持,未验证 56 57 return 0; 58 }
代码运行结果: