【C++ Primer Chapter 8 总结】IO库
Stream-based I/O (基于流的输入输出)
1.预定义的标准流对象。
cin // istream对象,读取标准输入 cout // ostream对象,写入标准输出 cerr // ostream对象,写入标准错误 >> // 从istream对象读取 << // 写入ostream对象
2.IO库类型和头文件。
intuition:可以将输入输出理解为是站在程序变量的角度考虑。对于变量来说,>> 输入变量(从流中读取),<< 输出变量(写入流)。
Header Type iostream istream, 从输入流中读取数据到程序变量中 绑定到标准输入输出 ostream, 将程序中的变量数据写入到输出流中(因为输出流绑定到控制台,因此最后会显示在控制台) iostream, 输入输出流,支持读写操作 fstream ifstream, 从文件流中读取数据到程序变量中 (因为文件流绑定的是某个文件,即从该文件读取数据到变量中) 绑定到某个文件 ofsrteam, 将程序中的变量数据写入到文件流中 (将变量数据保存到文件流绑定的文件中) fstream, 输入输出文件流,支持读写操作 sstream istringstream, 从字符流中读取数据到程序变量中 (将字符流绑定的字符串读取到程序的变量中) 绑定到某个字符串 ostringstream, 将程序中的变量数据写入到字符流中 (将程序的变量写入到字符流绑定的字符串中) stringstream, 输入输出字符流,支持读写操作
3.IO类型无法复制,因此流类型不能作为形参和函数返回类型,只能用引用类型,并且是非const的引用(因为读写IO对象会改变其状态)。
4.IO库的条件状态。3个错误状态和1个正确状态。只有当流处于正确状态的时候才能读写。
cin.badbit // 系统级别的错误,corrupted cin.failbit // IO操作错误,failed cin.eofbit // hit end-of-file cin.goodbit // not in an error state s.eof() s.fail() s.bad() // true 如果badbit == 1 s.good() s.clear() // reset all condition value
5.每个输出流会管理一片缓冲区。使用缓冲区使得可以将多次输出操作组合成一次系统级别的写操作(写入到流绑定的控制台/文件/字符串)。
会有一些条件造成缓冲区刷新:1)程序结束。2)缓冲区满了。3)使用endl。4)使用flush。5)使用unitbuf。6)某些输出流会绑定到其他流。交互式系统的输入流通常绑定到输出流。cin和cerr都绑定到cout。读写cin和cerr会导致cout的缓冲区刷新。
如果程序异常终止,则缓冲区不会被刷星。当程序崩溃时,程序写入的数据可能位于输出缓冲区中等待打印。(这解释了为什么有的程序没有输出)
cout << "hello" << endl; // 在缓冲区加入换行符,并刷新缓冲区 cout << "hello" << flush; // 刷新缓冲区 cout << unitbuf; //output 每次读写后都刷新缓冲区 cout << nounitbuf; // 恢复系统管理的缓冲区刷新机制
6.文件输入输出。
ifstream in(file_name, mode); // 将文件与流绑定,并打开文件 ifstream in; in.open(file_name, mode); // same in.close(); // 打开文件流之后,它将保持与指定文件的关联。要将文件流与其他文件相关联,必须先关闭现有文件。 in.open(file_name_2);
ofstream out(file_name);
7.文件模式。
in 用于输入,只能用于ifstream out 用于输出,只能用于ofstream,用out模式打开文件的时候文件原内容会被清空 app 用于在文件尾添加数据, ofstream ate ofstream out(file_name, ofstream::app);
8.字符串流。
sstream strm; strm.str(); // 返回strm中的字符串 strm.str(s); // 复制s到strm中, 返回void string s = "hello world"; istringstream is(s); is.str(s); // same string word; while(is >> word) {} // 处理字符流绑定的字符串 int num = 42; ostringstream os; os << num; string str2 = os.str(); // 返回字符串流中的字符串