C++面向对象程序设计 - 字符串流

        文件流是以外存文件为输入输出对象的数据流,字符串流不是以外存文件为输入输出的对象,而以内存中用户定义的字符数组(字符串)为输入输出的对象,即将数据输出到内存中的字符数组,或者从字符数组(字符串)将数据读入。字符串流也称为内存流。

        字符串流也有相应的缓冲区,开始时缓冲区是空的。如果向字符数组存入数据,随着向流插入数据,流缓冲区中的数据不断增加,待缓冲区满了(或遇换行符),一起存入字符数组。如果是从字符数组读数据,先将字符数组中的数据送到流缓冲区,然后从缓冲区中提取数据赋给有关变量。

        文件流类有ifstream、ofstream和fstream,而字符串流类有istrstream(input string stream缩写), ostrstream(output string stream缩写)和strstream(string stream缩写)。向内存中的一个字符数组写数据就如同向文件写数据一样,但有几点不同:

  1. 输出时数据不是流向外存文件,而是流向内存中的一个存储空间。输入时从内存中的存储空间读取数据。严格意义上说,这不属于输入输出,称为读写比较合适。
  2. 字符串流对象关联的不是文件,而是内存中的一个字符数组,因此不需要打开和关闭文件。
  3. 每个文件的最后都有一个文件结束符,表示文件的结束。而字符串流所关联的字符数组中没有相应的结束标志,用户要自己指定一个特殊字符作为结束符,在向字符数组写入全部数据后要写入此字符。

        字符串流类没有open成员函数,因此要在建立字符串流对象时通过给定参数来确立字符串流与字符数组的关联。

一、建立输出字符串流对象

        ostrstream类表示将数据写入字符串的输出流,提供的构造函数原型为:

ostrstream::ostrstream(char *buffer, int n, int mode = ios::out);

        buffer是指向字符数组首元素的指针,n为指定的流缓冲区的大小(一般选与字符数组的大小相同,也可不同),第3个参数是可选的,默认为ios::out方式。示例如下:

#include <strstream> // 注意:在某些编译器中,这个头文件可能叫做 <strstream.h>  
#include <iostream>  
  
int main() {  
    char buffer[50];  
    std::ostrstream oss(buffer, sizeof(buffer));  
    // std::ends 用于添加空字符并设置流的状态  
    oss << "Hello, " << 42 <<',' <<20.0f <<',' <<true << std::ends; // 将数据写入字符串的输出流。
    std::cout << oss.str() << std::endl; // oss.str() 返回内部字符串  
    oss.freeze(false); // 如果需要,释放缓冲区以供进一步使用(可选)  
    return 0;  
}

        运行结果如下图:

二、建立输入字符串流对象

        istrstream类表示从字符串中读取数据的输入流,提供了两个带参的构造函数,其原型为:

istrstream::istrstream(char *buffer);

istrstream::istrstream(char *buffer, int n);

        buffer是指向字符数组首元素的指针,用它来初始化流对象。示例如下:

#include <strstream> // 注意:在某些编译器中,这个头文件可能叫做 <strstream.h>  
#include <iostream>  
using namespace std;
int main() {  
    const char* str = "Hello 42 20 1";  
    istrstream iss(str);  
    int num;  
    int num2;
    char word[20];
	bool flag;  
    iss >> word >> num >>num2 >>flag; // 读取字符串和整数  
    cout << "Read: " <<word  <<endl;  
    cout <<num <<endl;
    cout <<num2 <<endl;
    cout <<flag <<endl;
    return 0;  
}

        运行后结果如下图:

三、建立输入输出字符串流对象

        strstream类是一个双向的字符串流,既可以读取也可以写入数据,但它没有提供输入和输出之间的严格隔离,因此可能导致混淆和错误。提供的构造函数的原型为:

strstream::strstream(char *buffer, int n, int mode);

      示例代码如下:

