C++的sstream标准库详细介绍

 更新时间:2020年4月25日 17:45  点击:1271

C++的sstream标准库介绍
接下来我们继续看一下C++风格的串流控制 ,C++引入了ostringstream、istringstream、stringstream这三个类,要使用他们创建对象就必须包含sstream.h头文件。

istringstream类用于执行C++风格的串流的输入操作。
ostringstream类用于执行C风格的串流的输出操作。
strstream类同时可以支持C风格的串流的输入输出操作。

istringstream类是从istream(输入流类)和stringstreambase(c++字符串流基类)派生而来,ostringstream是从ostream(输出流类)和stringstreambase(c++字符串流基类)派生而来,stringstream则是从iostream(输入输出流类)和和stringstreambase(c++字符串流基类)派生而来。

他们的继承关系如下图所示:

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; 
system("pause"); 
}

上例中,构造字符串流的时候,空格会成为字符串参数的内部分界,例子中对a,b对象的输入"赋值"操作证明了这一点,字符串的空格成为了整型数据与浮点型数据的分解点,利用分界获取的方法我们事实上完成了字符串到整型对象与浮点型对象的拆分转换过程。

str()成员函数的使用可以让istringstream对象返回一个string字符串(例如本例中的输出操作(cout<<istr.str();)。

ostringstream同样是由一个string对象构造而来,ostringstream类向一个string插入字符。

ostringstream的构造函数原形如下:
ostringstream::ostringstream(string str);

示例代码如下:

复制代码 代码如下:

#include <iostream > 
#include <sstream > 
#include <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()函数返回增长过后的完整字符串数据,但值得注意的一点是,当构造的时候对象内已经存在字符串数据的时候,那么增长操作的时候不会从结尾开始增加,而是修改原有数据,超出的部分增长。

对于stringstream了来说,不用我多说,大家也已经知道它是用于C++风格的字符串的输入输出的。

stringstream的构造函数原形如下:
stringstream::stringstream(string str);

示例代码如下:

复制代码 代码如下:

#include <iostream > 
#include <sstream > 
#include <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与各种内置类型数据之间的转换。

示例代码如下:

复制代码 代码如下:

#include <iostream > 
#include <sstream > 
#include <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"); 
}

接下来我们来学习一下输入/输出的状态标志 的相关知识,C++中负责的输入/输出的系统包括了关于每一个输入/输出操作的结果的记录信息。这些当前的状态信息被包含在io_state类型的对象中。io_state是一个枚举类型(就像open_mode一样),以下便是它包含的值。

goodbit 无错误
Eofbit 已到达文件尾
failbit 非致命的输入/输出错误,可挽回
badbit 致命的输入/输出错误,无法挽回

有两种方法可以获得输入/输出的状态信息。一种方法是通过调用rdstate()函数,它将返回当前状态的错误标记。例如,假如没有任何错误,则rdstate()会返回goodbit.

下例示例,表示出了rdstate()的用法:

复制代码 代码如下:

#include <iostream > 
using  namespace  std; 

int  main ()  

    int  a; 
    cin >>a; 
    cout <<cin .rdstate()<<endl; 
    if (cin .rdstate() == ios ::goodbit) 
    { 
        cout <<"输入数据的类型正确,无错误!"<<endl; 
    } 
    if (cin .rdstate() == ios_base::failbit) 
    { 
        cout <<"输入数据类型错误,非致命错误,可清除输入缓冲区挽回!"<<endl; 
    } 
    system("pause"); 
}

另一种方法则是使用下面任何一个函数来检测相应的输入/输出状态:

bool bad();
bool eof();
bool fail();
bool good();

下例示例,表示出了上面各成员函数的用法:

复制代码 代码如下:

#include <iostream > 
using  namespace  std; 

int  main ()  

    int  a; 
    cin >>a; 
    cout <<cin .rdstate()<<endl; 
    if (cin .good()) 
    { 
        cout <<"输入数据的类型正确,无错误!"<<endl; 
    } 
    if (cin .fail()) 
    { 
        cout <<"输入数据类型错误,非致命错误,可清除输入缓冲区挽回!"<<endl; 
    } 
    system("pause"); 
}

如果错误发生,那么流状态既被标记为错误,你必须清除这些错误状态,以使你的程序能正确适当地继续运行。要清除错误状态,需使用clear()函数。此函数带一个参数,它是你将要设为当前状态的标志值。,只要将ios::goodbit作为实参。

