sstream和strstream的用法

C++有兩種字符串流,也稱爲數組I/O流,一種在 strstream 中定義,另一種在 sstream 中定義。它們實現的東西基本一樣。
strstream裏包含:
class strstreambuf;
class istrstream;
class ostrstream;
class strstream;
它們是基於C類型字符串char*編寫的

sstream中包含:
class stringbuf;
class istringstream;
class ostringstream;
class stringstream;
它們是基於std::string編寫的


因此ostrstream::str()返回的是char*類型的字符串
ostringstream::str()返回的是std::string類型的字符串
在使用的時候要注意到二者的區別,一般情況下推薦使用std::string類型的字符串
當然如果爲了保持和C的兼容,使用strstream也是不錯的選擇。
但要記住一點,strstream雖仍然是C++語言標準的一部分,但已被C++標準宣稱爲“deprecated”,也就是不再提倡使用了,也說不定以後幹粹就沒了。


先介紹一下sstream

//strigstream以空格爲邊界符,使用其須包含sstream頭文件
//istringstream 用法
istringstream istring;
string ss("ss 8346520");
istring.str(ss);
int i=0;
string s;
istring>>s>>i;
cout<<s<<" "<<i<<endl;
或者
istringstream istring("ss 8346520");
int i=0;
string s;
istring>>s>>i;
cout<<s<<" "<<i<<endl;
都將打印:s內容是ss,i內容是8346520的結果;


//ostringstream 用法
string s="test";
int i=8346520;
int j=0;
string s1;
ostringstream ostring; //不能寫成ostringstream ostring<<s<<" "<<i;
ostring<<s<<" "<<i;
cout<<ostring.str()<<endl; //ostring流內保存內容是test 8346520
istringstream istring(ostring.str());
istring>>s1>>j;//要注意此處的順序;
cout<<s1<<"――――"<<j<<endl;


簡單說說strstream:
基於數組的類有istrstreamostrstreamstrstream。它們分別用來創建輸入、輸出和輸入/輸出流。這些類的基類之一是strstreambuf,它定義了派生類使用的幾個底層的具體屬性。
除了strstreambuf以外,istream也是istrstream的基類。類ostrstream包括了類ostream
strstream也包括了類iostream。所以,所有基於數組的類和“普通”IO類一樣存取相同的成員函數。
創建基於數組的輸出流要將一個輸出流和一個數組關聯起來,可使用下列ostream的構造函數:
ostrstream ostrcharbufint sizeint modeios::out);
其中,buf是指向數組的指針,該數組接收寫入流的字符。數組的長度由參數size確定。缺省時,流以輸出方式打開,但也可以將幾項或在一起復合爲所需的方式(例如,可以包含ios::app使輸出添加在數組中已存在的信息的尾部)。mode的缺省值可以滿足大多數的要求。一旦打開了一個基於數組的輸出流,所有對這個流的輸出就放在數組中。但是,任何輸出都不能寫到數組的限界之外,任何這種企圖都會導致錯誤。


下面是一個介紹基於數組的輸出流的簡單程序。

#include <iostream>
#include <strstream>
using namespace std;
int main()
{
int arraysize=50;
char *pbuffer=new char[arraysize];
ostrstream ostr(pbuffer,arraysize,ios::out);
ostr<<"Hello"<<" ";
ostr<<99-14<<hex<<" ";
ostr.setf(ios::showbase);
ostr<<100<<ends; //使用ostrstream輸出到流對象的時候,要用ends結束字符串
cout<<pbuffer;
delete[] pbuffer;
return 0;
}


使用數組作輸入:
要將輸入流和數組關聯起來,可使用下列istrstream的構造函數:
istrstream istrchar*buf);
其中,buf是指向數組的指針,該數組作爲每次向流輸入的字符源。buf所指的數組必須以空結束。空結束符從不從數組中讀取。

下面是一個用字符串輸入的例子:
#include <iostream>
#include <strstream>
using namespace std;
int main()
{
const char s[]="10 Hello 15 12.23 done";
istrstream ins(s);
int i;
char str[80];
float f;
//reading10 Hello
ins >>i;ins >>str;
cout<<i<<" "<<str<<endl;
// readingf 12.23 done.
ins>>i;
ins>>f;
ins>>str;
cout<<hex<<i<<" "<<f<<" "<<str;
return 0;
}

發佈了20 篇原創文章 · 獲贊 28 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章