C++标准库中sstream与strstream的区别点总结

  • 时间:
  • 6273人关注

以下是对C++标准库中sstream与strstream的区别进行了详细的分析介绍,需要的朋友可以过来参考下,另外这篇文章主要知识点是关于C++标准库、sstream、strstream、C++标准库的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子资料:

教程详情电子资料
  • 教程类别:C++标准库
  • 编辑整理:居嘉勋
  • 教程字数:435字节
  • 阅读时间:大概7分钟
  • 下载本教程(DOC版)
  • C和C++游戏趣味编程(配套资源)
  • C++语言导学
  • C++实践之路
  • C/C++ 面试基础知识总结
  • 图解数据结构:使用C++
  • 在C++有两种字符串流,一种在sstream中定义,另一种在strstream中定义。它们实现的东西基本一样。

    strstream里包含
    class strstreambuf;
    class istrstream;
    class ostrstream;
    class strstream;
    它们是基于C类型字符串char*编写的

    sstream中包含
    class istringstream;
    class ostringstream;
    class stringbuf;
    class stringstream;
    class …….
    它们是基于std::string编写的

    因此ostrstream::str()返回的是char*类型的字符串
    而ostringstream::str()返回的是std::string类型的字符串

    在使用的时候要注意到二者的区别,一般情况下推荐使用std::string类型的字符串
    当然如果为了保持和C的兼容,使用strstream也是不错的选择

    码农之家
    C++的sstream标准库详细介绍

    14小时57分钟前回答

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

    展开阅读

    上一篇:关于数据结构Treap的知识点总结

    下一篇:ShellExecute函数怎么使用

    相关内容

    • C++标准模板库编程实战

      C++标准模板库编程实战

      《C++标准模板库编程实战》 介绍最新的C++14标准的API、库和扩展,以及如何将它们运用到C++14程序中。在书中,作者Ivor Horton 则阐述了什么是STL,以及如何将它们应用到程序中。我们将学习如何

      大小:130.9 MBC++编程

      点击下载
    • 例说Visual C++ 6.0

      例说Visual C++ 6.0

      例说VisualC++6.0 丛书名:流行软件“例说”丛书 作者:冯彬 北京大学 出版日期:2000-06 VisualC++6.0是Microsoft公司推出的功能强大的Windows编程语言。本书通过大量的实例,由浅入深、循序渐进地介绍了VisualC++6.0的使用方法。首先介绍了VisualC++开发环境,然后举了一个常见的例子来说明使用VisualC++开发Windows应用程序的一般过程,接下来逐步讲述VisualC++的基本内容:MFC消息处理,图形学与绘图程序,模式对话框、无模式对话框及W

      大小:31.55 MBC++

      点击下载
    • Visual C++项目开发全程实录

      Visual C++项目开发全程实录

      Visual C++项目开发全程实录(第4版) 以社区视频监控系统、企业电话语音录音管理系统、快乐五子棋、屏幕录像系统、超市进销存管理系统、图书管理系统、学生管理系统、学生考试系统、人

      大小:1.44 GBVisual C++

      点击下载
    • 挑战C++程序语言

      挑战C++程序语言

      挑战C++程序语言 作者:蔡文辉/黄国峰/张真诚 出版年:2003-12-1 C++程序语言是目前最受欢迎的面向对象程序语言之一,不但保留了原来C语言的许多优点,另外加入了面向对象所需的一些机制。本书主要以简单的实例来说明C++语言的结构、数据类型的种类、流程的控制方法、面向对象程序设计方法、对象的继承机制、运算符的重载以及多态性等,而且还介绍了软件工程的知识,使读者对于如何开发大型的软件系统能有一个清晰的概念。另外本书提供了完整的范例程

      大小:25.06 MBC++

      点击下载
    • 深入实践C++模板编程

      深入实践C++模板编程

      C++模板编程领域的经典著作,由资深C++开发工程师撰写。本书以透彻分析原理为前提,深入讲解了模板编程的基本原理、标准库中算法与容器等模板的实现原理;以实践为导向,通过大量的模

      大小:76.6 MBC++

      点击下载

    学习笔记

    13小时54分钟前回答

    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是……