1. 标准库支持wchar_t类型的IO类,在每个类前加“w”前缀即可。文件流的头文件为fstream。string流的头文件为sstream。
2. IO对象不能复制和赋值,因为只有支持复制的元素类型才能存储在vector容器和其他容器中,故流对象不能存储在vector和其他容器中。流对象也不能作为函数形参和返回类型。如果要传递和返回IO对象,只能返回指向对象的引用或者指针。
3. IO标准库管理一系列的条件状态,用来标记给定的IO对象是否处于可用状态。
4. 流必须处于无错误状态,才可以用于输入或者输出。检查流是否可用的最简单方法是检查它的真值:

if(cin) 

while(cin>>word) 

IO标准库的条件状态: 

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 

注意:s.setstate(flag)是给流s的添加指定条件,会保留已存在的状态。 

当输入文件结束符(eof),cin会进入错误状态。 

文件流的状态必须及时清除.以ifstream in为例,当in.close()后,in中的失败状态不被清空,因此必须显示地调用函数,清空错误状态。 

5. 输出缓冲区的管理 

用操纵符显示的地刷新,如endl,flush,ends. 

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

将输出流与输入流关联(tie)起来,此时,在读输入流时将刷新其关联的输出缓冲区。 

tie函数可用istream和ostream对象调用,使用一个指向ostream对象的指针形参调用tie函数时,将实参流绑定在调用该函数的对象上。如果一个流调用tie函数将其本身绑在传递给tie函数的ostream的实参对象上,该流上的任何IO操作都会刷新实参所关联的缓冲器。 

如果将0做实参,则取消绑定。 

6. 如果把fstream对象与另一个文件关联,则必须先关闭现在的文件,然后打开另一个文件。文件名必须是C风格的字符串。 

7. 文件打开的模式. 

 in 打开文件做读操作. 

 out 打开文件做写操作. 

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

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

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

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

 out,trunc和app模式只能用于指定与ofstream或fstream对象关联的文件;in模式只能用与指定ifstream或fstream对象关联的文件. 

所有的文件都可以用ate和binary模式. ate只在打开时有效。 

 对于用ofstream打开的文件,要保存文件中已经存在的数据,唯一的方法是显式的指定以app的模式打开. 

8. 打开文件模式的有效组合. 

 out 打开文件做写操作,删除文件中已有的数据. 

 out | app 打开文件做添加操作,在结尾添加. 

 out | trunc 与out相同. 

 in 打开文件做读操作. 

 in | out 打开文件做读写操作,并定位于文件开始处,不清空。 fstream默认的打开方式。 

 in | out | trunc 打开文件做读写操作,删除文件中已有的数据. 

 上述所有打开模式组合还可以添加ate模式,对这些模式添加ate只会改变文件打开时的初始定位,定位于文件结尾处。如果指定trunc模式,则文件总会清空。 

 ofstream outfile("file1"); 

 ofstream outfile2("file1", ofstream::out | ofstream::trunc); 

 ofstream appfile("file2", fostream::app); 

模式是文件的属性而不是流的属性。 

9. 字符串流的特定操作,定义在sstream头文件中.每个stringstream对象都有一个string类型的对象成员。这些类还定义了名为str的成员,用来读取或设置stringstream对象所操作的string对象成员。 

 stringstream strm; 创建自由的stringstream对象. 

 stringstream strm(s); 创建存储s的副本的stringstream对象.s是string对象. 

 strm.str(); 返回strm中string类型的对象. 

 strm.str(s); 将string类型的s复制给strm,返回void. 

10. stringstream的使用: 

 可以用来处理每行的每个单词。 

 string line,word; 

 while(getline(cin,line)){ // 使用getline获取整行内容. 

 istringstream stream(line); // 将line绑定到一个istringstream对象上. 

 while(stream>>word){ // 将line中的每个字输入到word中. >>遇到空白符将结束输入。 

 // ... 

 } 

 } 

在需要多种数据类型之间实现数据类型之间实现自动格式化时使用该类类型。 

 #include <iostream> 

 #include <string> 

 #include <sstream> 

 using namespace std; 

 int main(){ 

 int val1 = 512, val2 = 1024; 

 ostringstream format_str; 

 string dump; // 为了屏蔽字符串中无用的标号. 

 // 将数字转换为对应的打印字符串. 

 format_str << "val1: " << val1 << "\n" << "val2: " << val2 << "\n"; 

 //这时format_message的关联string对象的内容是如下字符 val1: 512\nval2: 1024\n 

 // 转化为istringstream对象,读出字符串中的数据. 

 istringstream input_str(format_str.str()); 

 input_str >> dump >> val1 >> dump >> val2; 

 cout<< val1 << " " << val2 << endl; //输出512 1024 

 getchar(); 

 return 0; 

 }


一般情况下,使用输入操作符读string对象时,空白符将会忽略。于是,在读与format_message关联的string时,忽略其中的换行符。