在C++有两种字符串流,也称为数组I/O流,一种在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也是不错的选择。
但要记住一点,strstream虽仍然是C++语言标准的一部分,但已被C++标准宣称为“deprecated”,也就是不再提倡使用了,也说不定以后干粹就没了。

1、先介绍一下sstream

//stringstream流以空格为边界符,使用其须包含sstream头文件
//istringstream 用法
istringstream istring;
string ss("ss 8346520");
istring.str(ss);
int i=0;
string s;
istring>>s>>i;
cout<<s<<" "<<i<<endl;
//或者
istringstream istring("ss 8346520");
int i=0;
string s;
istring>>s>>i;
cout<<s<<" "<<i<<endl;
//都将打印 s内容是ss,i内容是8346520的结果;//ostringstream 用法
string s="test";
int i=8346520;
int j=0;
string s1;
ostringstream ostring;//不能写成ostringstream ostring<<s<<" "<<i;
ostring<<s<<" "<<i;
cout<<ostring.str()<<endl;//ostring流内保存内容是 test 8346520
istringstream istring(ostring.str());
istring>>s1>>j;//要注意此处的顺序;
cout<<s1<<"――――"<<j<<endl;

2、简单说说strstream:
        基于数组的类有istrstream、ostrstream和strstream。它们分别用来创建输入、输出和输入/输出流。这些类的基类之一是strstreambuf,它定义了派生类使用的几个底层的具体属性。
除了strstreambuf以外,istream 也是istrstream的基类。类ostrstream包括了类ostream。

strstream也包括了类iostream。所以,所有基于数组的类和“普通”I/O类一样存取相同的成员函数。

创建基于数组的输出流
要将一个输出流和一个数组关联起来,可使用下列ostream的构造函数:
ostrstream ostr(char *buf, int size, int mode=ios::out);
其中,buf是指向数组的指针,该数组接收写入流的字符。数组的长度由参数size确定。缺省
时,流以输出方式打开,但也可以将几项或在一起复合为所需的方式(例如,可以包含ios::
app使输出添加在数组中已存在的信息的尾部)。mode的缺省值可以满足大多数的要求。
一旦打开了一个基于数组的输出流,所有对这个流的输出就放在数组中。但是,任何输出都不能写到数组的限界之外,任何这种企图都会导致错误。
下面是一个介绍基于数组的输出流的简单程序。

#include <iostream>
#include <strstream>
using namespace std;
int main()
{int arraysize=50;char *pbuffer=new char[arraysize];ostrstream ostr(pbuffer,arraysize,ios::out);ostr<<"Hello"<<" ";ostr<<99-14<<hex<<" ";ostr.setf(ios::showbase);ostr<<100<<ends; //使用ostrstream输出到流对象的时候,要用ends结束字符串cout<<pbuffer;delete[] pbuffer;return 0;
}

使用数组作输入:
要将输入流和数组关联起来,可使用下列istrstream的构造函数:
istrstream istr(char*buf);
其中,buf是指向数组的指针,该数组作为每次向流输入的字符源。 buf所指的数组必须以空结束。空结束符从不从数组中读取。

下面是一个用字符串输入的例子:

#include <iostream>
#include <strstream>
using namespace std;
int main()
{const char s[]="10 Hello 15 12.23 done";istrstream ins(s);int i;char str[80];float f;//reading: 10 Helloins >>i;ins >>str;cout<<i<<" "<<str<<endl;// reading:f 12.23 done.ins>>i;ins>>f;ins>>str;cout<<hex<<i<<" "<<f<<" "<<str;return 0;
}

最后是文件i/o流:

//ifstream 用法 须包含fstream头文件
ifstream infile("in.txt");//或者ifstream infile;infile.open("1.txt");
infile.close();//fstream对象只能与1个文件关联,所以打开另外一个,必须关闭上一个;
infile.clear();//如果是循环创建fstream流的话,.close()和clear()函数就应该重视;
infile.open("d:/in1.txt");//文件夹地址应使用反斜杠;
if(infile){//使用前检测状态是个好习惯string s;infile>>s;//将读取文件里第1个单词;getline(infile,s);将读取文件里的第1行cout<<s<<endl;
}

//ofstream 用法
这里涉及很多文件模式,如下:
in――――――――――打开文件做读操作
out――――――――打开文件做写操作
app――――――-添加模式:在每次写之前找到文件尾
ate――――――――打开文件后立即将文件定位在文件尾
trunc――――-打开文件时清空已存在的文件流
binary――――以二进制模式进行IO操作
out,trunc,app只能用于ofstream和fstream对象关联的文件;
in模式只使用于ifstream和fstream对象关联的文件
所有的文件都可以用ate或binary模式打开;
默认时:ifsteam对象关联的文件以in模式打开;ofstream对象关联的文件以out模式打开,以out模式打开的文件会被清空;

