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

 更新时间:2013年09月10日 09:08:30   作者:  
以下是对C++中的的sstream标准库进行了详细的介绍,需要的朋友可以过来参考下

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

相关文章

  • c++中引用作为形参的使用方法以及作用

    c++中引用作为形参的使用方法以及作用

    这篇文章主要给大家介绍了关于c++中引用作为形参的使用方法以及作用的相关资料,引用是地址传值,作为引用的形参数值被修改的同时,也修改了对应实参的值,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • C++实现LeetCode(169.求大多数)

    C++实现LeetCode(169.求大多数)

    这篇文章主要介绍了C++实现LeetCode(169.求大多数),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Qt 实现桌面雪花飘落代码

    Qt 实现桌面雪花飘落代码

    这篇文章主要介绍了Qt实现桌面雪花飘落代码,有需要的朋友可以参考一下
    2013-12-12
  • c语言定时器示例分享

    c语言定时器示例分享

    在linux下开发,使用的是C语言。适用于需要定时的软件开发,以系统真实的时间来计算,它送出SIGALRM信号。每隔一秒定时一次
    2014-04-04
  • C语言超详细分析多进程的概念与使用

    C语言超详细分析多进程的概念与使用

    在一个项目中并发执行任务时多数情况下都会选择多线程,但有时候也会选择多进程,例如可以同时运行n个记事本编辑不同文本,由一个命令跳转到另外一个命令,或者使用不同进程进行协作
    2022-08-08
  • 使用C++获取逻辑执行毫秒数的方法

    使用C++获取逻辑执行毫秒数的方法

    这篇文章主要为大家详细介绍了如何使用C++获取逻辑执行毫秒数的方法,文中借助c++11提供的steady_clock,实现了精确获取逻辑执行时间的方法,需要的可以参考下
    2024-02-02
  • 教你Clion调试ROS包的方法

    教你Clion调试ROS包的方法

    Clion是一款专门开发C以及C++所设计的跨平台的IDE,本文给大家介绍Clion调试ROS包的方法,感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • C++详细讲解IO流原理

    C++详细讲解IO流原理

    当程序与外界进行信息交换时,存在两个对象,一个是程序中的对象,另一个是文件对象。流是信息流动的一种抽象,它负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动
    2022-05-05
  • Qt学习之容器类的使用教程详解

    Qt学习之容器类的使用教程详解

    Qt提供了多个基于模板的容器类,这些类可以用于存储指定类型的数据项。本文主要介绍了Qt常用容器类的使用,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-12-12
  • C语言之包含min函数的栈实例详解

    C语言之包含min函数的栈实例详解

    这篇文章主要为大家详细介绍了C语言之包含min函数的栈,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02

最新评论