目录
①整数流的基数:流操纵算子dec, oct, hex, setbase
②控制浮点数精度的流操纵算子(precision, setprecision)
一、流操作算子的作用:
C++ 流操纵算子 (格式控制) 使用成员函数控制格式化输入输出时,每个函数调用需要写一条语句,尤其是它不能用在插入或提取运算符的表达式中,而使用 操纵算子 ,则可以在插入和提取运算符的表达式中控制格式化输入和输出。
二、流操纵算子的头文件iomanip
iomanip:
io代表输入输出,manip是manipulator(操纵器)的缩写(在c++上只能通过输入缩写才有效)。
功能:
用来对输入输出操作的格式进行更加方便的控制,在ios_base基类的基础上将每一种格式的设置和删除都进行了函数级的同名封装,提供了全局的调用接口函数,支持在运算符“<<”和“>>”上的多次使用,配合ios_base实例的控制。是I/O流控制头文件,就像C里面的格式化输出一样。
如果在一次输出过程中需要混杂多种格式,使用ios_base的成员函数来处理就显得很不方便。STL另提供了iomanip库可以满足这种使用方式。
接口:
控 制 符 |
作用 |
setbase(n) |
设置整数为n进制(n=8,10,16) |
setfill(n) |
设置字符填充,c可以是字符常或字符变量 |
setprecision(n) |
设置浮点数的有效数字为n位 |
setw(n) |
设置字段宽度为n位 |
setiosflags(ios::fixed) |
设置浮点数以固定的小数位数显示 |
setiosflags(ios::scientific) |
设置浮点数以科学计数法表示 |
setiosflags(ios::left) |
输出左对齐 |
setiosflags(ios::right) |
输出右对齐 |
setiosflags(ios::skipws) |
忽略前导空格 |
上述接口与ios_base的格式控制成员是对应的,可以二者配合进行输出格式的精准控制。其中的精度控制默认是6位有效数字,科学计数法中的指数部分e为默认小写。setw设置的宽度如果小于字段宽度会失效 。
三、流操纵算子的分类
①整数流的基数:流操纵算子dec, oct, hex, setbase
实例如下
#include <iostream> #include <iomanip> using namespace std; int main() { /*整数流的基数:流操纵算子dec, oct, hex, setbase*/ int n = 144; cout << n << endl; //十进制 144 cout << hex << n << endl; //十六进制 90 cout << dec << n << endl; //十进制 144 cout << oct << n << endl; //八进制 220 cout << setbase(16) << 110 << endl; //十六进制 6e return 0; }
②控制浮点数精度的流操纵算子(precision, setprecision)
precision是成员函数 setprecision为流操纵算子 二者调用方式不同 但功能相同
我们需要知道的是 精度有两方面的含义:
一是指定输出浮点数的有效位数(非定点方式输出时)
二是指定输出浮点是的小数点后的有效位数(定点方式输出时)
实例如下
#include <iostream> #include <iomanip> using namespace std; int main() { /*浮点数的精度(precision, setprecision)*/ double x = .89, y = 12.34567; cout.precision(6); cout << x << " " << y << endl; //1.23457e+06 12.3457 cout << setprecision(6); cout << x << " " << y << endl; //1.23457e+06 12.3457 /*以小数点位置固定的方式输出*/ cout << setiosflags(ios::fixed) << setprecision(6) << x << " " << y << endl; //. 12. /*取消以小数点位置固定的方式输出*/ cout << setiosflags(ios::fixed) << setprecision(6) << x << '\n' << resetiosflags(ios::fixed) << x << endl; //. 1.23457e+06 return 0; }
③设置域宽(setw,width)
setw, width 功能相同, 一个是成员函数,一个是流操作算子,二者调用方式不同
都能够指定输入输出的宽度
实例如下
#include <iostream> #include <iomanip> using namespace std; int main() { /*设置域宽 setw width 两者功能相同 一个是成员函数 一个是流操纵算子 */ int w = 4; char s[10]; //输入 cin.width(5); //设定输入域宽 /*缺省时会补空格*/ /*宽度设置有效性是一次性的,在每次读入和输出前都要设置宽度*/ while (cin >> s) { cout.width(w++); cout << s << endl; cin.width(5); } return 0; /* 1234 5678 90 */ }
④综合实例
#include <iostream> #include <iomanip> using namespace std; int main() { int n = 141; // 1)分别以十六进制、十进制、八进制先后输出n cout << "1) " << hex << n << " " << dec << n << " " << oct << n << endl; double x = .89, y = 12.34567; //2)保留5位有效数字 cout << "2) " << setprecision(5) << x << " " << y << " " << endl; // 3)保留小数点后面5位 cout << "3) " << fixed << setprecision(5) << x << " " << y << endl; // 4)科学计数法输出,且保留小数点后面5位 cout << "4) " << scientific << setprecision(5) << x << " " << y << endl; //5)非负数要显示正号,输出宽度为12字符,宽度不足则用'*'填补 cout << "5) " << showpos << fixed << setw(12) << setfill('*') << 12 << endl; //6)非负数不显示正号,输出宽度为12字符,宽度不足则右边用填充字符填充 cout << "6) " << noshowpos << setw(12) << left << 12.1 << endl; //7)输出宽度为12字符,宽度不足则左边用填充字符填充 cout << "7) " << setw(12) << right << 12.1 << endl; //8)宽度不足时,负号和数值分列左右,中间用填充字符填充 cout << "8) " << setw(12) << internal << -12.1 << endl; cout << "9) " << 12.1 << endl; return 0; /* 1) 8d 141 215 2) 1.2346e+06 12.346 3) .89000 12.34567 4) 1.23457e+06 1.23457e+01 5) **********14 6) 12.10000**** 7) ****12.10000 8) -***12.10000 9) 12.10000 */ }
④用户自定义的流操纵算子
因为iostream 里面对 流插入运算符<<进行了重载
ostream & operator << (ostream & (*p) (ostrean & ) );
该函数内部会调用p所指向的函数 且*this为指针
实例
#include <iostream> #include <iomanip> using namespace std; ostream& tab(ostream& output) //必须这样的函数才能通过cout<< { return output << '\t'; } int main() { cout << "aa" << tab << "bb" << endl; //aa bb return 0; }
参考:
程序设计与算法(三)C++面向对象程序设计_北京大学_中国大学MOOC(慕课)
iomanip_百度百科
今天的文章
流操作算子_c++输入输出流分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/81046.html