string file="d:/out.txt";
ofstream outfile(file.c_str());//默认模式
outfile<<"hello world\n";
outfile.close();//注意close;
outfile.clear();
outfile.open(file.c_str(),ofstream::app);//显式更改文件模式,添加模式
outfile<<"\nhello world again!";

sstream和strstream以及fstream相关推荐

  1. vs中没有fstream_sstream和strstream以及fstream

    在C++有两种字符串流,也称为数组I/O流,一种在sstream中定义,另一种在strstream中定义.它们实现的东西基本一样.strstream里包含class strstreambuf;clas ...

  2. C++标准库中sstream和strstream的区别

    在C++有两种字符串流,一种在sstream中定义, 另一种在strstream中定义. 它们实现的东西基本一样. strstream里包含 class strstreambuf; class ist ...

  3. sstream和strstream的用法

    在C++有两种字符串流,也称为数组I/O流,一种在 strstream 中定义,另一种在 sstream 中定义.它们实现的东西基本一样. strstream里包含: class strstreamb ...

  4. sstream和strstream的区别

    <sstream> 中istringstream,ostringstream,stringstream <strstream> 中istrstream,ostrstream,s ...

  5. 【学习日志】2022.10.16 万用头文件 sstream C++进制转换

    万用头文件  #include<bits/stdc++.h>包含了目前c++所包含的所有头文件!!!! #include <bits/stdc++.h> C++常用输入输出 ( ...

  6. C++的iostream标准库介绍+使用详解(转)

    0 为什么需要iostream 我们从一开始就一直在利用C++的输入输出在做着各种练习,输入输出是由iostream库提供的,所 以讨论此标准库是有必要的,它与C语言的 stdio库不同,它从一开始就 ...

  7. C++的iostream标准库介绍

    C++的iostream标准库介绍 0 为什么需要iostream 1 iostream: istream 和 ostream 2 fstream: ifstream 和 ofstream 3 str ...

  8. C/C++之标准输入输出

    Tips:  1. 本人当初学习C/C++的记录.  2. 资源很多都是来自网上的,如有版权请及时告知!  3. 可能会有些错误.如果看到,希望能指出,以此共勉! 文件   在此之前,有必要先了解一下 ...

  9. poj 2337 Catenyms 【欧拉路径】

    题目链接:http://poj.org/problem?id=2337 题意:给定一些单词,假设一个单词的尾字母与还有一个的首字母同样则能够连接.问能否够每一个单词用一次,将全部单词连接,能够则输出字 ...

最新文章

  1. EM算法(Expectation Maximization)期望最大化算法
  2. 暖通专业标准规范大全_中高级职称专业分类改革 机械类十大热门专业分享
  3. 将0~N打乱顺序,然后排序
  4. oracle集群图例
  5. Redis Lua脚本实现原子性操作
  6. mysql 账户管理_Mysql账户管理_MySQL
  7. html移动滚动彩字字幕特效,如何制作滚动字幕 旋转好莱坞字幕特效效果图(超多滚动效果)...
  8. face alignment by 3000 fps系列学习总结
  9. 分类器是如何做检测的?——CascadeClassifier中的detectMultiScale函数解读
  10. 中文词语概念上下位图谱项目
  11. mysql cmd 删除表_MySQL查看表和清空表的常用命令总结
  12. 数论基础之组合数计数问题
  13. 有没有能把excel表弄成线上多人填报的办法?
  14. ubuntu wiznote 无法显示内容 只有标题
  15. Linux面试题总结(一)
  16. Java:Eclipse下载安装教程,以及Eclipse 安装汉化包的方法
  17. Qt 多语言切换——Qt语言家
  18. scrapy数据清洗:
  19. Linux安全模块(LSM)
  20. 单片机课设中期报告_本科毕业设计中期检查报告.doc

热门文章

  1. CPU位数、操作系统位数、应用程序位数浅析
  2. Java 用接口实现加减乘除计算器
  3. 第76节:Java中的基础知识
  4. NOIP2018 游记
  5. Linux常用基本命令(rename,basename,dirname)
  6. TFS环境搭建--添加新用户
  7. (转)OO设计初次见面
  8. Java实现阶乘的和
  9. 接口测试怎么进行,如何做好接口测试
  10. Fragment标签页+OKHttp网络请求数据+MVP模式