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";// 输出chcout <<"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;	}}}// 清空ssss.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()输出更新后的字符数据。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索Linux中的dbus-binding-tool:理解其用途与用法

探索Linux中的dbus-binding-tool&#xff1a;理解其用途与用法 在Linux系统中&#xff0c;D-Bus是一个消息总线系统&#xff0c;它允许应用程序之间发送和接收消息。这种机制对于实现进程间通信&#xff08;IPC&#xff09;和系统服务集成非常有用。其中&#xff0c;dbus-bind…

特别名词Test Paper2

特别名词Test Paper2 cabinet 橱柜cable 电缆&#xff0c;有线电视cafe 咖啡厅cafeteria 咖啡店&#xff0c;自助餐厅cage 笼子Cambridge 剑桥camel 骆驼camera 相机camp 露营campus 校园candidate 候选人&#xff0c;考生candle 蜡烛canteen 食堂capital 资金&#xff0c;首都…

《中国数据库年度行业分析报告》节选:数据库关键技术及发展趋势

墨天轮于5月29日正式发布 《2023年中国数据库年度行业分析报告》&#xff0c;总结梳理了中国数据库行业的技术演进及趋势。作为云上数据库和数据计算领域的领先者&#xff0c;拓数派受邀参与创作&#xff0c;联合编写了《AI 时代下新一代数据仓库的演进》《从数据库到数据计算系…

VMware导入小白分享的MacOS版本之后,无法开机的解决方案

前言 这段时间陆续有小伙伴找到小白&#xff0c;说&#xff1a;导入小白分享的MacOS版本之后&#xff0c;出现无法开机的问题。 遇到这个问题&#xff0c;并不是说明分享版本有问题&#xff0c;因为大部分小伙伴导入之后都没有出现类似的问题&#xff0c;都是导入之后开机&…

unity中常见的角色控制方法

使用物理引擎&#xff08;如 Rigidbody&#xff09;来控制角色 using UnityEngine;public class PlayerController : MonoBehaviour {public float moveSpeed 5f;public float jumpForce 5f;private Rigidbody rb;private bool isGrounded;void Start(){// 获取角色的 Rigid…

NVeloDocx一个基于NVelocity的word模版引擎

NVeloDocx是一个基于NVelocity的Word模版引擎&#xff0c;目前主要是用于E6低代码开发平台供用户轻松制作各种Word报告模版。 有以下优点&#xff1a; 1、完全的NVelocity语法&#xff1b; 2、直接在Word中写NVelocity脚本&#xff0c;使用非常非常方便&#xff1b; 3、完全兼…

SOA设计的标准要求

1.文档标准化 SOA服务具有平台独立的自我描述XML文档。Web服务描述语言是用于描述服务的标准语言。 2.通信协议标准 SOA服务用消息进行通信&#xff0c;该消息通常使用XML Schema来定义&#xff08;也称作XSD&#xff0c;XML Schema Definition&#xff09;。消费者和提供者&a…

数据集笔记:DGraph 大规模动态图数据集

dgraph-web (xinye.com) 1 数据集介绍 DGraph 是一个有向无权的动态图&#xff0c;包含超过 370 万个节点以及 430 万条动态边DGraph 中的节点表示金融借贷用户&#xff0c;有向边表示紧急联系人关系&#xff0c;每个节点包含脱敏后的属性特征&#xff0c;以及表示是否为金融…

C++ STL -算法

目录 前言: 一. sort() 二.find() 三. for_each() 四. size() 五.copy() 六. 总结 前言: STL 算法是基于模板实现的&#xff0c;可用于不同类型的容器。 意义和作用&#xff1a; 提高代码的可复用性和可维护性.减少代码量&#xff0c;提高开发效率.提供高效、可靠的实…

rapidjson 打包过程插入对象

开发过程中遇到一种情况&#xff0c;在打包过程中插入一个字符串&#xff08;里面是json对象&#xff09;&#xff0c; 官方文档 没看到相关例子&#xff0c;不知道是不是自己粗心没找到。方法RawValue其实是一个通用打包方法&#xff0c;一般情况我们都调用的是String()、Int(…

