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);