#include <strstream> // 注意:在某些编译器中,这个头文件可能叫做 <strstream.h>  
#include <iostream>  
using namespace std;
int main() {  
    char buffer[50];  
    strstream ss(buffer, sizeof(buffer));  
    ss << "Hello " << 42; // 写入字符串和整数  
    cout <<ss.str() <<endl <<endl;
    ss.seekg(0); // 将输出位置设置回开始处  
    char word[20];  
    int num;  
    ss >> word >> num; // 读取刚才写入的字符串和整数  
    cout <<"Read: " <<endl;
	cout <<word <<endl;
	cout <<num << endl;  
    return 0;  
}

          运行结果如下图:

        以上三个字符串流类在头文件strstream中定义的,因此程序中在用到istrstream、ostrstream和strstream类时应包含头文件strstream。

        注意是str()成员函数返回指向内部缓冲区的指针,这个缓冲区在析构时可能会被销毁,因此如果您需要长时间保留这个字符串,应该复制它。

四、排序示例

        在一个字符数组中存放10个整数,以空格相间隔,要求将它们放到整型数组中,再按大小排序,然后再存放回字符数组中。代码如下:

#include <strstream> 
#include <iostream>  
using namespace std;
int main() {  
	// 定义10个整数字符
	char ch[50] = "12 34 65 -23 -32 33 62 99 310 35";
	// 输出ch
	cout <<"original sting:" <<ch <<endl;
	int size = 10;
	// 定义存储数组
	int nums[size];
	// 定义输入流对象
	istrstream iss(ch, sizeof(ch));
	// 循环读取
	for(int i = 0; i < size; i++){
		iss >>nums[i];
	}
	// 显示结果
	cout <<"original value:";
	for(int j = 0; j < size; j++) cout <<nums[j] <<' ';
	cout <<endl;
	
	// 对数组进行排序(冒泡排序)
	int temp;
	for(int i = 0; i < size - 1; i++){
		for(int j = i + 1; j < size; j++){
			if(nums[i] > nums[j]){
				temp = nums[i];
				nums[i] = nums[j];
				nums[j] = temp;	
			}
		}
	}
	// 建立输出字符串流对象并与数组关联
	ostrstream oss(ch, sizeof(ch));
	// 循环将10个整数添加到字符数组中
	for(int i = 0; i < size; i++) oss <<nums[i] <<" ";
	oss <<ends;			// 加入'\0'
	// 排序后
	cout <<"Ranking value:" <<ch <<endl;
}

        运行后结果如下图:

        如上所示,1)用字符串流时不需要打开和关闭文件;2)通过字符串流从字符数组读数据就如同从键盘读数组一样,可以从字符数组读入字符数据。3)用输出字符串流数组oss写数据时,是人数组的首地址开始的,因此更新了数组的原内容。

五、stringstream

       由于ostrstream、istrstream和strstream类已被废弃,并且stringstream类提供了更强大和灵活的功能,现C++代码应该使用stringstream代替这些旧的流类。stringstream类允许你在同一个对象中同时进行输入和输出操作,但提供了更好的控制和错误检查。

        stringstream 是 C++ 标准库中的一个类,它属于 <sstream> 头文件,并且提供了字符串与流之间的交互功能。通过使用 stringstream类可以像操作文件流(如 ifstream 和 ofstream)一样来操作字符串,这包括向字符串中插入(或提取)数据。

基本说明

  1. stringstream 对象可以像其他流对象一样使用,如 cout 或 cin。
  2. 你可以使用插入运算符(<<)向 stringstream 对象中插入数据,也可以使用提取运算符(>>)从 stringstream 对象中提取数据。
  3. stringstream 对象的内部存储是一个字符串,你可以通过调用 str() 成员函数来获取这个字符串。
     

        现在通过stringstream类将“四、排序示例”重新实现,代码如下:

