(一)流
一.流
定义:数据从一个对象到另一个对象的传输。
功能:标准输入输出+文件处理
分类:
- 文本流 一串ASCII字符
- 二进制流 一串二进制
二.流类型
1.标准I/O流
- ios是抽象类
- ostream是cout,clog,cerr的类
- istream是cin的类
2.文件流类型
- ifstream从文件读取数据
- ofstream向文件写入数据
- iofstream文件读写数据
3.字符串流类型
- istringstream从string读取数据
- ostringstream向string写入数据
- iostringstream读写string数据
三.流对象
通常标准I/O流对象是全局对象不需要定义,而文件流对象和字符串流对象需要用户定义。
标准I/O流对象有以下四个:
NO. | 全局流对象 | 名称 | 缓存 |
1 | cout | 标准输出流 | 带缓存 |
2 | cin | 标准输入流 | 带缓存 |
3 | clog | 标准日志流 | 带缓存 |
4 | cerr | 标准错误流 | 无缓存 |
流对象通常都不能复制。
四.流对象状态
流对象状态在某一个时刻必定处于以下四个状态之一。
NO. | 状态 | 含义 |
1 | good() | 前一个流操作成功 |
2 | eof() | 到输入尾/文件尾 |
3 | fail() | 发生意外事情(读取失败) |
4 | bad() | 发生意外严重事情(磁盘读取失败) |
五.I/O操作
I/O操作主要有如下五种:
- 输入操作:
in >> x
或者getline(in,s)
- 输出操作:
out << x
- 操作符
- 流状态
- 格式化
输出流默认设置
类型 | 进制 | 宽度 | 对齐 | 填充 | 精度 |
整数 | 十进制 | 0 | 右对齐 | 空格 | 1 |
实数 | 十进制 | 0 | 右对齐 | 空格 | 6位数 |
字符串 | - | 0 | 右对齐 | 空格 | 字符串实际长度 |
流的输出控制格式
1.对齐方式
flag(成员函数) | manipulator(操作子) | 作用 |
---|---|---|
ios::left | left | 居左 |
ios::right | right | 居右 |
ios::internal | internal | 输出符号或进制后填充 |
2.宽度设置 (不能持续)
flag(成员函数) | manipulator(操作子) |
width() | setw() 头文件iomanip |
#include <iostream>
using namespace std;
int main(){
//成员函数
int n = -11;
cout.width(6);
cout.flags(ios::right);
cout << n << endl;
//操作子
int m = -21;
cout << setw(7) << right << m << endl;
//混合
cout.width(5); cout << right << m << endl;
}
3.整数输出格式
flag(成员函数) | manipulator(操作子) | 作用 |
ios::dec | dec | 十进制 |
ios::oct | oct | 八进制 |
ios::hex | hex | 十六进制 |
ios::uppercase | uppercase | 使用大写输出十六进制 |
ios::showbase | showbase | 输出带有进制的字符 |
#include <iostream>
using namespace std;
int main(){
//成员函数:
int n = 11;
cout.flags(ios::showbase|ios::oct);
cout << n << endl;
//操作子:
int m = 11;
cout << showbase << oct << m << endl;
}
输出: 013
013
4.浮点数输出格式
①默认最多保留多少位数字 (浮点数格式)
//成员函数:
cout.precision(5);
cout << a << endl;
//操作子:
cout << setprecision(5)
<< a << endl;
②小数点后最多保留多少位(定点数方式)
#include <iomanip>
//成员函数:
cout.flags(ios::fixed);
cout << a << endl;
//操作子:
cout << fixed << a << endl;
③科学计数法输出浮点数
//成员函数:
cout.flags(ios::scientific);
cout << a << endl;
//操作子:
cout << scientific << a << endl;
5.布尔类型
bool a = true;
//输出:1
cout << a << endl;
//输出:true
cout << boolalpha << a << endl; //操作子
cout.flags(ios::boolalpha); //成员函数
cout << a << endl;
6.其他类型
showpos输出十进制0或者整数时,带+-号
int a = 100;
int b = -1;
//操作子:
cout << showpos << a << b << endl;
//成员函数:
cout.setf(ios::showpos);
cout << a << b << endl;
输出:+100-1
复数虚部
a+bi
使用showpos
非常合适。
(二)字符串流
要用头文件:#include<sstream>
自己定义流对象 ,使用string对象来代替字符数组,这样可以避免缓冲区溢出的危险。而且,传入参数和目标对象的类型被自动推导出来,即便使用了不正确的格式化符也没有危险。
#include <iostream>
#include <sstream>
using namespace std;
int main () {
ostringstream oss; //定义输出字符串
oss << 123 << "abc" << 3.1415 << endl;//上面流的也可以用
string s = oss.str(); //把它定义到字符串
cout << s;
istringstream iss("123 abc 3.14");//定义输入字符串
int n;
string str;
float f;
iss >> n >> str >> f;
cout << n << str << f << endl;
}
(三)文件操作
读写:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main () {
string s;
cin >> s;//输出到文件中
ofstream of("./test",ios::app);//输出的文件路径 app是追加
if(of){ //判断文件是否打开
of << s;
of.close();//提前关掉
}
ifstream ifs("./test");//输入
string t;
if(ifs){
ifs >> t;
ifs.close();
}
cout << t << endl;
}