c++中使用串流时头文件strstream 和sstream有什么区别吗,两个头文件在其他方面又有

c++中使用串流时头文件strstream 和sstream有什么区别吗,两个头文件在其他方面又有,第1张

<sstream>中istringstream,ostringstream,stringstream

<strstream>中istrstream,ostrstream,strstream

1、sstream所定义的类型用于读写存储在内存中的string对象

istringstream从string对象中读取,由istream派生而来

ostringstream写到string对象中去,由ostream派生而来

stringstream对string对象进行读写,由iostream派生而来

2、istrstream类用于执行C风格的串流的输入 *** 作,也就是以字符串数组作为输入设备。

ostrstream类用于执行C风格的串流的输出 *** 作,也就是一字符串数组作为输出设备。

strstream类同时可以支持C风格的串流的输入输出 *** 作。

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

3、istrstream不会自己释放内存,也就是如果你不调用freeze(false),在析构函数中内存是不会释放的。并且istrstream处理中文也会有问题 。

C++的sstream标准库介绍

C++引入了ostringstream、istringstream、stringstream这三个类,要使用他们创建对象就必须包含sstream.h头文件

istringstream类用于执行C++风格的串流的输入 *** 作。

ostringstream类用于执行C风格的串流的输出 *** 作。

stringstream类同时可以支持C风格的串流的输入输出 *** 作。

istringstream类是从istream(输入流类)和stringstreambase(c++字符串流基类)派生而来, ostringstream是从ostream(输出流类)和stringstreambase(c++字符串流基类)派生而来, stringstream则是从iostream(输入输出流类)和和stringstreambase(c++字符串流基类)派生而来。C++的sstream标准库介绍C++的sstream标准库介绍

其实两个都是C++文件流的分支,在C++有一个stream这个类,所有的I/O都以这个“流”类为基础的,也就是他的子类。

首先来说fstream吧!

在fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是:

void open(const char* filename,int mode,int access)

参数:

filename: 要打开的文件名

mode: 要打开文件的方式

access: 打开文件的属性

打开文件的方式在类ios(是所有流式I/O类的基类)中定义,常用的值如下:

ios::app: 以追加的方式打开文件

ios::ate: 文件打开后定位到文件尾,ios:app就包含有此属性

ios::binary: 以二进制方式打开文件,缺省的方式是文本方式。两种方式的区别见前文

ios::in: 文件以输入方式打开

ios::out: 文件以输出方式打开

ios::nocreate: 不建立文件,所以文件不存在时打开失败

ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败

ios::trunc: 如果文件存在,把文件长度设为0

可以用“或”把以上属性连接起来,如ios::out|ios::binary

打开文件的属性取值是:

0:普通文件,打开访问

1:只读文件

2:隐含文件

4:系统文件

可以用“或”或者“+”把以上属性连接起来 ,如3或1|2就是以只读和隐含属性打开文件。

例如:以二进制输入方式打开文件c:config.sys

fstream file1

file1.open("c:config.sys",ios::binary|ios::in,0)

如果open函数只有文件名一个参数,则是以读/写普通文件打开,即:

file1.open("c:config.sys")<=>file1.open("c:config.sys",ios::in|ios::out,0)

另外,fstream还有和open()一样的构造函数,对于上例,在定义的时候就可以打开文件了:

fstream file1("c:config.sys")

特别提出的是,fstream有两个子类:ifstream(input file stream)和ofstream(outpu file stream),ifstream默认以输入方式打开文件,而ofstream默认以输出方式打开文件。

ifstream file2("c:pdos.def")//以输入方式打开文件

ofstream file3("c:x.123")//以输出方式打开文件

所以,在实际应用中,根据需要的不同,选择不同的类来定义:如果想以输入方式打开,就用ifstream来定义;如果想以输出方式打开,就用ofstream来定义;如果想以输入/输出方式来打开,就用fstream来定义。

二、关闭文件

打开的文件使用完成后一定要关闭,fstream提供了成员函数close()来完成此 *** 作,如:file1.close()就把file1相连的文件关闭。

三、读写文件

读写文件分为文本文件和二进制文件的读取,对于文本文件的读取比较简单,用插入器和析取器就可以了;而对于二进制的读取就要复杂些,下要就详细的介绍这两种方式

1、文本文件的读写

文本文件的读写很简单:用插入器(<<)向文件输出;用析取器(>>)从文件输入。假设file1是以输入方式打开,file2以输出打开。示例如下:

file2<<"I Love You"//向文件写入字符串"I Love You"

int i

file1>>i//从文件输入一个整数值。

这种方式还有一种简单的格式化能力,比如可以指定输出为16进制等等,具体的格式有以下一些

*** 纵符 功能 输入/输出

dec 格式化为十进制数值数据 输入和输出

endl 输出一个换行符并刷新此流 输出

ends 输出一个空字符 输出

hex 格式化为十六进制数值数据 输入和输出

oct 格式化为八进制数值数据 输入和输出

setpxecision(int p) 设置浮点数的精度位数 输出

比如要把123当作十六进制输出:file1<<hex<<123要把3.1415926以5位精度输出:file1<<setpxecision(5)<<3.1415926。

然后再来说说sstream类:

其实他与fstream类的用法十分相似,只不过把输入输出的目标由文件改为了字符串;

istringstream:

Creates a type basic_istringstream specialized on a char template parameter.

ostringstream:

Creates a type basic_ostringstream specialized on a char template parameter.

stringbuf:

Creates a type basic_stringbuf specialized on a char template parameter.

stringstream:

Creates a type basic_stringstream specialized on a char template parameter.

wistringstream:

Creates a type basic_istringstream specialized on a wchar_t template parameter.

wostringstream:

Creates a type basic_ostringstream specialized on a wchar_t template parameter.

wstringbuf:

Creates a type basic_stringbuf specialized on a wchar_t template parameter.

wstringstream:

Creates a type basic_stringstream specialized on a wchar_t template parameter.

以下是一个小例子,看看是不是理解:将num中的数字输入到bob这个我们定义的字符串读写流中,然后再将bob输出到字符串str中:

int num

stringstream bob

bob <<num

string suzzy(bob.str())


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12005065.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存