读书人

sstream跟strstream以及fstream

发布时间: 2012-12-22 12:05:06 作者: rapoo

sstream和strstream以及fstream

在C++有两种字符串流,也称为数组I/O流,一种在sstream中定义,另一种在strstream中定义。
它们实现的东西基本一样。

strstream里包含
class strstreambuf;
class istrstream;
class ostrstream;
class strstream;
它们是基于C类型字符串char*编写的。

sstream中包含
class istringstream;
class ostringstream;
class stringbuf;
class stringstream;
class …….
它们是基于std::string编写的。

因此ostrstream::str()返回的是char*类型的字符串,而ostringstream::str()返回的是std::string类型的字符串。

在使用的时候要注意到二者的区别,一般情况下推荐使用std::string类型的字符串。
当然如果为了保持和C的兼容,使用strstream也是不错的选择。
但要记住一点,strstream虽仍然是C++语言标准的一部分,但已被C++标准宣称为“deprecated”,也就是不再提倡使用了,也说不定以后干粹就没了。?


1、先介绍一下sstream

?
2、简单说说strstream:
? ? ? ? 基于数组的类有istrstream、ostrstream和strstream。它们分别用来创建输入、输出和输入/输出流。这些类的基类之一是strstreambuf,它定义了派生类使用的几个底层的具体属性。
除了strstreambuf以外,istream 也是istrstream的基类。类ostrstream包括了类ostream。

strstream也包括了类iostream。所以,所有基于数组的类和“普通”I/O类一样存取相同的成员函数。

创建基于数组的输出流
要将一个输出流和一个数组关联起来,可使用下列ostream的构造函数:
ostrstream ostr(char *buf, int size, int mode=ios::out);
其中,buf是指向数组的指针,该数组接收写入流的字符。数组的长度由参数size确定。缺省
时,流以输出方式打开,但也可以将几项或在一起复合为所需的方式(例如,可以包含ios::
app使输出添加在数组中已存在的信息的尾部)。mode的缺省值可以满足大多数的要求。
一旦打开了一个基于数组的输出流,所有对这个流的输出就放在数组中。但是,任何输出都不能写到数组的限界之外,任何这种企图都会导致错误。
下面是一个介绍基于数组的输出流的简单程序。?

?
使用数组作输入:
要将输入流和数组关联起来,可使用下列istrstream的构造函数:
istrstream istr(char*buf);
其中,buf是指向数组的指针,该数组作为每次向流输入的字符源。 buf所指的数组必须以空结束。空结束符从不从数组中读取。


下面是一个用字符串输入的例子:

?
最后是文件i/o流:

string file="d:/out.txt";ofstream outfile(file.c_str());//默认模式outfile<<"hello world\n";outfile.close();//注意close;outfile.clear();outfile.open(file.c_str(),ofstream::app);//显式更改文件模式,添加模式outfile<<"\nhello world again!";
?

?

读书人网 >编程

热点推荐