C++的IO处理中的头文件以及类理解(2)<sstream>头文件

  头文件<sstream>中定义的类型都继承iostream头文件中定义的类型。除了继承得来的操作,sstream中定义的类型还增加了一些成员来管理与流相关联的string.

一、 <sstream>头文件

  该标准头文件中包含了ostringstream、istringstream、stringstream这三个类,要使用他们创建对象,对内存中的string对象进行io处理。

  这些类型可以向string写入数据,从string读取数据,就像string是一个IO流一样。

istringstream从string读取数据,(istringstream对象用来把一个已定字符串中的以空格、Tab隔开的内容提取出来,功能类似于C语言中的sscanf函数)只支持>>操作符,
ostringstream向string写入数据,只支持<<操作符,
stringstream既可从string读数据也可向string写数据,支持<<、>>操作符。

类:

1. stringbuf 类

  http://www.cplusplus.com/reference/sstream/stringbuf/stringbuf/

  构造一个string stream buffer (字符串流对象)。

构造函数如下:

default (1)
explicit stringbuf (ios_base::openmode which = ios_base::in | ios_base::out);
initialization (2)
explicit stringbuf (const string& str,
ios_base::openmode which = ios_base::in | ios_base::out);
copy (3)
stringbuf (const stringbuf&) = delete;
move (4)
stringbuf (stringbuf&& x);

(1)空的构造函数, 默认构造函数

  构造一个 stringbuf 对象, 用一个空的序列, 参数which是 设置的open model。

(2)初始化构造函数

  用一个string 对象作为内容,来构造stringbuf 对象, 参数which 是打开模式

(3)拷贝构造函数

  应为已经deleted,舍弃,因此没有拷贝构造。

(4)移动构造函数

  获取参数stringbuf x 的内容;

  x 处于不确定但是有效的状态。

  不确定内部的sequence 是x ,或者是x 的拷贝, 但是两个都是相关依赖的序列。

参数情况:

 str, 参数string对象,内容已经拷贝;

 x,  参数stringbuf对象,其内容已经移动;

which:打开输出xx对象的模式, 即进入内部stringbuf对象,给定的字符串序列。 是一个枚举类型。任意合并值都是重要影响。

  •   os_base::in, 表示:input, 内部的字符串序列支持input 操作;
  •   ios_base::out: 表示,output, 序列支持输出操作。
  •   ios_base::ate:表示 at end, 写入位置在构造函数的后面, 并且在每次用str()成员重置内容后。
  •   其他类型的ios_base::openmode, 例如: ios_base::app. 注意, ios_base::out ,总是设置ostringsteam 对象, 尽管没有显示设置参数which。 注意, ostringsteam是一个输出steam, 其内部的stringbuf对象可能设置支持input 操作的。

测试程序:

// stringbuf example
#include <iostream> // std::cout, std::ostream, std::hex
#include <sstream> // std::stringbuf
#include <string> // std::string int main ()
{
std::stringbuf buffer; // empty stringbuf

  
 //将 stringbuf 对象与 输出流关联,这样,可以利用输出输入,对stringbuf对象进行赋值
std::ostream os (&buffer); // associate stream buffer to stream // mixing output to buffer with inserting to associated stream:
 //函数sputn(),

  buffer.sputn ("255 in hexadecimal: ",);
os << std::hex << ; std::cout << buffer.str();// 拷贝当前stringbuf 对象内内容,并以string对象返回。 return ;
}

输出

255 in hexadecimal: ff

注意:

streambuf::sputn()函数原型

streamsize sputn (const char* s, streamsize n);
作用:
  将字符序列写入到streambuf内部的内容中。
  
参数:
  s:指向字符串序列的指针,用于将要写入stringbuf的内容。
  n:将要写入字符的长度, 非负值, streamsize是符号整数类型。
返回:
  已经写入字符的数量
// sputn() example
#include <iostream> // std::streambuf
#include <fstream> // std::ofstream int main () {
  //字符序列,字符数组,指针
const char sentence[]= "Sample sentence";//注意,末尾有字符串终止符号1个字符 std::ofstream ostr ("test.txt");
if (ostr) {
std::streambuf * pbuf = ostr.rdbuf();
  //直接用streambuf进行直接输入内容
pbuf->sputn (sentence,sizeof(sentence)-);
ostr.close();
} return ;
}

2. . 测试

  

ostringstream::ostringstream()构造函数

测试:

// ostringstream constructor
#include <iostream> // std::cout, std::ios
#include <sstream> // std::ostringstream int main () {
std::ostringstream foo; // out
std::ostringstream bar (std::ostringstream::ate); // out|ate foo.str("Test string");
bar.str("Test string"); foo << ;
bar << ; std::cout << foo.str() << '\n';
std::cout << bar.str() << '\n';
return ;
}

