1、IO对象不可复制或赋值:只有支持复制的元素类型可以存储在vector或其他容器类型里;形参或返回类型也不能为流类型。如果需要传递或返回IO对象,则必须传递或返回指向该对象的指针或引用。

2、IO标准库的条件状态

strm::iostate 机器相关的整形名,由各个iostream类定义,用于定义条件状态

strm::badbit strm::iostate类型的值,用于指出被破坏的流

strm::failbit strm::iostate类型的值,用于指出失败的IO操作

strm::eofbit strm::iostate类型的值,用于指出流已经到达文件结束符

s.eof() 如果设置了流s的eofbit值,则该函数返回true

s.fail() 如果设置了流s的failbit值,则该函数返回true

s.bad() 如果设置了流s的badbit值,则该函数返回true

s.good() 如果流s处于有效状态,则该函数返回true

s.clear() 将流s中的所有状态值都重设为有效状态

s.clear(flag) 将流s中的某个指定条件状态设置为有效。flag的类型是strm::iostate

s.setstate(flag) 给流s添加指定条件。flag的类型是strm::iostate

s.rdstate() 返回流s的当前条件,返回值类型为strm::iostate

badbit标志着系统级的故障,如无法恢复的读写错误。如果出现了这类错误,则该流通常就不能再继续使用了。如果出现的是可恢复的错误,如在希望获得数值型数据时输入了字符,此时则设置failbit标志,这种导致设置failbit的问题通常是可以修正的。eofbit是在遇到文件结束符时设置的,此时同时还设置了failbit。

3、下面几种情况将导致缓冲区的内容被刷新,即写入到真实的输出设备或者文件:

(1)程序正常结束。作为main返回工作的一部分,将清空所有输出缓冲区。

(2)在一些不确定的时候,缓冲区可能已经满了,在这种情况下,缓冲区将会在写下一个值之前刷新。

(3)用操纵符显示地刷新缓冲区,例如行结束符endl。

(4)在每次输出操作执行完后,用unitbuf操纵符设置流的内部状态,从而清空缓冲区。

(5)可将输出流与输入流关联(tie)起来。在这种情况下,在读输入流时将刷新其关联的输出缓冲区。

4、除了endl操纵符,C++语言还提供了另外两个类似的操纵符。第一个是经常使用的flush,用于刷新流,但不在输出中添加任何字符。第二个则是比较少用的ends,这个操纵符在缓冲区中插入空字符null,然后刷新它:

cout << "hi!" << flush;

cout << "hi!" << ends;

cout << "hi!" << endl;

如果需要刷新所有输出,最好使用unitbuf操纵符。这个操纵符在每次执行完写操作后都刷新流:

cout << unitbuf << "first" << "second" << nounitbuf;

等价于:

cout << "first" << "second" << flush;

nounitbuf操纵符将流恢复为使用正常的、由系统管理的缓冲区刷新方式。

5、tie函数可用istream或ostream对象调用,使用一个指向ostream对象的指针形参。调用tie函数时,将实参流绑在调用该函数的对象上。如果一个流调用tie函数将其本身绑在传递给tie的ostream实参对象上,则该流上的任何IO操作都会刷新实参所关联的缓冲区。一个ostream对象每次只能与一个istream对象绑在一起。如果在调用tie函数时传递实参0,则打破该流上已存在的捆绑。

6、由于历史原因,IO标准库使用C风格字符串而不是C++ string类型的字符串作为文件名。在创建fstream对象时,如果调用open或使用文件名作初始化式,需要传递的实参应为C风格字符串,而不是标准库string对象。程序常常从标准输入获得文件名。通常,比较好的方法是将文件名读入string对象,而不是C风格字符数组。假设要使用的文件名保存在string对象中,则可调用c_str成员获取C风格字符串。

7、如果程序员需要重用文件流读写多个文件,必须在读另一个文件之前调用close关闭前一个文件,并调用clear清除该流的状态。

8、文件模式

in 打开文件做读操作

out 打开文件做写操作

app 在每次写之前找到文件尾

ate 打开文件后立即将文件定位在文件尾

trunc 打开文件时清空已存在的文件流

binary 以二进制模式进行IO操作

9、stringsteam提供转换和/或格式化