#include <iostream>  
#include <sstream>  
#include <string> 
using namespace std;
int main(){
	// 创建一个 stringstream 对象  
    stringstream ss;
    // 将整数字符串插入到ss对象中
    ss.str("12 34 65 -23 -32 33 62 99 310 35");
    // 输出字符串
    cout <<"original:" <<ss.str() <<endl;
    // 定义长度
    int size = 10;
    // 提取整数
    int nums[size];
    for(int i = 0; i < size; i++) ss >>nums[i];
    // 输出nums数组中整数
    cout <<"array nums:";
    for(int i = 0; i < size; i++) cout <<nums[i] <<" ";
    cout <<endl;
	// 冒泡排序
	int temp;
	for(int i = 0; i < size - 1; i++){
		for(int j = i + 1; j < size; j++){
			if(nums[i] > nums[j]){
				temp = nums[i];
				nums[i] = nums[j];
				nums[j] = temp;	
			}
		}
	}
	// 清空ss
	ss.clear();
	// 重新插入数据
	for(int i = 0; i < size; i++) ss << nums[i] <<" ";
	// 输出最新结果
	cout <<"Ranking value:" <<ss.str();
	return 0;
}

        运行后结果如下图:

        示例中我们首先是创建了一个stringstream对象ss,通过str()函数插入了字符串数据,再通过str()输出字符串数据。然后使用重载运算符“>>”对字符串中整数进行提取,存储到nums数组中。再通过冒泡排序,将nums数组进行排序。最后通过重载运算符“<<”将数组中的整数输出到对象ss中,并通过str()输出更新后的字符数据。

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

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

相关文章

中间代码生成

一&#xff0e;实验题目 DO-WHILE循环语句的中间代码生成 二&#xff0e;实验目的 通过设计、编制、调试一个 do-while 循环语句的语法及语义分析程序&#xff0c;加深对 法及语义分析原理的理解&#xff0c;并实现词法分析程序对单词序列的词法检查和分析。 三&#xff0e; 实…

c++【入门】正多边形每个内角的度数

限制 时间限制 : 1 秒 内存限制 : 128 MB 题目 根据多边形内角和定理&#xff0c;正多边形内角和等于&#xff1a;&#xff08;n &#xff0d; 2&#xff09;180(n大于等于3且n为整数&#xff09;&#xff08;如下图所示是三角形、四边形、五边形、六边形的形状&#xff09…

云服务器CPU和内存直接被zzh恶意挖矿程序打满,如何解决?

回顾 最近在服务器上面部署网站&#xff0c;刚开始使用还是没问题的&#xff0c;当时一段时间之后发现CPU和内存总是被打满&#xff0c;本地没有跑大的应用&#xff0c;主要有mysql、nginx、redis&#xff0c;一度还以为是nginx 的问题&#xff0c;但是后来排除了。之后使用ht…

Python私教张大鹏 Vue3整合AntDesignVue之Anchor 锚点

用于跳转到页面指定位置。 何时使用 需要展现当前页面上可供跳转的锚点链接&#xff0c;以及快速在锚点之间跳转。 案例&#xff1a;锚点的基本使用 核心代码&#xff1a; <template><a-anchor:items"[{key: part-1,href: #part-1,title: () > h(span, {…

GAT1399协议分析(10)--单图像删除

一、官方接口 由于批量删除的接口&#xff0c;图像只能单独删除。 二、wireshark实例 这个接口比较简单&#xff0c;调用request delete即可 文本化&#xff1a; DELETE /VIID/Images/34078100001190001002012024060513561300065 HTTP/1.1 Host: 10.0.201.56:31400 User-Age…

【Proteus8.16】Proteus8.16.SP3.exe的安装包,安装方法

下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/14ZlETF7g4Owh8djLaHwBOw?pwd2bo3 提取码&#xff1a;2bo3 管理员打开proteus8.16.SP3.exe一路装就行了&#xff0c;许可证选Licence2.lxk,点安装后关闭&#xff0c;然后继续装完。 然后打开Patch-Proteus-8.16-…

树莓派4B 零起点(一) 树莓派 无屏 从购买到启动

目录 背景 一. 准备工作 二、烧录系统 三、连接系统 背景 准备开发ROS机器人&#xff0c;在淘宝上购买的树莓派4B(4G)到货了&#xff0c;配件都很齐全&#xff0c;那么就直接开箱验货。 一. 准备工作 1 、硬件&#xff1a;(如下图) (我的购买链接: 树莓派4B 4g 套件) 2…

pikachu靶场全流程

目录​​​​​​​ 暴力破解&#xff1a; 1.基于表单的暴力破解&#xff1a; 2.验证码绕过(on server)&#xff1a; 3.验证码绕过(on client)&#xff1a; token防爆破&#xff1a; XSS&#xff1a; 1.反射型xss(get)&#xff1a; 2.反射性xss(post)&#xff1a; 3.存…

