C++ Primer 第八章学习笔记

第八章 IO库


istream ——输入流类型
ostream —— 输出流类型
cin —— 一个istream对象,从标准输入读取数据
cout —— 一个ostream对象,向标准输出写入数据
cerr —— 一个ostream对象,将程序错误写入到标准错误


8.1 IO 类


一些用于IO类的头文件
iostream —— 定义了用于读写流的基本类型 (istream , ostream , iostream)
fstream —— 定义了读写命名文件的类型,(ifstream , ofstream, fstream)
sstream —— 定义了读写内存string对象的类型(istringstream, ostringstream,
iostringstream)


O类型间的关系——继承

以下标准库特性适用于普通流,文件流和string流,以及char或宽字符流


8.1.1 IO对象无拷贝或赋值

不能拷贝或对IO对象赋值
由于不能拷贝IO对象,因此不能将形参或返回类型设置为流类型
进行IO操作的函数常以引用方式传递和返回

8.1.2 条件状态

IO库条件状态
strm::badbit —— 流已崩溃
strm::failbit —— 一个IO操作失败
strm::eofbit —— 流到达了文件结束
strm::goodbit —— 指出流未处于错误状态,此值保证为0
s.eof()—— 若流s的eofbit置位,则返回true
s.fail()—— 若流s的failbit或者badbit置位,则返回true
s.bad()—— 若流s的badbit置位,则返回true
s.good()—— 若流s的goodbit置位,则返回true
s.clear()—— 将流s中所有条件状态复位,将流的状态设置为有效,返回void
s.clear(falgs)—— 根据给定的flags标志位,将流s中对应条件状态位复位。flags类型为strm::iostate.返回void
s.setstate(falgs)—— 置位,返回void
s.rdstate()—— 返回流s的当前条件状态,返回值类型为strm::iostate

流一旦发生错误,其后的IO操作都会失败
确定一个流对象的状态——将他当做一个条件使用:

while(cin >> word)
//ok:读操作成功....

查询流状态

灵活运用上述表格中内容中的eof、bad、fail和good四个状态量

管理条件状态

灵活运用表格中的clear、setstate和rdstate

8.1.3 管理输出缓冲

每个输出流都管理一个缓冲区,用来保存程序读写的数据

缓存刷新原因:1.main函数结束;2.缓存区满; 3.endl显式刷新 4.写cerr; 5.一个输出流可能被关联到另一个流,(读cin或写cerr都会导致cout缓存区刷新)。

显示刷新输出缓冲区的方法: endl ,flush和ends
endl —— 输出换行,然后刷新缓冲区
flush —— 刷新缓冲区,不输出任何字符
ends —— 输出一个空字符,然后刷新缓冲区

每次输出操作后都刷新缓冲区:unitbuf ,nounitbuf(重置流)

cout << unitbuf; //所有输出操作后都会立即刷新缓冲区
cout << nounitbuf; //回到正常缓冲方式

关联输入和输出流 tie() 和 tie (*ostream)

tie() ——返回指向输出流的指针
x.tie(&o) —— 将流x关联到输出流0


8.2 文件输入输出

fstream特有操作

文件输入输出类继承自iostream类,可以使用iostream类的操作外,还具有自己的特性:

fstream特有操作
fstream fstrm;—— 创立一个未绑定的文件流
fstream fstrm(s);—— 创立一个fstream,并打开名为s的文件
fstream fstrm(s,mode); —— 与前一个函数类似,但按指定mode打开文件
fstrm.open(s) —— 打开名为s的文件,并将文件与fstrm绑定
fstrm.close()—— 关闭与fstrm绑定的文件
fstrm.is_open()—— 返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭

8.2.1 使用文件流对象

用fstream代替iostream&

由于fstream继承自iostream,因此当函数中形参为iostream&时,可以将fstream对象传递给该函数

成员函数open和close

如果定义了一个空文件流对象,可以随后调用open来将它与文件关联起来

ifstream in(ifile);
ofstream out;
out.open(ifile+".copy")

因为调用open可能失败,失败后failbit会被置位,所以最好检测open是否成功

if (out)

对一个已经打开的文件流调用open会失败。为了将文件流关联到另一个文件,首先必须关闭已经关联的文件。

自动构造和析构

当一个fstream对象被销毁时,close会自动被调用。

8.2.2 文件模式

文件模式
in —— 以读方式打开
out —— 以写方式打开
app —— 每次写操作前均定位到文件末尾
ate —— 打开文件后立即定位到文件末尾
trunc—— 截断文件
binary —— 以二进制方式进行IO

模式限制:

  • 只有当out被设定时才能设定trunc
  • 只要trunc没有被设定,就可以设定app
  • 由于默认情况下,out模式打开的文件也会被截断,为了保留以out模式打开的文件内容,必须同时指定app模式,或者in模式。

每次调用open时都会确定文件模式


8.3 string 流

stringstream特有操作
sstream strm;—— 创立一个未绑定的stringstream对象
sstream strm(s);—— 创立一个sstream对象,保存string s的一个拷贝
strm.str() —— 返回strm所保存的string的拷贝
strm.str(s) —— 将string s 拷贝到strm中,返回void

8.3.1 使用istringstream

8.3.2 使用ostringstream

不太理解,需要重新再看看

猜你喜欢

转载自blog.csdn.net/lagrangesk/article/details/79401554