输出:

101t string

Test string101

  ostringstream, istringstream,stringstream类型的用法程序

#include "sstream.hpp"
#include <iostream>
#include <sstream> // ostringstream/istringstream/stringstream
#include <string> // reference: http://www.cplusplus.com/reference/sstream/ostringstream/
int test_ostringstream()
{
// ostringstream: Output stream class to operate on strings
// 1. rdbuf: Returns a pointer to the internal stringbuf object
std::ostringstream oss1;
// using stringbuf directly 直接使用内部的stringbuf来进行输出,用函数
std::stringbuf *
pbuf = oss1.rdbuf();
pbuf->sputn("Sample string", );//输入字符个数13的一个字符数组。
std::cout << pbuf->str() << std::endl;//获取输出内容的字符串形式 // 2. str(): 返回当前strem对象内的内容拷贝的数据,以字符串返回。returns a string object with a copy of the current contents of the stream
// str(const string& s): 删除string对象之前的内容, 并设置为与steam对象内的内容一样的数据。sets s as the contents of the stream, discarding any previous contents.
// The object preserves its open mode: if this includes ios_base::ate,注意,如果包含ios_base::ate模式,则对象讲标六之前的内容, 写入的位置将会移动到new sequence的末尾。
// the writing position is moved to the end of the new sequence
std::ostringstream oss2;
oss2 << "One hundred and one: " << ;
std::string s1 = oss2.str();
std::cout << s1 << '\n'; // 3. swap: c++11, Exchanges all internal data between x and *this
  // 将参数ostringsteam 的内用与当前ostringsteam内容互换。
std::ostringstream foo;
std::ostringstream bar;
foo << ;
bar << ;
foo.swap(bar);
std::cout << "foo: " << foo.str() << '\n';
std::cout << "bar: " << bar.str() << '\n'; // 4. swap: Exchanges the values of the ostringstream objects x and y
std::ostringstream foo2;
std::ostringstream bar2;
foo2 << ;
bar2 << ;
std::swap(foo2, bar2); // unqualified (uses argument-dependent lookup)
std::cout << "foo2: " << foo2.str() << '\n';
std::cout << "bar2: " << bar2.str() << '\n'; // 5. ostringstream constructor: Construct an object and optionally initialize its content
// explicit ostringstream ( openmode which = ios_base::out );
// explicit ostringstream ( const string & str, openmode which = ios_base::out );
std::ostringstream foo3; // out, 默认的
std::ostringstream bar3(std::ostringstream::ate); // out|ate, 这是追加模式,任何后续的输入,到从streambuf的末尾追加。
foo3.str("Test string"); // str: sets s as the contents of the stream, discarding any previous contents
bar3.str("Test string");
foo3 << ;
bar3 << ;
std::cout << foo3.str() << '\n'; // 101t string
std::cout << bar3.str() << '\n'; // Test string101 std::string s{ "abcde" };
std::ostringstream foo4(s); // 创建存储s的副本的ostringstream对象
std::cout << "foo4: " << foo4.str() << std::endl; // reference: https://latedev.wordpress.com/2011/11/16/c-stringstreams/
std::ostringstream os;
os << "the ";
os << "quick ";
os << "brown ";
os << "fox";
std::string s2 = os.str();
std::cout << s2 << std::endl; // double to string ==> c++11 to_string
double d = 123.45;
std::ostringstream os3;
os3 << d;
std::string s3 = "The value of d is " + os3.str();
std::cout << s3 << std::endl; return ;
} // reference: http://www.cplusplus.com/reference/sstream/istringstream/
int test_istringstream()
{
// istringstream: Input stream class to operate on strings 输入流类来操作string类型
// 1. istringstream constructor
std::istringstream is("the quick brown fox");
std::string s;
while (is >> s) {//直接用输入流来设置string
std::cout << s << std::endl;
} std::string stringvalues = "125 320 512 750 333";
std::istringstream iss6(stringvalues);//用字符串设置输入流 for (int n = ; n<; n++) {
int val;
// Elements in a character stream are considered to be separated by 'white space'
// which is basically space, tab and newline characters,空格符,tab, 下一行的符号,都来表示分隔符
iss6 >> val;
std::cout << val * << '\n';
} // 2. rdbuf: Returns a pointer to the internal stringbuf object, with which the object was associated on construction
  //返回指针,指向内部的stringbuf对象, 这是早stringsteam流在创建的时候关联的。
