第8章 IO类

1、IO类

  • iostream定义了用于读写流的基本类型,fstream定义了读写命名文件的类型,sstream定义了读写内存string对象的类型。
头文件 类型
iostream iostream,wiostream读写流
fstream fstream,wfstream读写文件
sstream stringstream,wstringstream读写string
  • IO对象无拷贝或赋值。

2、IO类定义了一些函数和标志,帮助我们访问和操作流的条件状态。

strm::iostate strm是一种IO类型,iostate是一种机器相关的类型,提供了表达条件状态的完整功能
strm::badbit strm::badbit用来指出流已崩溃
strm::failbit strm::failbit用来指出一个IO操作失败了
strm::eofbit strm::eofbit用来指出流到达了文件结束
strm::goodbit strm::goodbit用来指出流未处于错误状态。此值保证为零
s.eof() 若流s的eofbit置位,则返回true
s.fail() 若流s的failbit或badbit置位,则返回true
s.bad() 若流s的badbit置位,则返回true
s.good() 若流s处于有效状态,则返回true
s.clear() 将流s中所有条件状态位复位,将流的状态设置为有效。返回void
s.clear(flags) 根据给定的flags标志位,将流s中对应条件状态位复位。flags的类型为strm::iostate。返回void。
s.setstate(flags) 根据给定的flags标志位,将流s中对应条件状态位置位。flags的类型为strm::iostate。返回void。
s.rdstate() 返回流s的当前条件状态,返回值类型为strm::iostate
  • 一个流一旦发生错误,其上后续的IO操作都会失败。由于流可能处于错误状态,因此代码通常应该在使用一个流之前检查它是否处于良好状态。
while (cin >> word)	//表达式返回cin,如果输入操作成功,流保持有效,则条件为真
	//ok:读操作成功...

3、管理输出缓冲

  • 每个输出流都管理一个缓冲区,用来保存程序读写的数据。导致缓冲刷新的原因有很多:
    1)程序正常结束,作为main函数的return操作的一部分,缓冲刷新被执行。
    2)缓冲区满时,需要刷新缓存,而后新的数据才能继续写入缓冲区。
    3)操作符如endl来显式刷新缓冲区。
    4)在每个输出操作之后,我们可以用操作符unitbuf设置流的内部状态,来清空缓冲区。默认情况下,对cerr是设置unitbuf的,因此写到cerr的内容都是立即刷新的。
    5)一个输出流可能被关联到另一个流。在这种情况下,当读写被关联的流时,关联到的流的缓冲区会被刷新。例如,默认情况下,cin和cerr都关联到cout。因此,读cin或写cerr都会导致cout的缓冲区被刷新。

4、文件输入输出

  • 头文件fstream定义了三个类型来支持文件IO:ifstream从一个给定文件读取数据,ofstream向一个给定文件读写数据,以及fstream可以读写给定文件。
fstream fstrm; 创建一个未绑定的文件流。fstream是头文件fstream中定义的一个类型
fstream fstrm(s); 创建一个fstream,并打开名为s的文件。s可以是string类型,或者是一个指向C风格字符串的指针。默认的文件模式mode依赖于fstream的类型
fstream fstrm(s, mode); 与前一个构造函数类似,但按指定mode打开文件
fstrm.open(s) 打开名为s的文件,并将文件与fstrm绑定。s可以是一个string或一个指向c风格字符串的指针。默认的文件mode依赖于fstream的类型。返回void
fstrm.close() 关闭与fstrm绑定的文件。返回void
fstrm.is_open() 返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭

使用文件流对象

ifstream in(ifile);		//构造一个ifstream并打开给定文件
ofstream out;			//输出文件流未关联到任何文件

用fstream代替iostream&

  • 在要求使用基类型对象的地方,我们可以用集成类型的对象来代替。接受一个iostream类型应用(或指针)参数的函数,可以用一个对应的fstream(或sstream)类型来调用。我们可以用7.1.3节中的read和print函数来读写命名文件。
ifstream input(argv[1]);
ofstream output(argv[2]);
Sales_data total;
if (read(input, total)) {
	Sales_data trans;
	while (read(input, trans)) {
		if (total.isbn() == trans.isbn()) {
			total.combine(trans);
		}
		else {
			print(output, total) << endl;
			total = trans;
		}
	}
	print(output, total) << endl;
}
else {
	cerr << "No data?" << endl;
}

成员函数open和close

  • 如果定义了一个空文件流对象,可以随后调用open来将它与文件关联起来。
  • 如果调用open失败,failbit会被置位,因为调用open可能失败,进行open是否成功的检测通常是一个好习惯:
if (out.open(ifile)) {  //检查open是否成功
	//open 成功,我们可以使用文件了
}
  • 对一个已经打开的文件流调用open会失败,并会导致failbit被置位。随后的试图使用文件流的操作都会失败。
  • 当一个fstream对象被销毁时,close会自动被调用。

文件模式

  • 每个流都有一个关联的文件模式(file mode),用来指出如何使用文件。
in 以读方式打开
out 以写方式打开
app 每次写操作前均定位到文件末尾
ate 打开文件后立即定位到文件末尾
trunc 截断文件
binary 以二进制方式进行IO
  • 保留被ofstream打开的文件中已有数据的唯一方法是显式指定app或in模式。
  • 在每次打开文件时,都要设置文件模式,可能是显式地设置,也可能是隐式地设置。当程序未指定模式时,就使用默认值。

5、string流

  • sstream头文件定义了三个类型来支持内存IO,这些类型可以向string写入数据,从string读取数据,就像string是一个IO流一样。istringstream从string读取数据,ostringstream向string写入数据,而stringstream既可以从string读数据也可向string写数据。
sstream strm; strm是一个未绑定的stringstream对象。sstream是头文件sstream中定义的一个类型
sstream strm(s); strm是一个sstream对象,保存string s的一个拷贝
strm.str() 返回strm所保存的string的拷贝
strm.str(s) 将string s拷贝到strm中,返回void

猜你喜欢

转载自blog.csdn.net/weixin_42205011/article/details/87918139
0条评论
添加一条新回复