Fork me on GitHub

C++ Primer学习笔记:(八)IO类

C++使用标准库类来处理面向流的输入和输出:

  • iostream处理控制台IO
  • fstream处理命名文件IO
  • stringstream完成内存string的IO

类fstream和stringstream都继承自iostream。

IO类

头文件iostream包含所有i/o流所需的基本信息,并定义有四个标准i/o流对象:

  • cin:标准输入流对象(与标准输入设备连接)
  • cout :标准输出流(与标准输出设备连接)
  • cerr :非缓冲的标准错误流(默认设备为显示器)
  • clog :经缓冲的标准错误流(默认设备为打印机)

IO对象没有拷贝或者赋值。

条件状态(P8.1.1,P279)

IO类定义了一些函数和标志,可以帮助我们访问和操纵流的条件状态(condition state)。

条件状态 含义
strm::iostate 由各个iostream类定义,用于定义条件状态
strm::badbit strm::iostate类型的值,用于指出被破坏的流
strm::failbit strm::iostate类型的值,用于指出失败的IO操作
strm::eofbit strm::iostate类型的值,用于指出流已经到达文件的结束符
s.eof() 如果设置了流s的eofbit值,该函数返回true
s.bad() 如果设置了流s的badbit值,该函数返回true
s.fail() 如果设置了流s的failbit值,该函数返回true
s.good() 如果流s处于有效状态,该函数返回true
s.clear() 清空流s的所有状态,并设为true
s.clear(flag) 给流s的某个条件状态位设置为true。flag,类型是strm::iostate
s.setstate(flag) 给流s的添加指定条件。flag,类型是strm::iostate
s.rdstate() 返回流s的当前条件,返回值类型是strm::iostate

刷新输出缓冲区

endl 操纵符,用于输出一个换行符并刷新缓冲区。
flush操纵符,用于刷新流,但不在输出中添加任何字符。
ends操作符,这个操纵符在缓冲区中插入空字符null,然后刷新它。

如果程序崩溃(异常终止),输出缓冲区不会刷新。

文件输入输出(8.2,P283)

1
2
3
4
5
ifstream in(ifile); //构建一个ifstream并打开给定文件
ofstream out; //输出文件流,没有与任何文件关联
out.open(iflie +".copy"); //打开指定的文件
if(out) //检查open是否成功

文件模式(8.2.2,P286)

文件模式有:in, out, app(append的缩写,追加模式,写操作前定位到文件末尾), ate, trunk(截断文件), binary

保留ofstream打开的文件中已有数据的唯一方法:显式地指定appin模式。

string流(8.3,P287)

标准库定义了三种类型的字符串流:
istringstream,由istream派生而来,提供读string的功能。
ostringstream,由ostream派生而来,提供写string的功能。
stringstream,由iostream派生而来,提供读写string的功能。

stringstream 特定的操作:

stringstream 特有的操作 含义
sstream strm; strm是一个未绑定的stringstream对象。sstream是头文件sstream中定义的一个类型
sstream strm(s); strm是一个sstream对象,保存string s的一个拷贝。此构造函数是explict的。
strm.str() 返回strm所保存的string的拷贝
strm.str(s) 将string s拷贝到strm中。返回void

术语表

继承: inheritance
条件状态: condition state
文件模式: file mode
文件流: file stream
字符串流: string stream

参考资料

  1. C++ Primer 中文第五版
  2. C++primer第五版第八章学习笔记
  3. 《C++primer(第五版)》学习之路-第八章:IO库
------ 本文结束感谢您的阅读 ------
坚持原创技术分享,您的支持将鼓励我继续创作!