C++:字符串流
C++標準庫中的<sstream>提供了比ANSI C的<stdio.h>更高級的一些功能,即單純性、類型安全和可擴展性。
??(PS:自己解釋的不知道準確不?)
str()成員函數的使用可以讓stringstream對象返回一個string字符串。
c語言一般使用函數時候,最后,還有專門的代碼去釋放內存,c++一般就很少使用了,c++、 語言里面創建函數、變量之類的都是有生命周期的 ,用完了就自動釋放內存,這個就是c++比c語言中優勢之一。ss.str(string)里面含有參數,ss字符串流 ?然后str()指針指向String字符串,也就是說 輸入流指向字符串的首地址,這樣就可以一個一個指向string字符串中的所有元素 完成一個類似于遍歷感覺的操作,這個函數就是一個指針而已,作用是指向一個地址,析構(就是清理)只能說是他的性質。(str()指針 指向字符串的首地址,字符串string生命周期結束后,指針被對象析構,如果 string對象調用結束后,指針還在,那么指針就會指向一個null的位置 代碼出錯)。
<sstream>庫定義了三種類:istringstream、ostringstream和stringstream,分別用來進行流的輸入、輸出和輸入輸出操作。另外,每個類都有一個對應的寬字符集版本。簡單起見,我主要以stringstream為中心,因為每個轉換都要涉及到輸入和輸出操作。
注意,<sstream>使用string對象來代替字符數組。這樣可以避免緩沖區溢出的危險。而且,傳入參數和目標對象的類型被自動推導出來,即使使用了不正確的格式化符也沒有危險。
----下面是在字符串流中,穿插使用模板函數(例如:在類型轉換中使用模板)。
你可以輕松地定義函數模板來將一個任意的類型轉換到特定的目標類型。例如,需要將各種數字值,如int、long、double等等轉換成字符串,要使用以一個string類型和一個任意值t為參數的to_string()函數。to_string()函數將t轉換為字符串并寫入result中。使用str()成員函數來獲取流內部緩沖的一份拷貝:
template<class T>
void to_string(string & result,const T& t)
{ostringstream oss;//創建一個流oss<<t;//把值傳遞如流中result=oss.str();//獲取轉換后的字符轉并將其寫入result
}
結果:
to_string(s1,10.5);//double到string
to_string(s2,123);//int到string
to_string(s3,true);//bool到string
可以更進一步定義一個通用的轉換模板,用于任意類型之間的轉換。函數模板convert()含有兩個模板參數out_type和in_value,功能是將in_value值轉換成out_type類型:
template<class out_type,class in_value>
out_type convert(const in_value & t)
{stringstream stream;stream<<t;//向流中傳值out_type result;//這里存儲轉換結果stream>>result;//向result中寫入值return result;
}
結果:
這樣使用convert():
double d;
string salary;
string s=”12.56”;
d=convert<double>(s);//d等于12.56
salary=convert<string>(9000.0);//salary等于”9000”
在過去留下來的程序代碼和純粹的C程序中,傳統的<stdio.h>形式的轉換伴隨了我們很長的一段時間。但是,如文中所述,基于stringstream的轉換擁有類型安全和不會溢出這樣搶眼的特性,使我們有充足得理由拋棄<stdio.h>而使用<sstream>。<sstream>庫還提供了另外一個特性—可擴展性。你可以通過重載來支持自定義類型間的轉換。
?
//基本數據類型轉換例子 int轉string
#include <string>
#include <sstream>
#include <iostream>
int main()
{std::stringstream stream;std::string result;int i = 1000;stream << i; //將int輸入流stream >> result; //從stream中抽取前面插入的int值std::cout << result << std::endl; // print the string "1000"
}
//char *的轉換
#include <sstream>
#include <iostream>
int main()
{std::stringstream stream;char result[8] ;stream << 8888; //向stream中插入8888stream >> result; //抽取stream中的值到resultstd::cout << result << std::endl; // 屏幕顯示 "8888"
}
//再進行多次轉換的時候,必須調用stringstream的成員函數clear().
#include <sstream>
#include <iostream>
int main()
{std::stringstream stream;int first, second;stream<< "456"; //插入字符串stream >> first; //轉換成intstd::cout << first << std::endl;stream.clear(); //在進行多次轉換前,必須清除streamstream << true; //插入bool值stream >> second; //提取出intstd::cout << second << std::endl;
}
運行帶clear()的結果,會輸出456 ?? 1
運行不帶clear的結果:第一個輸出 456 ?? 第二個輸出-564097321
-----istringstream
istringstream是由一個string對象構造而來,istringstream類從一個string對象讀取字符。
istringstream的構造函數原形如下:
istringstream::istringstream(string str);
#include <iostream>
#include <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;return 0;
}
運行結果:? (PS:此處在istr>>a時,并未進行輸入,為什么直接默認為1)
上例中,構造字符串流的時候,空格會成為字符串參數的內部分界, 例子中對a,b對象的輸入"賦值"操作證明了這一點,字符串的空格成為了整型數據與浮點型數據的分解點,利用分界獲取的方法我們事實上完成了字符串到整型對象與浮點型對象的拆分轉換過程。
str()成員函數的使用可以讓istringstream對象返回一個string字符串(例如本例中的輸出操作(cout<<istr.str();)。
參照博客:https://blog.csdn.net/liuweiyuxiang/article/details/89070296
https://blog.csdn.net/shs1992shs/article/details/83051298
http://c.biancheng.net/view/vip_3774.html
總結
- 上一篇: C++:析构函数
- 下一篇: C++:文件操作2 文本文件和二进制文件