I/O流概念: 流是一种抽象,它负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动
程序将流动对象看作是文件对象的化身
读操作为:提取
写操作为:插入
在I/O流中 已经声名了4个流对象
输入:cin 输出:cout cerr clog
I/O流类层次图
抽象流基类
类名 | 头文件 | |
ios | ios | 流基类 |
输入流类:
类名 | 头文件 | |
istream | istream | 通用输入流 |
ifstream | fstream | 文件输入流 |
istringstream | sstream | 字符串输入流 |
输出流:
类名 | 头文件 | |
ostream | ostream | 通用输出流 |
ofstream | fstream | 文件输出流 |
ostringstream | sstream | 字符输出流 |
输入输出流:
类名 | 头文件 | |
iostream | istream | 通用输入输出流 |
fstream | fstream | 文件输入输出流 |
stringstream | sstream | 字符输入输出流 |
流缓冲区类:
类名 | 头文件 | |
streambuf | streambuf | 抽象流缓冲 |
filebuf | fstream | 磁盘文件流缓冲区 |
stringbuf | sstream | 字符串的流缓冲区 |
cout:标准输出流
cerr:标准错误输出流,没有缓冲,发送给它的内容立即被输出
clog :类似与cerr 但clog有缓冲,缓冲区满时被输出
1.常用的插入运算符和操纵符:
cout.width() | 输出宽度 |
cout.fill() | (默认空格)设置填充 |
setw() | 输出宽度 |
1.使用cout.width()控制宽度
vector<int>p1;
for (int i = 0; i < 5; i++)
{
p1.push_back(i);
}
for (vector<int>::iterator it = p1.begin(); it != p1.end(); it++)
{
//10的宽度
cout.width(10);
cout << *it << endl;
}
2.默认以空格填充
用cout.fill()可以改变填充
vector<int>p1;
for (int i = 0; i < 5; i++)
{
p1.push_back(i);
}
for (vector<int>::iterator it = p1.begin(); it != p1.end(); it++)
{
//10的宽度
cout.width(10);
//用*填充
cout.fill('*');
cout << *it << endl;
}
3.使用setw()指定宽度
需要添加头文件#include<iomanip>
vector<int>p1;
for (int i = 0; i < 5; i++)
{
p1.push_back(i);
}
//设置宽度
cout << setw(6) << p1[0] << endl;;
cout << setw(7) << p1[1] << endl;
cout << setw(8) << p1[2] << endl;
cout << setw(9) << p1[3] << endl;
cout << setw(10) << p1[4] << endl;
2.对齐方式
头文件:#include<iomanip>
使用 setiosflags() 操纵符设置
用 resetionsflags () 来关闭
以下可以 用 | 混合使用
ios_base::skipws | 输出中跳过空白 |
ios_base::left | 左对齐 填充右边 |
ios_base::right | 右对齐 填充左边 |
ios_base::internal | 在规定宽度内,指定前缀符号子后,数值之前插入填充夫符号 |
ios_base::dec | 以十进制形式格式化数值 |
ios_base::oct | 以八进制形式格式化数值 |
ios_base::hex | 以十六进制形式格式化数值 |
ios_base::showbase | 插入前缀符号以表明整数的数值 |
ios_base::showPoint | 对浮点数值显示小数点和尾部的0 |
ios_base::uppercase | 对于十六进制数值显示大写字母A-F,对于科学格式显示大写字母E |
ios_base::showpos | 对于正数显示‘+’号 |
ios_base::scientific | 以科学格式显示浮点数值。 |
ios_base::fixed | 以定点格式显示浮点数值(不含指数部分) |
ios_base::unitbuf | 在每次插入之前转储并清除缓冲区内容 |
3.精度
头文件:#include<iomanip>
利用 setprecision 操纵符
浮点数默认精度为 6
ios_base::fixed | 不够 后面补零 |
ios_base::scientific | 用科学计数法 |
double man[] = { 1.23, 25.36, 655.655, 255,2444, 2555,244444 };
string name[] = { "A","B","C","D","E" };
//不用科学计数法
cout << setiosflags(ios_base::fixed);
for (int i = 0; i < 5; i++)
{
cout << setiosflags(ios_base::left)
<< setw(8) << name[i]
<< resetiosflags(ios_base::left)
<< setw(10)
//设置精度
<< setiosflags(3) << man[i] << endl;
}
return 0;
4.输入输出的成员方法
(cin)输入的成员方法:
get() | 获取输入流中的一个字符,会删除输入该字符流中的 |
gcount() | 返回上次从输入流提取出的字符个数 |
getline(str,n,ch) | 从输入流中接收 n-1 个字符给 str 变量,当遇到指定 ch 字符时会停止读取,默认情况下 ch 为 '\0' |
peek() | 返回输入流中的第一个字符 |
putback(c) | 将字符 c 置入输入流(缓冲区) |
ignore(n,ch) | 从输入流中逐个提取字符,但提取出的字符被忽略,不被使用,直至提取出 n 个字符,或者当前读取的字符为 ch |
operator>> | 用于读取指定类型的数据,并返回输入流对象本身(重载>>运算符) |
get()的用法
- cin.get()
- cin.get(ch) 拥有一个参数,把读取到的字符赋值给 ch 读取成功则函数返回true,失败则返回flase
- cin.get(char * ch ,number,end) ch为字符数组,number为读取的字符个数,end为结束条件(可以不填写)
注意事项:
- cin.get(char * ch ,number,end) 最多只会读取 number-1个字符,最后一个字符存放结束符 '\0' 。
- 当 number 大于 字符字符数组的容量时,如果输入的个数小于字符字符数组的容量:可以正常运行,输入的个数大于等于字符字符数组的容量:报错,数组越界
getline()的用法
- 第三个参数默认为 '\0'
- getline()可以读取空格
(cout)输出的成员方法
put() | 输出单个字符。 |
write() | 输出指定的字符串。 |
tellp() | 用于获取当前输出流指针的位置。 |
seekp() | 设置输出流指针的位置。 |
flush() | 刷新输出流缓冲区。 |
operator<< | 重载 << 运算符,使其用于输出其后指定类型的数据。 |