字符串流也叫内存流,以内存中用户定义的字符数组(字符串)为输入输出的对象。
输入输出缓冲区就是字符串流!!比如用cin读入的数据,一开始的时候是存储在输入缓冲区的,这个时候它是字符串流;当用变量对它进行提取的时候,就存储在内存中了,就是以二进制的形式保存了;最后用cout进行输出的时候也是先存放到输出缓冲区中,这时候也是字符串流。也就是字符串----------二进制------------字符串。
建立输出字符串流对象:
字符串流没有open成员函数,通过调用构造函数建立字符串流对象!!
ostrstream类的构造函数原型:
ostrstream::ostrstream(char* buffer, int n, int mode=ios::out);
buffer是指向字符数组首元素的指针;
n为指定的流缓冲区的大小(一般选与字符数组的大小相同,也可以不同)
mode指操作方式,默认为ios::out方式。
istrstream类的两个带参数的构造函数,原型为:
istrstream::istrstream(char* buffer);将字符数组buffer中的全部数据作为输入字符串流的内容
istrstream::istrstream(char* buffer,int n);只将字符数组buffer中的前n个字符作为输入字符串流的内容
buffer是指向字符数组首元素的指针,用它来初始化流对象(使流对象与字符数组建立关联)
n是流缓冲区的大小,可以只用字符数组中的一部分。
输入和输出中的buffer的区别在于输出中的buffer是等待被填充的,所以可以是空的;而输入中的buffer是被用来输入的,所以一定是有内容的!!!
建立输入输出字符串流对象:
strstream类提供的构造函数的原型为:
strstream::strstream(char* buffer,int n,int mode)
buffer是指向字符数组首元素的指针;
n为指定的流缓冲区的大小(一般选与字符数组的大小相同,也可以不同);
mode指操作方式,默认为ios::out方式。
“写”字符数组:
对于上面的程序来说,strout1就是说将字符串不是输出到缓冲区中,而是输出到strout1中,也就是字符数组c的前30字节中。(strout1使用的是字符数组c的前30字节的空间作为输出字符串流)而用ends为字符串流加上了以个结束符'\0',从而使得c中的字符串称为了一个完美的字符串。因此字符数组c相当于cout里面的输出缓冲区。因此我们操作的是计算机内存中的一段空间c,我们叫它字符串流。
以字符串流为中介交换数据:
对于上面的程序来书,strin和cin一样也是遇到空白字符就停止这一阶段的输入,并且忽略掉空白字符;c是字符串,可以转换成int型数组,最后再转换成字符串输出。过程中是以字符串流为中介的。
螺丝壳中做道场:以字符串流为中介,ASCII、二进制形式互相转换。
操作内存中的字符数组和文件的差异:
输出数据不是流向外存文件,而是流向内存中的一个存储空间;输入时从内存中的存储空间读取数据。这里的存储空间就是字符串流。(因为流就是一个字节一个字节进行操作,而一个字符正好占用一个字节,所以用字符数组来代表流这个对象)
字符串流对象关联的不是文件,而是内存中的一个字符数组,因此不需要打开和关闭文件。
每个文件的最后都有一个文件结束符,表示文件的结束;而字符串流所关联的字符数组中没有相应的结束标志,用户要指定一个特殊字符ends'\0'作为结束符,在向字符数组写入全部数据后要写入此字符。