菜鸟的C++ 知识盲区(跌倒)到知识发现(爬起)---------第八章 IO库

第八章已经是属于C++primer中的第二部分了,我们在这里慢慢学习并接触这个玩意~。

我们的程序己经使用了很多旭库设施了。我们在1.2节(第5页)己经介绍了大部分10库设施:

  • istream(输入流)类型,提供输入操作。
  • ostream(输出流)类型,提供输出操作。
  • 0工n, 个istream对象,从标准输入读取数据
  • CO t, 个ostream对象,向标准输出写入数据。
  • Cerr, 一个ostream对象,通常用于输出程序错误消息,写入到标准错误。
  • >>运算符,用来从一个istream对象读取输入数据。
  • <<运算符,用来向一个。stream对象写入输出数据。
  • getline函数(参见3.32节,第78页),从一个给定的istream读取一行数据,存入一个给定的string对象中。

8.1 IO类 

到目前为止,我们己经使用过的10类型和对象都是操纵char数据的。默认情况下,这些对象都是关联到用户的控制台窗口的。当然,我们不能限制实际应用程序仅从控制台窗口进行旭操作,应用程序常常需要读写命名文件。为了支持不同种类的IO处理操作,在iostream和ostream之外,标准库还定义了其他的IO类型。如下图:

菜鸟的C++ 知识盲区(跌倒)到知识发现(爬起)---------第八章 IO库_第1张图片

概念上,设备类型和字符大小都不会影响我们要执行的旭操作。例如,我们可以用 >>读取数据,而不用管是从一个控制台窗口,一个磁盘文件,还是一个string读取。类似的,我们也不用管读取的字符能存入一个char对象内,还是需要一个wchar t对象来存储。标准库使我们能忽略这些不同类型的流之间的差异,这是通过继承机制(inheritance) 实现的。利用模板(参见3.3节,第87页),我们可以使用具有继承关系的类,而不必了解继承机制如何工作的细节。

8.1.1 IO对象无拷贝和赋值

我们不能拷贝或对10对象赋值,因此我们也不能将形参或返回类型设置为流类型(参见621节,第188页)。进行IO操作的函数通常以引用方式传递和返回流。读写一个IO对象会改变其状态,因此传递和返回的引用不能是const的

ofstream out1, out2;
out1 = out2; // error: cannot assign stream objects
ofstream print(ofstream); // error: can't initialize the ofstream parameter
out2 = print(out2); // error: cannot copy stream objects

8.1.2条件状态

IO操作与生俱来的问题是可能发生错误。一些错误是可以恢复而另外一些是发僧在系统深处,

菜鸟的C++ 知识盲区(跌倒)到知识发现(爬起)---------第八章 IO库_第2张图片

egg 一个错误的例子:
int val ;
cin>>ival;

如果我们标准输入上键入BOO,读操作就会失败。代码中的输入运算符期待读取一个int ,但是却读到了一个字符B。

确定一个流对象的状态最简单的方法就是将它作为一个条件来使用:

while(cin >> world);//ok 读取成功

8.1.3管理输出缓冲

每个流输出都管理一个缓冲区,用来保存程序读写数据。导致缓冲区刷新的原因很多:

  1. 程序结束,main函数return操作的一部分
  2. 缓冲区满
  3. 使用“endl”操作符
  4. 使用操纵符unitbuf设置流的内部状态,来清空缓冲区
  5. 一个输出流可能关联到另一个流

8.2文件输入输出

头文件fstream 定义了三个类型支持文件IO:ifstream 从一个给定文件读取数据,ofstream向一个给定文件写入数据,以及fstream可以读写给定文件。

菜鸟的C++ 知识盲区(跌倒)到知识发现(爬起)---------第八章 IO库_第3张图片

8.3string流

sstring头文件定义了三个类型支持内存IO,这些类型可以向string写入数据,从string读取数据,string是一个io流一样。详情其他资

 

你可能感兴趣的:(菜鸟的C++ 知识盲区(跌倒)到知识发现(爬起)---------第八章 IO库)