天天看点

c++Primer——第八章:IO库

1、IO对象无拷贝或赋值,所以不能将形参或返回类型设置为流类型

ofstream out1, out2;
	out1 = out2;		//错误 不能对流对象赋值
	ofstream print(ofstream); //错误 不能初始化ofstream参数
	out2 = print(out1);		//错误 不能拷贝流对象
           

2、流的状态

一个流一旦发生错误,其上后续的IO操作都会失败,由于流可能处于错误状态,因此代码通常应该在应用之前检查它。确定一个流对象的状态的最简单的方法是将他当作条件来使用:

while(cin >> word)   // while循环检查 >>表达式返回的流的状态
	{ }
           

3、输出缓冲区刷新的时机包括但不限于以下几种

  • 程序正常结束,作为main函数return操作的一部分
  • 缓冲区满
  • 使用操作符显示刷新,如endl(加一个换行)、ends(加一个空字符)、flush(什么都不加)
  • 使用unitbuf操作符设置流的内部状态
  • 一个输出流可能被关联到另一个流。当读写被关联的流时,关联到的流的缓冲区会被刷新。例如,默认情况下,cin和cerr都关联到cout,因此,读cin或写cerr都会导致cout的缓冲区被刷新
cout << unitbuf;	//所有输出操作后都会立即刷新缓冲区。任何输出立即刷新,无缓冲
	cout << nounitbuf;	//重置流 回到正常的缓冲方式
           

要注意的是,如果程序崩溃,输出缓冲区不会被刷新

4、以out模式打开文件会丢失已有数据

当以默认模式打开一个ofstream时,文件内容会被丢弃。保留被ofstream打开的文件中已有数据的唯一方法是显示指定app或in模式

// 下面三条语句files1都被截断(清空)
	ofstream out("file1"); //默认out模式打开并截断文件
	ofstream out2("file1", ofstream::out);
	ofstream out2("file1", ofstream::out | ofstream::trunc);
	// 下面语句会保留文件内容
	ofstream app("file2", ofstream::app);
	ofstream app("file2", ofstream::out | ofstream::app);
           

继续阅读