返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++的sstream标准库详细介绍
  • 152
分享到

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

sstreamC++ 2022-11-15 23:11:32 152人浏览 八月长安
摘要

c++的sstream标准库介绍 接下来我们继续看一下C++风格的串流控制 ,C++引入了ostringstream、istringstream、stringstream这三个类,要

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

--结束END--

本文标题: C++的sstream标准库详细介绍

本文链接: https://lsjlt.com/news/172722.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++的sstream标准库详细介绍
    C++的sstream标准库介绍 接下来我们继续看一下C++风格的串流控制 ,C++引入了ostringstream、istringstream、stringstream这三个类,要...
    99+
    2022-11-15
    sstream C++
  • C++标准库中sstream与strstream的区别详细解析
    在C++有两种字符串流,一种在sstream中定义,另一种在strstream中定义。它们实现的东西基本一样。 strstream里包含class strstreambuf;clas...
    99+
    2022-11-15
    C++标准库 sstream strstream
  • Python标准库datetime date模块的详细介绍
    目录前言1、定义1.2、常见错误2、date类常用的函数2.1、获取当期日期2.2、格式化日期2.2.1、ctime()2.2.2、datetime.date对象2.2.3、repl...
    99+
    2024-04-02
  • 最新C++程序iostream标准库介绍
    我们从一开始就一直在利用C++的输入输出在做着各种练习,输入输出是由iostream库提供的,所以讨论此标准库是有必要的,它与C语言的stdio库不同,它从一开始就是用多重继承与虚拟继承实现的面向对象的层次结构,作为一个c++的标准库组件提...
    99+
    2023-06-03
  • C++超详细讲解标准库
    目录一、有趣的重载二、C++ 标准库三、小结一、有趣的重载 操作符 << 的原生意义是按位左移,例:1 <<2; 其意义是将整数 1 按位左移2位,即:000...
    99+
    2024-04-02
  • C++中标准线程库的基本使用介绍
    目录1.创建线程异步执行2.通过使用互斥锁防止线程冲突3.采用信号量控制线程的运行4.通过promise实现进程间通信总结Qt的封装程度比较高的线程类用多了,发现C++标准库里面的线...
    99+
    2024-04-02
  • MySQL游标详细介绍
    目录1、什么是游标(或光标)2、如何使用游标1、声明游标2、打开游标3、使用游标4、关闭游标3、代码举例4、小结1、什么是游标(或光标) 虽然我们也可以通过筛选条件 WHERE...
    99+
    2024-04-02
  • c++中STL库队列详细介绍
    1.queue单向队列(先进先出,只能从尾端加元素,从头删元素)         使用方式:在前面加上文件名‘#include<queue>',再进行声明'queue&l...
    99+
    2024-04-02
  • C#属性的详细介绍
    这篇文章主要讲解了“C#属性的详细介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#属性的详细介绍”吧!C# 属性示例代码class TimePeriod  ...
    99+
    2023-06-17
  • C++继承详细介绍
    在我们进行开发的时候,我们经常会遇到抽象出来的类之间具有继承关系。 举个简单的例子,比如我们在设计某游戏,当中需要定义Human也就是人这个类。每个人有名字,以及一定的血量,能够工作...
    99+
    2024-04-02
  • C++的类与C#的类详细介绍
    本篇内容介绍了“C++的类与C#的类详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!许多编程人员学习C++总结经验为,有的觉得C++语...
    99+
    2023-06-17
  • C++模板超详细介绍
    目录1.前言2.函数模板3.类模板1.前言 模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。 模板是创建泛型类或函数的蓝图或公式。 通常有两种形式:函数模板和...
    99+
    2024-04-02
  • C++BoostMultiIndex使用详细介绍
    目录一、关于BOOST的容器二、Boost.MultiIndex练习一、关于BOOST的容器 容器是 C++ 中最有用的数据结构之一。标准库提供了许多容器,而 Boost 库提供的更...
    99+
    2022-11-13
    C++ Boost MultiIndex C++ MultiIndex
  • C++超详细介绍模板
    目录定义例子格式处理方法定义 函数模板不是一个实在的函数,编译器不能为其生成可执行代码。定义函数模板后只是一个对函数功能框架的描述,当它具体执行时,将根据传递的实际参数决定其功能。 ...
    99+
    2024-04-02
  • C语言指针的详细介绍
    这篇文章主要介绍“C语言指针的详细介绍”,在日常操作中,相信很多人在C语言指针的详细介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言指针的详细介绍”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!目录...
    99+
    2023-06-20
  • C#控件数组的详细介绍
    这篇文章主要介绍“C#控件数组的详细介绍”,在日常操作中,相信很多人在C#控件数组的详细介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#控件数组的详细介绍”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-17
  • c++中string和vector的详细介绍
    目录知识点1【STL的概述】知识点2【迭代器的案例】知识点3【string类】1、案例:string的构造和赋值知识点1【STL的概述】 STL(Standard Template ...
    99+
    2024-04-02
  • C++进程的创建和进程ID标识详细介绍
    目录进程的ID进程创建进程的ID 进程的ID,可称为PID。它是进程的唯一标识,类似于我们的身份证号是唯一标识,因为名字可能会和其他人相同,生日可能会与其他人相同…&h...
    99+
    2024-04-02
  • Android应用 坐标系详细介绍
    Android 应用坐标系详解:             ...
    99+
    2022-06-06
    Android
  • C语言指针详细介绍
    本篇内容主要讲解“C语言指针详细介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言指针详细介绍”吧!指针对于C来说太重要。然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作