示例代码如下:

复制代码 代码如下:

#include <iostream > 
using  namespace  std; 

int  main ()  

    int  a; 
    cin >>a; 
    cout <<cin .rdstate()<<endl; 
    cin .clear(ios ::goodbit); 
    cout <<cin .rdstate()<<endl; 
    system("pause"); 
}

通常当我们发现输入有错又需要改正的时候,使用clear()更改标记为正确后,同时也需要使用get()成员函数清除输入缓冲区,以达到重复输入的目的。

示例代码如下:

复制代码 代码如下:

#include <iostream > 
using  namespace  std; 

int  main ()  

    int  a; 
    while (1) 
    { 
        cin >>a; 
        if (!cin )//条件可改写为cin.fail() 
        { 
            cout <<"输入有错!请重新输入"<<endl; 
            cin .clear(); 
            cin .get(); 
        } 
        else  
        { 
            cout <<a; 
            break ; 
        } 
    } 
    system("pause"); 
}

最后再给出一个对文件流错误标记处理的例子,巩固学习,代码如下:
复制代码 代码如下:

#include <iostream > 
#include <fstream > 
using  namespace  std; 

int  main ()  

    ifstream myfile("c://1.txt",ios_base::in,0); 
    if (myfile.fail()) 
    { 
        cout <<"文件读取失败或指定文件不存在!"<<endl; 
    } 
    else  
    { 
        char  ch; 
        while (myfile.get(ch)) 
        { 
            cout <<ch; 
        } 
        if (myfile.eof()) 
        { 
            cout <<"文件内容已经全部读完"<<endl; 
        } 
        while (myfile.get(ch)) 
        { 
            cout <<ch; 
        } 
    } 
    system("pause"); 
}

[!--infotagslink--]

相关文章

  • C++ STL标准库std::vector的使用详解

    vector是表示可以改变大小的数组的序列容器,本文主要介绍了C++STL标准库std::vector的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2022-03-06
  • C++中取余运算的实现

    这篇文章主要介绍了C++中取余运算的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • 详解C++ string常用截取字符串方法

    这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • C++中四种加密算法之AES源代码

    本篇文章主要介绍了C++中四种加密算法之AES源代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2020-04-25
  • C++ 整数拆分方法详解

    整数拆分,指把一个整数分解成若干个整数的和。本文重点给大家介绍C++ 整数拆分方法详解,非常不错,感兴趣的朋友一起学习吧...2020-04-25
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • C++万能库头文件在vs中的安装步骤(图文)

    这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • 详解C++ bitset用法

    这篇文章主要介绍了C++ bitset用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • 浅谈C++中的string 类型占几个字节

    本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节...2020-04-25
  • C++ Eigen库计算矩阵特征值及特征向量

    这篇文章主要为大家详细介绍了C++ Eigen库计算矩阵特征值及特征向量,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • C++ pair的用法实例详解

    这篇文章主要介绍了C++ pair的用法实例详解的相关资料,需要的朋友可以参考下...2020-04-25
  • VSCode C++多文件编译的简单使用方法

    这篇文章主要介绍了VSCode C++多文件编译的简单使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29
  • C++中的循环引用

    虽然C++11引入了智能指针的,但是开发人员在与内存的斗争问题上并没有解放,如果我门实用不当仍然有内存泄漏问题,其中智能指针的循环引用缺陷是最大的问题。下面通过实例代码给大家介绍c++中的循环引用,一起看看吧...2020-04-25
  • C++随机点名生成器实例代码(老师们的福音!)

    这篇文章主要给大家介绍了关于C++随机点名生成器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • C++如何删除map容器中指定值的元素详解

    map容器是C++ STL中的重要一员,删除map容器中value为指定元素的问题是我们经常与遇到的一个问题,下面这篇文章主要给大家介绍了关于利用C++如何删除map容器中指定值的元素的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。...2020-04-25
  • C++ 约瑟夫环问题案例详解

    这篇文章主要介绍了C++ 约瑟夫环问题案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...2021-08-15
  • C++中cin的用法详细

    这篇文章主要介绍了C++中cin的用法详细,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • 基于C++中常见编译错误的总结详解

    本篇文章是对C++中的常见编译错误进行了详细的分析介绍,需要的朋友参考下...2020-04-25
  • C++实现递归函数的方法

    在本篇内容里小编给大家分享了关于C++实现递归函数的教学步骤,需要的朋友跟着参考下。...2020-04-25