std::istringstream iss;
std::stringbuf *pbuf = iss.rdbuf(); // using stringbuf directly:直接用stringbuf作为输入,最终表现仍然是istringsteam对象
pbuf->str("Example string"); int size = pbuf->in_avail();
while (pbuf->in_avail()>)
std::cout << static_cast<char>(pbuf->sbumpc());
std::cout << std::endl; // 3. str(): returns a string object with a copy of the current contents of the stream
// str(const string& s): sets str as the contents of the stream, discarding any previous contents.
// The object preserves its open mode: if this includes ios_base::ate,
// the writing position is moved to the end of the new sequence
std::istringstream iss2;
std::string strvalues = "32 240 2 1450";
iss2.str(strvalues);//用参数stirng类设置istringsteam的内容。 for (int n = ; n<; n++) {
int val;
// Elements in a character stream are considered to be separated by 'white space'
// which is basically space, tab and newline characters
iss2 >> val;//依次输出到变量string
std::cout << val << '\n';
}
std::cout << "Finished writing the numbers in: ";
std::cout << iss2.str() << '\n'; // 4. swap: c++11, Exchanges all internal data between x and *this.
std::istringstream foo("");
std::istringstream bar(""); foo.swap(bar); int val;
foo >> val; std::cout << "foo: " << val << '\n'; //
bar >> val; std::cout << "bar: " << val << '\n'; // 100 // 5. swap: Exchanges the values of the istringstream objects x and y
std::istringstream foo2("");
std::istringstream bar2(""); swap(foo2, bar2); // unqualified (uses argument-dependent lookup)
int val2;
foo2 >> val2; std::cout << "foo2: " << val2<< '\n'; //
bar2 >> val2; std::cout << "bar2: " << val2 << '\n'; // return ;
} // reference: http://www.cplusplus.com/reference/sstream/stringstream/
int test_stringstream()
{
// 1. stringstream: Stream class to operate on strings
std::stringstream ss;//即处理输入字符串,有处理输出字符串
ss << << ' ' << ; int foo, bar;
ss >> foo >> bar; std::cout << "foo: " << foo << '\n'; //
std::cout << "bar: " << bar << '\n'; // 200 // 2. rdbuf: Returns a pointer to the internal stringbuf object, with which the object was associated on construction
std::stringstream ss2; // using stringbuf directly:
std::stringbuf *pbuf = ss2.rdbuf();
pbuf->sputn("Example string", );//输入 13个字符的字符串 char buffer[];
pbuf->sgetn(buffer, );//获取80个字符的string buffer std::cout << buffer << std::endl; // 3. str(): returns a string object with a copy of the current contents of the stream
// str(const string& s): sets s as the contents of the stream, discarding any previous contents.
// The object preserves its open mode: if this includes ios_base::ate,
// the writing position is moved to the end of the new sequence
std::stringstream ss3;
ss3.str("Example string");// str()函数作为内容输入
std::string s3 = ss3.str();//输出内部内容,以字符串形式
std::cout << s3 << '\n'; // 4.1 swap: c++11, Exchanges all internal data between x and *this
std::stringstream foo4;
std::stringstream bar4; foo4 << ;
bar4 << ; foo4.swap(bar4);
int val;
foo4 >> val; std::cout << "foo4: " << val << '\n'; //
bar4 >> val; std::cout << "bar4: " << val << '\n'; // 100 // 4.2 swap(stringstream): Exchanges the values of the stringstream objects x and y
std::stringstream foo5;
std::stringstream bar5; foo5 << ;
bar5 << ; std::swap(foo5, bar5);
int val5;
foo5 >> val5; std::cout << "foo5: " << val5 << '\n'; //
bar5 >> val5; std::cout << "bar5: " << val5 << '\n'; // return ;
}

3. C++还提供了另一个头文件<strsteam>,其功能和<ssteam>相似,是为了兼容c 类型的字符串(字符数组)而提出来的。

  <strstream> 中istrstream,ostrstream,strstream 也有对应的三个类型。

istrstream类用于执行C风格的串流的输入操作,也就是以字符数组作为输入设备。 
ostrstream类用于执行C风格的串流的输出操作,也就是一字符数组作为输出设备。 
strstream类同时可以支持C风格的串流的输入输出操作。

  注意:

  strstream里的东西已经被c++标准明确标明为“不要再使用”

endl;

