Loading

【C++】《C++ Primer 》第八章

第八章 IO库

一、IO类

1. 标准库定义的IO类型

头文件 作用 类型
iostream 从标准流中读写数据 istream, wistream 从流读取数据
ostream, wostream 向流写入数据
iostream, wiostream 读写流
fstream 从文件中读写数据 iftream, wiftream 从文件读取数据
oftream, woftream 向文件写入数据
fstream, wifstream 读写文件
sstream 从字符串中读写数据 istringstream, wistringstream 从string读取数据
ostringstream, wostringstream 向string写入数据
stringstream, wstringstream 读写string

2. IO对象无拷贝或赋值

  • IO对象不能存在容器里.
  • 形参和返回类型也不能是流类型。
  • 形参和返回类型一般是流的引用。
  • 读写一个IO对象会改变其状态,因此传递和返回的引用不能是const的。

3. 条件状态

strm是一种IO类型(如istream), s是一个流对象。

状态 解释
strm:iostate 是一种机器无关的类型,提供了表达条件状态的完整功能
strm:badbit 用来指出流已经崩溃
strm:failbit 用来指出一个IO操作失败了
strm:eofbit 用来指出流到达了文件结束
strm:goodbit 用来指出流未处于错误状态,此值保证为零
s.eof() 若流s的eofbit置位,则返回true
s.fail() 若流s的failbit置位,则返回true
s.bad() 若流s的badbit置位,则返回true
s.good() 若流s处于有效状态,则返回true
s.clear() 将流s中所有条件状态位复位,将流的状态设置成有效,返回void
s.clear(flags) 将流s中指定的条件状态位复位,返回void
s.setstate(flags) 根据给定的标志位,将流s中对应的条件状态位置位,返回void
s.rdstate() 返回流s的当前条件状态,返回值类型为strm::iostate

4. 管理输出缓冲

  • 每个输出流都管理一个缓冲区,执行输出的代码,文本串可能立即打印出来,也可能被操作系统保存在缓冲区内,随后再打印。
  • 导致缓冲刷新(即数据真正写到输出设备或文件)的原因:
    • 程序正常结束,作为main函数的return操作的一部分,缓存刷新被执行。
    • 缓冲区满时,需要刷新缓冲,而后的数据才能继续写入缓冲区。
    • 使用操纵符 endl, 来显式刷新缓冲区。
    • 在每个输出操作之后,可以用操作符unitbuf设置流的内部状态,来清空缓冲区。默认情况下,对cerr是设置unitbuf的,因此写到cerr的内容都是立即刷新的。
    • 一个输出流可能被关联到另一个流。
  • 刷新缓冲区,可以使用如下IO操纵符
    • endl:输出一个换行符并刷新缓冲区。
    • flush:刷新流,单不添加任何字符。
    • ends:在缓冲区插入空字符null,然后刷新。
    • unitbuf:告诉流接下来每次操作之后都要进行一次flush操作。
    • nounitbuf:回到正常的缓冲方式。

二、文件输入输出

1. 文件输入输出

  • 文件流:需要读写文件时,必须定义自己的文件流对象,并绑定在需要的文件上。
  • fstream特有的操作
操作 解释
fstream fstrm; 创建一个未绑定的文件流。
fstream fstrm(s); 创建一个文件流,并打开名为s的文件,s可以是string也可以是char指针
fstream fstrm(s, mode); 与前一个构造函数类似,但按指定mode打开文件
fstrm.open(s) 打开名为s的文件,并和fstrm绑定
fstrm.close() 关闭和fstrm绑定的文件
fstrm.is_open() 返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭

本节练习

8.4 编写函数,以读模式打开一个文件,将其内容读入到一个string的vector中,将每一行作为一个独立的元素存入vector中。code

2. 文件模式

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

三、string流

  • 头文件sstream定义了三个类型来支持内存IO:
    • istringstream从string读取数据。
    • ostringstream向string写入数据。
    • stringstream可以读写给定string。
操作 解释
sstream strm 定义一个未绑定的stringstream对象
sstream strm(s) 用s初始化对象
strm.str() 返回strm所保存的string的拷贝
strm.str(s) 将s拷贝到strm中,返回void
posted @ 2020-07-29 10:38  Parzulpan  阅读(154)  评论(0编辑  收藏  举报