首先看一下io库,标准函数库,stl这些概念之间都是怎么样一个关系
什么是io库?
io库就是有一些标准io类组成的类库
通过这些io类可以实现对可实现对设备(控制台,文件等)的io操作,对内存的io(即string类)操作
其中对控制台的io操作一般通过iostream头文件中的流类
对文件的io操作一般通过fstream头文件中的流类
对string的io操作一般通过sstream头文件中的流类
普通流:头文件
文件流:头文件
这个头文件里面的类继承制第一个头文件中的类
所以继承了它们的成员函数和成员变量
除了继承的操作它也有自己的一些操作
-
介绍
包含了上面这些类(没有w的表示操作char类型 有w的表示操作宽字符类型)
istream表示读流类 ostream表示写流类
cin是istream的对象 表示标准输入
cout是ostream的对象 表示标准输出
cerr是ostream对象 表示标准错误
<<和>>是istream和istream的成员运算符函数分别表示写入数据和读出数据
getline是istream的成员函数表示读取一行数据 存入string对象中 -
注意点
1.流类不能拷贝赋值给别的对象,所以流类不能作为函数形参,
所以要想在函数参数中用流类,要以引用的形式传进去
而且由于读写一个io对象时,其状态会改变,所以不能设置为const类型
2,io错误问题 -
3.缓冲区相关问题:
默认情况下下 我们在写比如cout<<"hello"的时候,经过的过程是 字符串->缓冲区->设备(屏幕)
为什么不直接输出到设备(屏幕)呢?
因为设备的写操作是很费时的,所以操作系统的办法是把所有的这些输出流命令先攒到缓存区,等到缓存区满的时候就采用系统级写操作一下子输出到设备,这样操作系统的效率会高很多但是我们有的时候就是想一行敲完就把这一行显示出去不想等待怎么办?或者说有哪些场合是字符串一输入到缓冲区就直接写入设备的(缓存区刷新)?
1.程序正常结束
2.缓冲区满
3.用缓冲区刷新操纵符--endl,flush,ends
4.用unibuf操纵符 -
5.关联输入和输出流
-
介绍
-
注意点
1.创建文件流对象时,可以传进去文件名这样该对象会自动调用open函数,文件名既可以是string对象,也可以是c风格字符串
2.在要求基类对象的地方,我们可以用集成对象代替,所以主任李再接受iostream类型引用对象的地方 我们可以用fstream或者sstream对象代替
即函数形参是&iostream 我们可以传进去fstream或者sstream
3.调用open可能会失败 所以我们在对一个文件流使用open函数后应该对其进行检测是否成功打开, 检测方法如下
ostream out;
out.open(file1);
if(out)//如果打开成功则条件为真
{...}
out.close;
out.open(file2);
当一个文件流open失败,我们要把它绑定到另外一个的时候,应该先关闭再打开另一个
4.当一个fstream离开其作用域的时候该对象会被自动销毁,与之关联的文件会自动关闭.
5.关于文件模式
-
string流:头文件
-
介绍
string流也有它自己特有的一些操作