原创 C++输入/输出流(1)

2018-2-23 12:19 1819 35 35 分类: 软件与OS 文集: C++学习记录(1)

1. 输入/输出流类层次

C++的输入/输出流类库是用派生方法建立起的,它有2个平行的基类,streambufios。其他的流类都是从这两个基类直接或间接派生的。

1.1   streambuf

streambuf类是带有缓冲区的流类库,它的作用是提供物理设备的接口、缓冲区或处理流的通用方式。当其用做流类库中的基类时,派生以下三个流类:

(1)filebuf类:使用文件来保存缓冲区中的字符序列;

(2)strstreambuf类:扩展streambuf的功能,提供在内存进行提取和插入操作的缓冲区管理;

(3)onbuf类:扩展类streambuf的功能,用于处理输出、提供控制光标、设置颜色、定义活动窗口、清屏、清一行等功能,为输出操作提供缓冲区管理;

该类使用的缓冲区由一个字符序列和输入缓冲区指针与输出缓冲区指针组成,指针指向字符被取出或插入的位置。通常情况下,均使用这三个派生类,很少直接使用streambuf类。

1.2   ios

ios类及其派生类为用户提供了使用流类的接口,它们均有一个指针指向streambuf类。Ios及其派生类使用streambuf来完成对错误的格式化输入\输出检查,并且支持对streambuf的缓冲区进行I/O时的格式化或非格式化转换。

ios类及其派生类的层次关系:

iosistream,ostream和上述提到的带缓冲区的流类库streambuf类构成了C++iostream输入/输出功能的基础。流是一个抽象的概念,实际进行IO操作时,必须将流与一种具体的物理设备联系起来。比如,将流和键盘联系起来,当从该流中提取数据时,就是从键盘输入数据,可以用istream,ostream等类声明流对象:

istream is;

ostream os;

2. 标准输入/输出流

C++将一些常用的流类对象,如键盘输入,显示器输出,程序运行出错输出,打印机输出等,定义并内置在系统中,供用户之间使用。这些系统内置的用于设备间传递数据的对象称为标准流类对象,共4个。

(1)cin对象:与标准输入设备相关联的标准输入流;

(2)cout对象:与标准输出设备相关联的标准输出流;

(3)cerr对象:与标准错误输出设备相关联的非缓冲方式的标准输出流;

(4)clog对象:与标准错误输出设备相关联的缓冲方式的标准输出流。

 

例子  输出char* 类型的变量

  C语言中的I/O必须要提供数据类型信息。C++对此做了改进,能够自动判别数据类型,但是有时还得提供使用类型信息。比如,字符串是char* 类型,假设需要输出其指针的值,即字符串中第一个字符的地址,但是重载运算符<< 输出的只是以空(null)字符串结尾的char* 类型的字符串,因此使用void*类型来完成上述需求(需要输出指针变量的地址时都可以使用void*类型)。

#include<iostream>

using namespace std;

int main()

{

    char *string = "test";

    cout << "sting is: " << string;

    cout << "\n Value of static cast<void *>(string) is: ";

    cout << static_cast<void *>(string) << endl;

    system("pause");

    return 0;

}

通常在while循环结构的首部用流读取运算符输入一系列的值。当遇到文件结束符时,读取运算符返回(false)。

#include<iostream>

using namespace std;

int main()

{      

    int grade, highestGrade = -1;

    cout << "Enter grade(enter end-of-file to end):";

    while (cin >> grade)

    {

        if (grade > highestGrade)

            highestGrade = grade;

        cout << "Enter grade (enter end of file to end):";

 

    }

    cout << "\n Highest grade is:" << highestGrade << endl;

    system("pause");

    return 0;

}

  在上述程序中,cin>>grade可以作为条件,因为基类ios(继承istream)提供了一个重载的强制类型转换运算符,将流变成void*类型的指针。如果读取数值发生错误或遇到文件结束符,则指针值为0。编译器能够隐式使用void*类型的强制转换运算符。

 

文章评论0条评论)

登录后参与讨论
我要评论
0
35
关闭 站长推荐上一条 /2 下一条