第8章 IO库

来源:互联网 发布:java培训公司有哪些 编辑:程序博客网 时间:2024/05/29 06:53
三个主要的头文件:
iostream 用于读写流的基本类型
istream, ostream, iostream;
ifstream 用于读写命名文件
ifstream, ofstream, fstream;
sstream 读写内存string对象的类型
istringstream, ostringstream, stringtream

继承机制可以声明一个类继承与另一个类。比如以上的三个头文件包含的类型分别继承自isream, ostrem,为他们的派生类,通常使用派生类时可以将其当做其基类来使用。

查询流的状态
IO库定义了iostate类型,提供了表达流状态的完整功能。
iostate有下列标志:
badbit:发生致命错误
eofbit:已经发现EOF
failbit:一个非致命x

管理条件状态
clear()函数:
接受参数:清除所有错误标志,执行后,调用good会返回true。
接受参数:接受一个iostate值,表示流的新状态。我们首先用rdstate()读出当前的条件状态,然后用位操作将所需位复位来生成新的状态。

关于缓冲区
每个输出流都管理一个缓冲区,用来保存程序读写的数据,缓冲区在下列情况下回进行刷新:
程序正常结束。
  缓冲区满时。
使用刷新缓冲操作符。
在每个输出操作之后,用操纵符unitbuf设置流的内部状态,来清空缓冲区。
  一个输出流被关联到另一个流。默认情况下,cin和cerr都关联到cout,因此,读cin和cerr时,cout的缓冲区刷新.
刷新缓冲区操作符:
endl :输出换行,刷新缓冲。
flush : 只刷新缓冲。
ends : 输出一个空字符,刷新缓冲。
使用unitbuf操作符时相当于告诉流在接下来的每次写操作之后进行一次flush操作,而nounitbuf操作符重置流,使其回到正常的缓冲方式。
程序崩溃时,输出缓冲区不刷新,程序处于等待打印状态,所以调试崩溃的程序时需考虑到认为已经输出的数据是否已经刷新。


流的关联作用:
cin >> ival; 默认时,标准输入输出是关联的,所以执行此语句时,cout刷新。
tie:
不带参数:返回指向输出流的指针。若此对象关联到一个输出流,返回指向这个流的指针。否则,返回空指针。 ostream* old_tie = cin.tie(nullptr);
带参数:接受一个指向ostream的指针,将自己关联到此ostream.  cin.tie(&cout);

文件的输出输入
ifstream 从文件读数据
ofstream 向文件写数据
fstream 读写给定文件
fstream fstrm(s, mode);  创建一个fstrm文件流, 并以mode方式打开文件s.

使用文件流对象
ifstream  in(ifile);   定义一个输入流in, 初始化为从ifile文件读数据
ofstream out; 定义一个输出流out, 未做初始化处理。

文件模式:
in , out, app, ate(打开文件立即追加到文件末尾),trunc(截断文件),binary(以二进制方式进行IO)。
out只可对oftream和fstream设定。
in 只可对ifstream和fstream设定。
trunc设定时,不可设定app,在app模式下,out默认设定。
即使未指定trunc,以out模式打开的文件也会被截断。
ate和binary可用于任何类型的文件流对象,且可以与其他任何文件模式组合使用。
每个文件流类型都定义了默认的文件模式。例如ifstream定义的文件流默认in模式打开文件。

以out模式打开文件会丢弃已有数据
ofstream out("file"); 此时ofstream定义的流默认out形式,即同时默认trunc(截断)模式。
保留被ofstream打开文件中已有数据的唯一方法就是显式的指定app或in模式:
ofstream out("file", ofstream :: app);

每次调用open都会确定其文件模式,一般隐式设置的模式是定义时默认的文件模式。

<sstream>:
定义了三个类:istringstream, ostringstream, stringstream分别来进行类的输入、输出、输入输出操作。且每个类都有一个对应的宽字符版本。且<sstream>中使用string对象来代替字符数组,避免缓冲区溢出,而且传入参数或对象内容被自动推到出来,避免使用格式不正确引发错误。
宽字符:
char是8位字符类型,最多只能包含256种字符,许多外文集所含的字符数目超过256个,char类型无法表示。用多个字节来代表的字符称为宽字符。比如Unicode就是宽字符编码的一种实现,类型表示为
wchar_t.













0 0