C++:字符串流

news/2024/9/18 5:18:31

C++标准库中的<sstream>提供了比ANSI C的<stdio.h>更高级的一些功能,即单纯性、类型安全和可扩展性。

  (PS:自己解释的不知道准确不?)

str()成员函数的使用可以让stringstream对象返回一个string字符串。

c语言一般使用函数时候,最后,还有专门的代码去释放内存,c++一般就很少使用了,c++、 语言里面创建函数、变量之类的都是有生命周期的 ,用完了就自动释放内存,这个就是c++比c语言中优势之一。ss.str(string)里面含有参数,ss字符串流  然后str()指针指向String字符串,也就是说 输入流指向字符串的首地址,这样就可以一个一个指向string字符串中的所有元素 完成一个类似于遍历感觉的操作,这个函数就是一个指针而已,作用是指向一个地址,析构(就是清理)只能说是他的性质。(str()指针 指向字符串的首地址,字符串string生命周期结束后,指针被对象析构,如果 string对象调用结束后,指针还在,那么指针就会指向一个null的位置 代码出错)。

<sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本。简单起见,我主要以stringstream为中心,因为每个转换都要涉及到输入和输出操作。
注意,<sstream>使用string对象来代替字符数组。这样可以避免缓冲区溢出的危险。而且,传入参数和目标对象的类型被自动推导出来,即使使用了不正确的格式化符也没有危险。

----下面是在字符串流中,穿插使用模板函数(例如:在类型转换中使用模板)。

你可以轻松地定义函数模板来将一个任意的类型转换到特定的目标类型。例如,需要将各种数字值,如int、long、double等等转换成字符串,要使用以一个string类型和一个任意值t为参数的to_string()函数。to_string()函数将t转换为字符串并写入result中。使用str()成员函数来获取流内部缓冲的一份拷贝:

template<class T>
void to_string(string & result,const T& t)
{ostringstream oss;//创建一个流oss<<t;//把值传递如流中result=oss.str();//获取转换后的字符转并将其写入result
}

结果:

to_string(s1,10.5);//double到string

to_string(s2,123);//int到string

to_string(s3,true);//bool到string

可以更进一步定义一个通用的转换模板,用于任意类型之间的转换。函数模板convert()含有两个模板参数out_type和in_value,功能是将in_value值转换成out_type类型:

template<class out_type,class in_value>
out_type convert(const in_value & t)
{stringstream stream;stream<<t;//向流中传值out_type result;//这里存储转换结果stream>>result;//向result中写入值return result;
}

结果:

这样使用convert():

double d;

string salary;

string s=”12.56”;

d=convert<double>(s);//d等于12.56

salary=convert<string>(9000.0);//salary等于”9000”

在过去留下来的程序代码和纯粹的C程序中,传统的<stdio.h>形式的转换伴随了我们很长的一段时间。但是,如文中所述,基于stringstream的转换拥有类型安全和不会溢出这样抢眼的特性,使我们有充足得理由抛弃<stdio.h>而使用<sstream>。<sstream>库还提供了另外一个特性—可扩展性。你可以通过重载来支持自定义类型间的转换。
 

//基本数据类型转换例子 int转string
#include <string>
#include <sstream>
#include <iostream> 
int main()
{std::stringstream stream;std::string result;int i = 1000;stream << i; //将int输入流stream >> result; //从stream中抽取前面插入的int值std::cout << result << std::endl; // print the string "1000"
} 
//char *的转换
#include <sstream>
#include <iostream> 
int main()
{std::stringstream stream;char result[8] ;stream << 8888; //向stream中插入8888stream >> result; //抽取stream中的值到resultstd::cout << result << std::endl; // 屏幕显示 "8888"
} 
//再进行多次转换的时候,必须调用stringstream的成员函数clear().
#include <sstream>
#include <iostream>
int main()
{std::stringstream stream;int first, second;stream<< "456"; //插入字符串stream >> first; //转换成intstd::cout << first << std::endl;stream.clear(); //在进行多次转换前,必须清除streamstream << true; //插入bool值stream >> second; //提取出intstd::cout << second << std::endl;
} 

