轉載自:http://www.cnblogs.com/gamesky/archive/2013/01/09/2852356.html
關於istringstream、ostringstream、stringstream 類介紹 ,這篇文章寫得比較好,
0、C++的輸入輸出分爲三種:
(1)基於控制檯的I/O
(2)基於文件的I/O
(3)基於字符串的I/O
1、頭文件
[cpp]
view plaincopyprint?
#include <sstream>
2、作用
istringstream類用於執行C++風格的字符串流的輸入操作。
ostringstream類用於執行C++風格的字符串流的輸出操作。
strstream類同時可以支持C++風格的串流的輸入輸出操作。
3、具體分析
istringstream類
描述:從流中提取數據,支持 >> 操作
這裏字符串可以包括多個單詞,單詞之間使用空格分開
istringstream的構造函數原形:
istringstream::istringstream(string str);
初始化:使用字符串進行初始化
istringstream istr("1 56.7");
istr.str("1 56.7");//把字符串"1 56.7"存入字符串流中
使用:我們可以使用分解點獲取不同的數據,完成 字符串 到 其他類型 的轉換
常用成員函數:
str():使istringstream對象返回一個string字符串
舉例:把字符串類型的數據轉換爲其他類型
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
istringstream istr("1 56.7");
cout<<istr.str()<<endl;//直接輸出字符串的數據 "1 56.7"
string str = istr.str();//函數str()返回一個字符串
cout<<str<<endl;
int n;
double d;
//以空格爲界,把istringstream中數據取出,應進行類型轉換
istr>>n;//第一個數爲整型數據,輸出1
istr>>d;//第二個數位浮點數,輸出56.7
//假設換下存儲類型
istr>>d;//istringstream第一個數要自動變成浮點型,輸出仍爲1
istr>>n;//istringstream第二個數要自動變成整型,有數字的階段,輸出爲56
//測試輸出
cout<<d<<endl;
cout<<n<<endl;
system("pause");
return 1;
}
舉例2:把一行字符串放入流中,單詞以空格隔開。之後把一個個單詞從流中依次讀取到字符串
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
istringstream istr;
string line,str;
while (getline(cin,line))//從終端接收一行字符串,並放入字符串line中
{
istr.str(line);//把line中的字符串存入字符串流中
while(istr >> str)//每次讀取一個單詞(以空格爲界),存入str中
{
cout<<str<<endl;
}
}
system("pause");
return 1;
}
輸入:123 34 45
輸出:
123 換行 34 換行 45
ostringstream類
描述:把其他類型的數據寫入流(往流中寫入數據),支持<<操作
ostringstream的構造函數原形:
ostringstream::ostringstream(string str);
初始化:使用字符串進行初始化
ostringstream ostr("1234");
ostr.str("1234");//把字符串"1234"存入字符串流中
舉例:
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
//初始化輸出字符串流ostr
ostringstream ostr("1234");
cout<<ostr.str()<<endl;//輸出1234
ostr.put('5');//字符4頂替了1的位置
cout<<ostr.str()<<endl;//輸出5234
ostr<<"67";//字符串67替代了23的位置,輸出5674
string str = ostr.str();
cout<<str<<endl;
system("pause");
return 1;
}
stringstream類
描述:是對istringstream和ostringstream類的綜合,支持<<, >>操作符,可以進行字符串到其它類型的快速轉換
stringstream的構造函數原形如下:
stringstream::stringstream(string str);
初始化:使用字符串進行初始化
stringstream str("1234");
str.str("1234");//把字符串"1234"存入字符串流中
作用:
1、stringstream通常是用來做數據轉換的
2、將文件的所有數據一次性讀入內存
舉例1:基本數據類型變字符串
/*基本數據類型變字符串*/
#include <fstream>
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
/*整型變字符串*/
int n = 10;
string str;
stringstream stream;
stream << n;
stream >> str;
cout<<str<<endl;
stream.clear();//多次使用stringstream,要先清空下,不能使用stream.str("");否則下面輸出10
/*char* 變 string*/
char cStr[10] = "china";
stream << cStr;
stream >> str;
cout<<str<<endl;
system("pause");
return 1;
}
舉例2:字符串變基本數據類型
/*字符串變基本數據類型*/
#include <fstream>
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
/*字符串 變 double*/
double n;
string str = "12.5";
stringstream stream;
stream << str;
stream >> n;
cout<<n<<endl;
stream.clear();//多次使用stringstream,要先清空下,不能使用stream.str("");
/*string 變 char* */
string str1 = "china";
char cStr[10];
stream << str1;
stream >> cStr;
cout<<cStr<<endl;//輸出china
system("pause");
return 1;
}
注意:
#include <iostream>
#include <sstream>
using namespace std;
int main(int argc,char *argv[])
{
std::stringstream stream;
string str;
while(1)
{
//clear(),這個名字讓很多人想當然地認爲它會清除流的內容。
//實際上,它並不清空任何內容,它只是重置了流的狀態標誌而已!
stream.clear();
// 去掉下面這行註釋,清空stringstream的緩衝,每次循環內存消耗將不再增加!
//stream.str("");
stream<<"sdfsdfdsfsadfsdafsdfsdgsdgsdgsadgdsgsdagasdgsdagsadgsdgsgdsagsadgs";
stream>>str;
//測試輸出每次循環,你的內存消耗增加了多少!
cout<<"Size of stream = "<<stream.str().length()<<endl;
system("PAUSE");
}
system("PAUSE");
return EXIT_SUCCESS;
}
由於stringstream構造函數會特別消耗內存,似乎不打算主動釋放內存(或許是爲了提高效率),但如果你要在程序中用同一個流,反覆讀寫大量的數據,將會造成大量的內存消耗,因些這時候,需要適時地清除一下緩衝 (用 stream.str("") )。另外不要企圖用 stream.str().resize(0),或 stream.str().clear() 來清除緩衝,使用它們似乎可以讓stringstream的內存消耗不要增長得那麼快,但仍然不能達到清除stringstream緩衝的效果,內存的消耗還在緩慢的增長!,至於stream.flush(),則根本就起不到任何作用。