搭建python虚拟环境,并在VSCode中使用

创建环境 python -m venv E:\python\flask\venv激活环境 运行下图所示的bat文件 退出环境 执行下面的语句 deactivateVSCode中配置&#xff1a; ①使用CTRLshiftp命令&#xff0c;使用CTRLshiftp命令&#xff0c;输入&#xff1a; Python: Select Interpreter②选择之前创建…

据报道,FTC 和 DOJ 对微软、OpenAI 和 Nvidia 展开反垄断调查

据《纽约时报》报道&#xff0c;联邦贸易委员会 (FTC) 和司法部 (DOJ) 同意分担调查微软、OpenAI 和 Nvidia 潜在反垄断违规行为的职责。 美国司法部将牵头对英伟达进行调查&#xff0c;而联邦贸易委员会将调查 OpenAI 与其最大投资者微软之间的交易。 喜好儿网 今年 1 月&a…

电子电气架构——车载诊断DTC一文通

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标…

不确定性+电动汽车!含高比例新能源和多类型电动汽车的配电网能量管理程序代码!

前言 能源供应的可持续性和清洁性是当今世界共同关注的议题&#xff0c;配电网与可再生能源发电相结合&#xff0c;通过多能互补和梯级利用&#xff0c;在不同时空取长补短&#xff0c;提高能源利用率&#xff0c;减少温室气体排放&#xff0c;是解决能源短缺和环境问题的有效…

Ruoyi-Vue-Plus 下载启动后菜单无法点击展开,

1.Ruoyi-Vue-Plus框架下载后运行 2.使用mock数据 3.进入页面后无法点击菜单 本以为是动态路由或者菜单逻辑出了问题&#xff0c;最后发现是websocket的问题 解决办法 把这两行代码注释 页面菜单即可点击。 以上。

htb_office

端口扫描 namp -sSVC 10.10.11.1380&#xff0c;445 80端口 robots.txt 只有/administrator可以访问 Joomla joomscan扫描 joomscan --url http://10.10.11.3/ 版本为4.2.7&#xff0c;存在cve CVE-2023-23752 Joomla未授权访问Rest API漏洞 访问路径 /api/index.php/…

推荐系统三十六式学习笔记:原理篇.内容推荐05|从文本到用户画像有多远?

目录 从文本开始构建用户画像一、结构化文本1、TF-IDF2、TextRank3、内容分类&#xff1a;4、实体识别5、聚类6、词嵌入 二、标签选择1、卡方检验2、信息增益 总结 对于一个早期的推荐系统来说&#xff0c;基于内容推荐离不开用户构建一个初级的画像&#xff0c;这种初级的画像…

JAVA高级-反射与动态代理(十五)

观看尚硅谷视频做的视频笔记 一、高级-反射与动态代理&#xff08;十四&#xff09; 1、反射概述 1&#xff09;java程序中&#xff0c;所有的对象都有两种类型&#xff1a;编译时类型&#xff0c;运行时类型&#xff0c;而很多时候对象的编译类型和运行时类型不一致。 此处…

数据库分库分表mycat

为啥要分库分表 IO瓶颈&#xff1a;热点数据太多&#xff0c;数据库缓存不足&#xff0c;产生大量磁盘IO&#xff0c;效率较低。 请求数据太多&#xff0c;带宽不够&#xff0c;网络IO瓶颈。 CPU瓶颈&#xff1a;排序、分组、连接查询、聚合统计等SQL会耗费大量的CPU资源&#…

pre-commit 慢

执行这个命令 pre-commit run --all-files 有时候会卡在Initializing environment for https://github.com/xxx那里&#xff0c;如下图&#xff1a; 这个情况可以这样复现&#xff1a; git clone gitgithub.com:TheKevJames/coveralls-python cd coveralls-python python3.1…

c# 学习 2

常量 转义字符 类型转换

关于python中的关键字参数

在python语言中存在两种传参方式&#xff1a; 第一种是按照先后顺序来传参&#xff0c;这种传参风格&#xff0c;称为“位置参数”这是各个编程语言中最普遍的方式。 关键字传参~按照形参的名字来进行传参&#xff01; 如上图所示&#xff0c;在函数中使用关键字传参的最大作…