C++的IO处理中的头文件以及类理解(2)<sstream>头文件的更多相关文章

  1. MFC中文件对话框类CFileDialog详解及文件过滤器说明

    当前位置 : 首页 » 文章分类 :  开发  »  MFC中文件对话框类CFileDialog详解及文件过滤器说明 上一篇 利用OpenCV从摄像头获得图像的坐标原点是在左下角 下一篇 Word中为 ...

  2. php加了命名空间没引入初始化文件:类的命名空间要与文件夹名一致namespace Business\Event;缺少了Event

    php加了命名空间没引入初始化文件:类的命名空间要与文件夹名一致namespace Business\Event;缺少了Event

  3. C++的IO处理中的头文件以及类理解(1)

    C++语言不直接处理输入输出,而是通过一簇定义在标准库中的类型来处理IO.这些类型支持从设备读取数据.向设备写入数据的IO操作,设备可以是文件.控制台窗口等,还有一些类型允许内存IO,即,从strin ...

  4. idea中如何将单个java类导出为jar包文件?

    idea作为一个java开发的便利IDE工具,个人是比较喜欢的,今天来探索个小功能:  导出单个类文件为jar包! 偶有这种需求,就是某个类文件独立存在,但是需要将其导出为jar,供别人临时使用,或者 ...

  5. io流中的装饰模式对理解io流的重要性

    为了说明 io流中的装饰者模式对理解io流的重要性,我想先简要介绍以下io的装饰模式. 装饰(decorator)你也可以翻译成修饰.比如:一个会精通化学数学的物理学家.在这个"物理学家&q ...

  6. IO包中的RandomAccessFile类

    RandomAccessFile RandomAccessFile 是随机访问文件的类.它支持对文件随机访问的读取和写入,即我们也可以从指定的位置读取/写入文件数据,因为该类在其内部封装了一个数组和指 ...

  7. C++文件流类与文件流对象

    文件流是以外存文件为输入输出对象的数据流.输出文件流是从内存流向外存文件的数据,输入文件流是从外存文件流向内存的数据.每一个文件流都有一个内存缓冲区与之对应. 请区分文件流与文件的概念,不用误以为文件 ...

  8. C++学习47 文件的概念 文件流类与文件流对象 文件的打开与关闭

    迄今为止,我们讨论的输入输出是以系统指定的标准设备(输入设备为键盘,输出设备为显示器)为对象的.在实际应用中,常以磁盘文件作为对象.即从磁盘文件读取数据,将数据输出到磁盘文件.磁盘是计算机的外部存储器 ...

  9. [19/03/29-星期五] IO技术_File(文件)类(可操作文件,不能操作其里边内容,位于Java.io 包中)&递归遍历

    一.概念 java.io.File类:代表文件和目录. 在开发中,读取文件.生成文件.删除文件.修改文件的属性时经常会用到本类. 以pathname为路径创建File对象,如果pathname是相对路 ...

随机推荐

  1. antd-react-mobile(踩坑记录)

    1.按照官网步骤进行, $ npm install -g create-react-app # 注意:工具会自动初始化一个脚手架并安装 React 项目的各种必要依赖,如果在过程中出现网络问题,请尝试 ...

  2. 关于STM32CubeMX使用LL库设置PWM输出

    HAL和LL库 HAL是ST为了实现代码在ST家族的MCU上的移植性,推出的一个库,称为硬件抽象层,很明显,这样做将会牺牲存储资源,所以项目最后的代码比较冗余,且运行效率大大降低,运行速度受制于fla ...

  3. python3安装pcap遇到的问题

    最近想在win7上安装pypcap,遇到了一下问题,现在大概总结一下: 直接使用pip install pypcap,提示pcap.h not found: 网上下载pypcap安装包,运行pytho ...

  4. 去除web项目中的css、js缓存

    <link rel="stylesheet" type="text/css" href="~/Content/Home.css?param=Ma ...

  5. 微信小程序分享朋友圈

    原理:canvas生成图片再保存到手机 JS onShow: function () { var that = this; //1. 请求后端API生成小程序码 // that.getQr(); // ...

  6. server 打开失败

    server:An unexpected exception was thrown. 当server服务器遇到这样遇到不能料想的错误导致打开失败的情况下,我们可以找到一个com.genuitec.ec ...

  7. python 获取流文件 大小

    buffer_file_content=u"流文件内容" file_size = len(buffer_file_content)/ #kb

  8. VBA XML信息提取

    Option Explicit Sub 读取XML节点() '后期绑定 'Dim xdoc As Object 'Set xdoc = CreateObject("MSXML2.DOMDoc ...

  9. SSL及使用openssl实现CA

    TLS如何实现各种功能?数据如何加密在网络上传输? 网景(Netscape)公司在应用层和传输层加入了半层,把这个半层称之为SSL,SSL不是软件,可以理解是一个库,当http交给tcp层之前先通过s ...

  10. 《Java并发编程的艺术》Java并发机制的底层实现原理(二)

    Java并发机制的底层实现原理 1.volatile volatile相当于轻量级的synchronized,在并发编程中保证数据的可见性,使用 valotile 修饰的变量,其内存模型会增加一个 L ...