标准库_IO 流
1. I/O相关的类、对象
1.1 类


1.2 标准输入、输出
(1)继承关系

(2)标准流对象
cin:istream对象,标准输入
cout:ostream对象,标准输出
cerr:ostream对象,标准错误输出
1.3
不能拷贝或对IO对象赋值
不能将形参、返回类型设置为流类型,而用 引用方式传递或返回流 , 读写IO对象会改变其状态,
传递和返回的引用不能是const的
1.4 条件状态:


流发生错误时相应的标志会置位/复位,只有当流处于无措状态时才能继续操作
使用流时检查是否出于良好的状态:
while(cin>>word)
1.5 缓冲区
(1)
缓冲刷新:
程序正常结束
缓冲区满
endl显式刷新缓冲区
每个输出操作后,用操纵符 unitbuf 设置流的内部状态清空缓冲区;对cerr都是设置了unitbuf的
读写关联的流时,关联到的流会刷新缓冲区。如读cin、写cerr会导致cout的缓冲区刷新
(2)
cout<<"hello"<<endl; //输出字符串和换行,刷新缓冲区 cout<<"hello"<<flush; //输出字符串,刷新缓冲区 cout<<"hello"<<ends; //输出字符串和一个空字符,刷新缓冲区
(3)
cout<<unitbuf; //所有输出操作后立刻刷新缓冲区 cout<<nounitbuf;
(4)关联流
输入流关联到输出流、输出流关联到输出流

ostream *old_tie = cin.tie(nullptr); //cin不再与原来的某个流关联 cin.tie(&cerr); //cin与cerr关联,因此读取cin时会刷新cerr cin.tie(old_tie); //重建原来的关联
1.6 其他输入、输出方式
将输入流当作不知类型的字节序列读取(而不是特定字节数如char、int、string等)

(1)get()
int ch; while((ch = cin.get()) != EOF) { cout.put(ch); }
(2)get(char &ch)
从流读取一个字符,包括 空白字符 存储到ch
(3)get(char *sink,streamsize size,char delimiter)
从istream读取size个字符到sink,直到流中没有字符了或读取到最大数size或遇到终止字符 delimiter(这个delimiter不会被读入,而是留在istream中作为istream的下一个字符)
去掉这个字符:

(4)getline
istream成员函数:

标准库<string>中的非成员函数

(5)输入流实际提取的字符数

(6)输出流的write与输入流的read


2. 文件输入、输出
头文件<fstream>(这个头文件里面包含了<iostream>)
2.1
fstream、ifstream、ofstream对象可用的操作:

对于空的流对象,需要调用open打开文件
2.2 文件模式

需要多个模式,用 | 连接各个模式
2.3 定位


pos是指定绝对位置:0表示文件开始
off是相对dir的相对位置
dir:
ios_base::beg 文件开始
ios_base::cur 文件当前位置
ios_base::end 文件结尾
3. string流

istringstream:获取字符串到istringstream流对象,从流中提取数据 >>、read、get
ostringstream:把其他类型数据写入ostringstream流对象 <<、out、write
(1)istringstream
从这个流的对象里面获取数据,因此重载了操作符 >>
初始化:
istringstream istrstrm("abcdefg"); //开始初始化
istrstrm.str("12 345");//流重新初始化为"12 345"
常用成员函数:一般是从流中提取数据
带格式: 实现字符串转数字
istrstrm.str(); //查看istringstream流中存储的字符串内容,只是查看,并没有从流里面取
string a,b; istrstrm>>a>>b; //将流中数据"12"保存到字符串a中,"345"保存到b中
//或者从字符串中提取算术值 "123" --> 123
istrstrm.str("12 3.14"); //重新初始化 中间是空格、换行符都可以
int a;
float b;
istrstrm>>a>>b; //a为int的12 b为float的3.14
//若b声明为int,则只会把3.14中的3取出来存到b
/*
很方便的实现字符串转数字
<cstdlib>中的其它字符串转数字方法:
int atoi(const char *nptr);
long atol(const char *nptr);
long long atoll(const char *nptr);
float atof(const char *nptr);
*/
无格式:get、read、getline等
istrstrm.str("0123"); char ch = istrstrm.get(); //获取一个字符存到ch,这里取了'0'到ch 流中剩下"123"
streamsize num = istrstrm.gcount(); //最近一次 无格式 从流获取的字符数,这里是上面的get所获取的数:1
istrstrm.str("0\n123");
char str[4];
istrstrm.read(str,4); //从流读取4个字符 '0'、'\n'、'1'、'2' 到str
num = istrstrm.gcount(); //num为4
(2)ostringstream
向这个流对象里面写数据(string)进去, 重载了操作符 <<
初始化:
ostringstream ostrstrm("1234"); ostrstrm.str("5678");
成员函数:
无格式:<<
带格式:put、write
<<、put、write会覆盖掉初始化的内容(写几个到流里面就覆盖几个)
这个流对象的作用:组合各种类型数据成字符串
ostringstream ostrstrm; string name = "wa ha ha"; int age = 10; ostrstrm<<"name:"<<name<<endl; ostrstrm<<"age"<<age<<endl;
对比istringstream、ostringstream:
需要组合各种类型数据存到字符串,可用ostringstream
需要从字符串中提取有用数据、格式化的数据,用istringstream

浙公网安备 33010602011771号