vb开源项目推荐:PhotoDemon9.0一键批量去除图片水印

PhotoDemon 9.0作为一款开源免费的照片编辑器&#xff0c;提供了丰富的图片编辑和处理功能&#xff0c;可以通过PhotoDemon的批处理功能结合一些编辑技巧&#xff0c;来实现批量去除图片水印的目的。 以下是一个可能的步骤指南&#xff0c;用于在PhotoDemon 9.0中通过批处理间…

【CS.CN】深入解析HTTP中的Expect: 100-continue头:性能优化的利器还是鸡肋?

目录 0 序言 0.1 由来0.2 使用场景0.3 现在还需要吗&#xff1f; 1 Expect: 100-continue的机制2 语法 && 通过重新设置空的Expect头优化性能3 实例分析&#xff1a;长连接中的Expect问题解决4 总结 0 序言 0.1 由来 Expect: 100-continue头部字段最早在HTTP/1.1规…

深入解析Kafka消息丢失的原因与解决方案

深入解析Kafka消息丢失的原因与解决方案 Apache Kafka是一种高吞吐量、分布式的消息系统&#xff0c;广泛应用于实时数据流处理。然而&#xff0c;在某些情况下&#xff0c;Kafka可能会出现消息丢失的情况&#xff0c;这对于数据敏感的应用来说是不可接受的。本文将深入解析Ka…

密文域可逆信息隐藏安全性研究-从图像到视频

前言 随着云存储、云计算等新兴技术的兴起&#xff0c;海量的隐私信息被广泛地上传、存储到服务器上。为保证用户的隐私性&#xff0c;必须对用户的数据进行加密&#xff0c;然后再将其上传到服务器上。因此&#xff0c;密文域的可逆信息隐藏(reversible data hiding in encry…

【QT】浅析Qt应用程序的主函数,Qt应用程序启动流程

int main(int argc, char *argv[]) {QApplication a(argc, argv);qRegisterMetaType<QList<TreeListStruct>>("QList<TreeListStruct>");//注册自定义类型 按你实际业务 可有可无MainWindow w;w.show();return a.exec(); }这段代码是一个典型的Qt应…

数字人AI唇音同步解决方案,轻量高效,灵活部署

在数字化浪潮的推动下&#xff0c;企业对于高效、逼真的数字人形象需求日益增强。为满足这一市场需求&#xff0c;美摄科技凭借其深厚的AI技术积累&#xff0c;推出了一款革命性的数字人AI唇音同步解决方案&#xff0c;为企业带来前所未有的沟通体验。 一、精准捕捉&#xff0…

使用vue3+ts封装一个Slider滑块组件

创建一个名为 Slider.vue 的文件 <template><div class"slider-container"><inputtype"range":value"value"input"handleInput"change"handleChange"/><div class"slider-value">{{ val…

泛化能力的理解

第一个解释&#xff1a; 大模型泛化能力简介 泛化&#xff08;Generalisation&#xff09;可以理解为一种迁移学习的能力&#xff0c;大致可以理解为把从过去的经验中学习到的表示、知识和策略应用到新的领域&#xff0c;是大模型最被需要的能力。 在NLP的上下文中&#xff0c;…

React Hooks路由传参

场景&#xff1a;如何把想要的参数带到跳转过去的页面里呢&#xff1f;很简单 上代码&#xff1a; 在你需要跳转的页面上 引入 Link用来跳转使用 Link跳转并携带参数 然后需要什么参数就带什么过去喽 这里record里面存的就是我的数据 我只需要id和state然后到你跳转过去的页面…

【Mtk Camera开发学习】06 MTK 和 Qcom 平台支持通过 Camera 标准API 打开 USBCamera

本专栏内容针对 “知识星球”成员免费&#xff0c;欢迎关注公众号&#xff1a;小驰行动派&#xff0c;加入知识星球。 #MTK Camera开发学习系列 #小驰私房菜 Google 官方介绍文档&#xff1a; https://source.android.google.cn/docs/core/camera/external-usb-cameras?hlzh-…