欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++ Primer 第八章学习笔记

程序员文章站 2024-02-29 12:18:04
...

第八章 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

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