字符流

一、stringstream

C++標準庫中的<sstream>提供了比ANSI C的<stdio.h>更高級的一些功能,即單純性、類型安全和可擴展性。

首先要加入頭文件#include <sstream>

istringstream //用於執行c++風格的串流輸入
ostringstream //用於執行c++風格的串流輸出
stringstream  //同時執行c++風格的串流輸入輸出

一般來說他都是用來進行類型轉換

首先來看看sscanf()

我們用下面這一段代碼來實現將字符類型轉換爲整型
#include <sstream>
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    char s1[15]="123.456 789";
    int a,c;
    double b;
    sscanf(s1,"%lf %d%n",&b,&a,&c);//c代表有幾位轉化了,此處有11位
    cout << b << " " << a << " " << c << endl;
    return 0;
}

結果是

再來看看ssprintf()

我們用下面這一段代碼來實現將整型轉換爲字符類型
#include <sstream>
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    char s1[15]={'0'};
    int a=100;
    sprintf(s1,"%d",a);//將a轉換成字符類型
    cout << s1 << endl;
    sprintf(s1,"%x",a);//將a轉化成小寫16進制再轉換成字符類型
    cout << s1 << endl;
    sprintf(s1,"%X",a);//將a轉化成大寫16進制再轉換成字符類型
    cout << s1 << endl;
    sprintf(s1,"%o",a);//將a轉化成8進制再轉換成字符類型
    cout << s1 << endl;
    return 0;
}

結果爲

除此之外ssprintf()還可以連接兩個字符。
#include <sstream>
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    char s2[15]="I love";
    char s3[15]="you";
    char s1[30];
    sprintf(s1,"%s %s",s2,s3);
    cout << s1 << endl;
    return 0;
}

結果輸出是 I love you

除了以上那些類型轉換的方法外還可以用stringstream

將 整型轉成字符類型
#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main()
{
    stringstream s1; //定義一流
    string s2;       //定義一字符串
    int a;           //定義一整書
    cin >> a;        
    s1<<a;           //將int型流入流內
    s1>>s2;          //轉換類型
    cout << s2 << endl;
    return 0;
}

這裏寫圖片描述

注意再進行多次轉換的時候,必須清空stringstream一般用clear()
#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main()
{
    stringstream s1; //定義一流
    string s2;       //定義字符串string型
    int a;           //定義整型
    cin >> a;
    s1<<a;
    s1>>s2;         //int轉string
    cout << s2 << endl;
    s1.clear();    //清除
    cin >> a;
    char s3[10];   //定義字符串char型
    s1<<a;
    s1>>s3;        //int轉char
    cout << s3 << endl;
    s1.clear();    //清除
    s1<<true;      //bool類型流入流
    s1>>a;
    cout << a << endl;
    return 0;
}

這裏寫圖片描述

1.將一個任意的類型轉換到特定的目標類型

#include <sstream>
#include <iostream>
#include <cstdio>
using namespace std;
template<class T>

void zhuan(string & ss,const T & shu)
{
    ostringstream os; //創建一個流
    os<<shu;          //把值存入流中
    ss=os.str();      //將轉換後的值給ss
}

int main()
{
    string s1,s2,s3;
    zhuan(s1,13.14); //double到string型轉換
    cout << s1 << endl;
    zhuan(s2,520);  //int到string型轉換
    cout << s2 << endl;
    zhuan(s3,true); //bool到string型轉換
    cout << s3 << endl;
    return 0;
}

這裏寫圖片描述
2.任意類型之間的轉換

#include <sstream>
#include <iostream>
#include <cstdio>
using namespace std;
template<class otype,class ivalue>
otype convert(const ivalue & t)
{
    stringstream stream;//定義一流
    stream<<t;          //向流中傳值
    otype result;       //存儲轉換結果
    stream>>result;     //向result中寫入值
    return result;
}

int main()
{
    double d;
    string sa;
    string s="13.14";
    d=convert<double>(s);//d等於13.14
    cout << d << endl;
    sa=convert<string>(520.0);//sa等於”520”
    cout << sa << endl;
    return 0;
}

這裏寫圖片描述

希望多各位有幫助(^ω^)/
有不懂得歡迎留言

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章