文章目錄
1 C++的輸入輸出分爲三種:
1.1 基於控制檯的I/O
頭文件 | 類型 |
---|---|
iostream |
istream從流中讀取 ostream寫到流中去 iostream對流進行讀寫,從istream和ostream派生 |
1.2 基於文件的I/O
頭文件 | 類型 |
---|---|
fstream |
ifstream從文件中讀取,由istream派生 ofstream寫到文件中去,由ostream派生 iostream對文件進行讀寫,從iostream派生 |
1.3 基於字符串的I/O
頭文件 | 類型 |
---|---|
sstream |
istringstream從string對象中讀取,由istream派生 ostringstream寫到string對象中去,由ostream派生 stringstream對string對象進行讀寫,從iostream派生 |
2 頭文件
#include <sstream>
3 功能
- istringstream類用於執行C++風格的字符串流的輸入操作。
- ostringstream類用於執行C++風格的字符串流的輸出操作。
- strstream類同時可以支持C++風格的串流的輸入輸出操作。
4 具體分析
4.1 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(int argc,char* argv[])
{
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
////測試輸出
//cout<<d<<endl;
//cout<<n<<endl;
//假設換下存儲類型
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(int argc,char* argv[])
{
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;
}
運行結果:
4.2 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;
}
運行結果:
4.3 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()
,則根本就起不到任何作用。
以上內容來自: