第8章标准IO库
1
控制台-----------读写控制窗口-----iostream
磁盘文件--------文件------------------fstream
字符串流--------格式化内存--------stringstream
2 IO对象不可复制或赋值。因为IO对象的复制构造函数是私有的,不能被调用。
导致:
1) 只有支持复制的元素类型可以存储在vector或其他容器里,由于流对象不能复制的原因,所以流对象不能存储在容器中。
2) 形参和返回类型也不能为流对象。
如果需要传递或返回IO对象,则必须传递和返回指向该对象的指针或引用。
3 输出缓冲区管理
每个IO对象管理一个缓冲区,用于存储程序读写的数据。通常以下几种情况将导致缓冲区的内容被刷新(即写入到真实的输出设备或者文件中)。
1).程序正常结束。作为main返回工作的一部分,将清空所有输出缓冲区。
2).缓冲区已满,这时缓冲区将会在写入下一个值之前刷新。
3).程序员自己显示刷新,这就依靠特定的操作符,通常用endl。
4).将输出流与输入流关联,这样,在读入时将刷新关联的输出缓冲区。
5)在每次输出操作执行完后,用unitbuf操纵符设置流的内部状态,从而清空缓冲区。
4因为如果程序崩溃了,不会刷新缓冲区。如果使用最后的输出给程序错误定位,而缓冲区没有刷新,程序员将浪费大量的时间跟踪调试并没有执行的代码。基于此,输出应多使用endl而非 ‘\n’.
5 关闭流并不能改变流对象的内部状态。
6 如果打算重用已存在的流对象,那么while循环在每次循环时记得关闭(close())和清空(clear())文件流。
7 如果程序员需要重用文件流读写多个文件,必须在读另一个文件之前调用clear清除该流的状态。
8 文件的输入和输出
早期C语言的原因,IO标准库使用是C语言风格的字符串而不是C++风格的string字符串作为文件名,所以通常我们会讲string类型的字符串通过调用c_str类型转化为C风格字符串进行文件打开。
1).要养成打开文件后文件打开状态检测的好习惯。
2).当用一个流去操作多个文件时一定要清除文件流的状态即调用clear()方法。因为关闭流不能改变流对象的内部状态,如果一次读写操作失败,即使关闭流对象再打开也 不能避免上次保持的错误状态,所以一定要调用clear()来清除这种错误状态。
3).文件模式只是文件的属性,而不是流的属性。ofstream::app ofstream::in ofstream::out 等等。
9 字符串流
string line,word;
while(getline(cin,line)) //read a line from the input into line
{
Istringstream stream(line); //bind to stream to the line we read
while(stream >> word) //read a word from line
{
//do per_word processing
}
}

本文深入探讨C++标准IO库的关键特性,包括控制台、磁盘文件及字符串流的操作方式。文章详细解释了IO对象不可复制的原因及其对程序设计的影响,并介绍了缓冲区管理的重要性,特别是如何有效使用endl确保程序错误的准确定位。此外,还提供了文件操作的最佳实践建议。
2863

被折叠的 条评论
为什么被折叠?



