C++ Primer 中文版 学习笔记(七)

第8章标准IO库

   控制台­­­­­-----------读写控制窗口-----iostream

   磁盘文件--------文件------------------fstream

   字符串流--------格式化内存--------stringstream

IO对象不可复制或赋值。因为IO对象的复制构造函数是私有的,不能被调用

   导致:

   1)  只有支持复制的元素类型可以存储在vector或其他容器里,由于流对象不能复制的原因,所以流对象不能存储在容器中。

   2)  形参和返回类型也不能为流对象。

如果需要传递或返回IO对象,则必须传递和返回指向该对象的指针或引用。

3  输出缓冲区管理

每个IO对象管理一个缓冲区,用于存储程序读写的数据。通常以下几种情况将导致缓冲区的内容被刷新(即写入到真实的输出设备或者文件中)。

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

   2.缓冲区已满,这时缓冲区将会在写入下一个值之前刷新。

   3.程序员自己显示刷新,这就依靠特定的操作符,通常用endl

   4.将输出流与输入流关联,这样,在读入时将刷新关联的输出缓冲区。

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

4因为如果程序崩溃了,不会刷新缓冲区。如果使用最后的输出给程序错误定位,而缓冲区没有刷新,程序员将浪费大量的时间跟踪调试并没有执行的代码。基于此,输出应多使用endl而非 ‘\n’.

5  关闭流并不能改变流对象的内部状态。

6  如果打算重用已存在的流对象,那么while循环在每次循环时记得关闭(close())和清空(clear())文件流。

如果程序员需要重用文件流读写多个文件,必须在读另一个文件之前调用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
}
}


没有更多推荐了,返回首页