运行带clear()的结果,会输出456    1

运行不带clear的结果:第一个输出 456    第二个输出-564097321

-----istringstream

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;return 0;
}

运行结果:  (PS:此处在istr>>a时,并未进行输入,为什么直接默认为1)

上例中,构造字符串流的时候,空格会成为字符串参数的内部分界, 例子中对a,b对象的输入"赋值"操作证明了这一点,字符串的空格成为了整型数据与浮点型数据的分解点,利用分界获取的方法我们事实上完成了字符串到整型对象与浮点型对象的拆分转换过程。
str()成员函数的使用可以让istringstream对象返回一个string字符串(例如本例中的输出操作(cout<<istr.str();)。

参照博客:https://blog.csdn.net/liuweiyuxiang/article/details/89070296

https://blog.csdn.net/shs1992shs/article/details/83051298

http://c.biancheng.net/view/vip_3774.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pgtn.cn/news/18664.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

力扣(LeetCode)刷题,简单+中等题(第35期)

力扣(LeetCode)定期刷题&#xff0c;每期10道题&#xff0c;业务繁重的同志可以看看我分享的思路&#xff0c;不是最高效解决方案&#xff0c;只求互相提升。 第1题&#xff1a;解码异或后的排列 试题要求如下&#xff1a; 回答&#xff08;C语言&#xff09;&#xff1a; /…

main函数的argc与argv

int main(int argc, char** argv) 1、 argc与argv的默认值&#xff08;argv相当于数组&#xff0c;尺寸由argc控制&#xff09; argc默认为1&#xff0c;因此argv的默认是argv[0]—指向程序运行时的全路径名 #include <iostream> #include <opencv2/core/core.hpp>…

C++:文件操作2 文本文件和二进制文件的读写

文件读写的步骤&#xff1a; 1、包含的头文件&#xff1a;#include <fstream>//使用文件流进行操作 2、创建流 3、打开文件(文件和流关联) 4、读写 (写操作&#xff1a;<<,put( ), write( ) 读操作&#xff1a; >> , get( ),getline( ), read( )) 5、关…

JavaScript+TensorFlow.js让你在视频中瞬间消失

最近&#xff0c;一个实时人物删除&#xff08;Real Time Person removation&#xff09;的项目在GitHub上流行起来。 这个项目的神奇之处在于&#xff0c;只需要在网页浏览器中使用JavaScript&#xff0c;并使用200多行TensorFlow.js代码&#xff0c;就能让视频屏幕中的字符和…

PCB天线无线模组如何布局摆放?

随着物联网的高速发展&#xff0c;市面上涌现出越来越多的智慧产品&#xff0c;如智能家居&#xff0c;智能交通&#xff0c;智能城市等&#xff0c;这些终端设备大都靠无线收、发模块来实现信息的传递与接收。随着市场竞争的加剧&#xff0c;硬件设备正以集成化的方向发展&…

C++:while(getline())函数

首先说明getline&#xff08;&#xff09;的原型&#xff1a;getline&#xff08;istream &is,string &str,char delim&#xff09; istream &is表示一个输入流&#xff0c;譬如cin&#xff0c;string表示把从输入流读入的字符串存放在这个字符串中&#xff08;&am…

opencv隔点采样(下采样)

1、先验知识 对灰度图像来说&#xff0c;img.step[0]代表图像一行的的长度&#xff1a;img.step[0]img.cols; img.step[1]代表图像一个元素的数据大小&#xff1a;img.step[0]img.channels() ; img.data: uchar的指针&#xff0c;指向Mat数据矩阵的首地址。 2、验证&#xff1a…

C语言不完全类型是什么?有什么用途?

目录 1、不完全类型的概念 2、不完全类型的用途 3、不完全类型实践应用 1、不完全类型的概念 ISO&#xff08;国际标准化组织&#xff08;International Standard Organization&#xff09;&#xff09;将C语言分为三个不同类型集合&#xff1a; 函数类型、对象类型和不完全…