1. 程式人生 > >C++中stringstream ostringstream istringstream使用方式

C++中stringstream ostringstream istringstream使用方式

tel ostream 插入字符 nging 緩沖 emp width ++ enter

C++引入了ostringstream、istringstream、stringstream這三個類,要使用他們創建對象就必須包括sstream.h頭文件。

  istringstream類用於運行C++風格的串流的輸入操作。
ostringstream類用於運行C風格的串流的輸出操作。
strstream類同一時候能夠支持C風格的串流的輸入輸出操作。

   istringstream類是從istream和stringstreambase派生而來。ostringstream是從ostream和 stringstreambase派生而來, stringstream則是從iostream類和stringstreambase派生而來。

  他們的繼承關系例如以下圖所看到的:

技術分享

  istringstream是由一個string對象構造而來,istringstream類從一個string對象讀取字符。
istringstream的構造函數原形例如以下:
istringstream::istringstream(string str);


#i nclude <iostream>
#i nclude <sstream>
using namespace std;
int main()
{
istringstream istr;
istr.str("1 56.7",);
//上述兩個過程能夠簡單寫成 istringstream istr("1 56.7");


cout << istr.str()<<endl;
int a;
float b;
istr>>a;
cout<<a<<endl;
istr>>b;
cout<<b<<endl;
system("pause");
}

  上例中。構造字符串流的時候。空格會成為字符串參數的內部分界,樣例中對a,b對象的輸入"賦值"操作證明了這一點,字符串的空格成為了整型數據與浮點型數據的分解點。利用分界獲取的方法我們其實完畢了字符串到整型對象與浮點型對象的拆分轉換過程。

  str()成員函數的使用能夠讓istringstream對象返回一個string字符串(比如本例中的輸出操作(cout<<istr.str();)。

  ostringstream相同是由一個string對象構造而來。ostringstream類向一個string插入字符。
ostringstream的構造函數原形例如以下:
ostringstream::ostringstream(string str);

演示樣例代碼例如以下:


#i nclude <iostream>
#i nclude <sstream>
#i nclude <string>
using namespace std;
int main()
{
ostringstream ostr;
//ostr.str("abc");//假設構造的時候設置了字符串參數,那麽增長操作的時候不會從結 尾開始添加,而是改動原有數據,超出的部分增長
ostr.put(‘d‘);
ostr.put(‘e‘);
ostr<<"fg";

string gstr = ostr.str();
cout<<gstr;
system("pause");
}

   在上例代碼中,我們通過put()或者左移操作符能夠不斷向ostr插入單個字符或者是字符串,通過str()函數返回增長過後的完整字符串數據,但值 得註意的一點是,當構造的時候對象內已經存在字符串數據的時候,那麽增長操作的時候不會從結尾開始添加,而是改動原有數據,超出的部分增長。
[ basic_stringbuf::str :
Sets or gets the text in a string buffer without changing the write position. ]

  對於stringstream了來說,不用我多說,大家也已經知道它是用於C++風格的字符串的輸入輸出的。


stringstream的構造函數原形例如以下:

  stringstream::stringstream(string str);

  演示樣例代碼例如以下:


#i nclude <iostream>
#i nclude <sstream>
#i nclude <string>
using namespace std;

int main()
{
stringstream ostr("ccc");
ostr.put(‘d‘);
ostr.put(‘e‘);
ostr<<"fg";
string gstr = ostr.str();
cout<<gstr<<endl;

char a;
ostr>>a;
cout<<a

system("pause");
}

  除此而外,stringstream類的對象我們還經常使用它進行string與各種內置類型數據之間的轉換。

演示樣例代碼例如以下:


#i nclude <iostream>
#i nclude <sstream>
#i nclude <string>
using namespace std;

int main()
{
stringstream sstr;
//--------int轉string-----------
int a=100;
string str;
sstr<<a;
sstr>>str;
cout<<str<<endl;
//--------string轉char[]--------
sstr.clear();//假設你想通過使用同一stringstream對象實現多種類型的轉換。請註意在每一次轉換之後都必須調用clear()成員函數。
string name = "colinguan";
char cname[200];
sstr<<name;
sstr>>cname;
cout<<cname;
system("pause");
}

#include <sstream>
#include <string>
#include <iostream>
using namespace std;

void main()
{
	ostringstream ostr1; // 構造方式1
	ostringstream ostr2("abc");	// 構造方式2

/*----------------------------------------------------------------------------
*** 方法str()將緩沖區的內容拷貝到一個string對象中,並返回
----------------------------------------------------------------------------*/
	ostr1 << "ostr1" << 2012 << endl;	// 格式化,此處endl也將格式化進ostr1中
	cout << ostr1.str(); 

/*----------------------------------------------------------------------------
*** 建議:在用put()方法時,先查看當前put pointer的值,防止誤寫
----------------------------------------------------------------------------*/
	long curPos = ostr2.tellp(); //返回當前插入的索引位置(即put pointer的值),從0開始 
	cout << "curPos = " << curPos << endl;

	ostr2.seekp(2);	// 手動設置put pointer的值
	ostr2.put(‘g‘);		// 在put pointer的位置上寫入‘g‘。並將put pointer指向下一個字符位置
	cout << ostr2.str() << endl;
	

/*----------------------------------------------------------------------------
*** 反復使用同一個ostringstream對象時,建議:
*** 1:調用clear()清除當前錯誤控制狀態,其原型為 void clear (iostate state=goodbit);
*** 2:調用str("")將緩沖區清零。清除臟數據
----------------------------------------------------------------------------*/
	ostr2.clear();
	ostr2.str("");

	cout << ostr2.str() << endl;
	ostr2.str("_def");
	cout << ostr2.str() << endl;
	ostr2 << "gggghh";	// 覆蓋原有的數據。並自己主動添加緩沖區
	cout << ostr2.str() << endl;
}


C++中stringstream ostringstream istringstream使用方式