Skip to content

Latest commit

 

History

History
146 lines (106 loc) · 6.23 KB

ch08.md

File metadata and controls

146 lines (106 loc) · 6.23 KB

第八章 IO库

前面章节已介绍的IO库设施

[[ch01#IO | 第一章-初识输入输出]]

  • istream:输入流类型,提供输入操作。
  • ostream:输出流类型,提供输出操作
  • cin:一个istream对象,从标准输入(stdin)读取数据。
  • cout:一个ostream对象,向标准输出(stdout)写入数据。
  • cerr:一个ostream对象,向标准错误(stderr)写入消息(不缓冲)。
  • clog:一个ostream对象,向标准错误(stderr)输出程序运行时的一般性信息(缓冲)。
  • >>运算符:用来从一个istream对象中读取输入数据。
  • <<运算符:用来向一个ostream对象中写入输出数据。
  • getline函数:从一个给定的istream对象中读取一行数据,存入到一个给定的string对象中。

8.1 IO类

标准库定义的IO类型

C++语言不直接处理输入输出,而是通过一簇定义在标准库中的类型来处理IO。

头文件 类型 说明
iostream istream, ostream, iostream 从标准流中读写数据
fstream ifstream, ofstream, fstream 从文件中读写数据
sstream istringstream, ostringstream, stringstream 从字符串中读写数据

继承关系(其他类型同理)

%% 不绘制类型,是因为这里只是用来展示继承关系
%% 使用流程图更加简洁

%% 从下向上绘制
graph BT
	ifstream --> istream
	istringstream --> istream
Loading

IO对象不可复制或赋值

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

条件状态

将流当做条件使用的代码就等价于!fail()

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

上表中,strm是一种IO类型(如istream), s是一个流对象,flags的类型为strm::iostate

管理输出缓冲

  • 每个输出流都管理一个缓冲区,执行输出的代码,文本串可能立即打印出来,也可能被操作系统保存在缓冲区内,随后再打印。
  • 刷新缓冲区,可以使用如下IO操纵符:
    • endl:输出一个换行符并刷新缓冲区。
    • flush:刷新流,但不添加任何字符。
    • ends:在缓冲区插入空字符null(\0),然后刷新缓冲区。
    • unitbuf:告诉流接下来每次操作之后都要进行一次flush操作。
    • nounitbuf:回到正常的缓冲方式。

如果程序崩溃,输出缓冲区不会被刷新

关联输入和输出流

标准库将cout和cin关联在一起,因此cin会导致cout的缓冲区被刷新

每个流同时最多关联到一个输出流

  • s.tie():返回当前对象关联到的输出流指针,如果对象未关联到流,则返回空指针
  • s.tie(sp):将当前对象关联到指针sp指向的输出流对象,返回之前关联的流指针;sp为空指针时,表示解开流的关联

8.2 文件输入输出

  • 头文件fstream定义了三个类型来支持文件IO:
    • ifstream从一个给定文件读取数据。
    • ofstream向一个给定文件写入数据。
    • fstream可以读写给定文件。
  • 文件流:需要读写文件时,必须定义自己的文件流对象,并绑定在需要的文件上。

fstream特有的操作

操作 解释
fstream fstrm; 创建一个未绑定的文件流。
fstream fstrm(s); 创建一个文件流,并打开名为s的文件,s可以是string也可以是char指针,此构造函数是explicit
fstream fstrm(s, mode); 与前一个构造函数类似,但按指定mode打开文件
fstrm.open(s) 打开名为s的文件,并和fstrm绑定
fstrm.close() 关闭和fstrm绑定的文件
fstrm.is_open() 返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭

上表中,fstream是头文件fstream中定义的一个类型,fstrm是一个文件流对象。

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

文件模式

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

out模式打开的文件也会被截断,如若想要保留,则需指定app模式或in模式

8.3 string流

  • 头文件sstream定义了三个类型来支持内存IO:
    • istringstreamstring读取数据。
    • ostringstreamstring写入数据。
    • stringstream可以读写给定string

stringstream特有的操作

操作 解释
sstream strm 定义一个未绑定的stringstream对象
sstream strm(s) s初始化对象,此构造函数是explicit
strm.str() 返回strm所保存的string的拷贝
strm.str(s) s拷贝到strm中,返回void

上表中sstream是头文件sstream中任意一个类型。s是一个string