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

news2024/11/26 22:32:51

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

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

        文件流类有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()输出更新后的字符数据。

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

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

相关文章

【NI国产替代】PCIe 高速采集卡, 8 位双通道数字化仪器,采集卡最高采样率高达 5 GS/s 模拟带宽高达 500 MHz

• 8 位双通道数字化仪器 • 最高采样率高达 5 GS/s • 模拟带宽高达 500 MHz • 采用 PCIe 3.0 x 8 接口 • 基于 Xilinx Kintex UltraScale, XCKU040 • 提供硬件、FPGA、软件定制服务 高速采集卡是一款 8 位双通道数字化仪器&#xff0c;采集卡最高采样率高达 5 GS/s 模…

【python报错】list indices must be integers or slices, not tuple

【Python报错】list indices must be integers or slices, not tuple 在Python中&#xff0c;列表&#xff08;list&#xff09;是一种常用的数据结构&#xff0c;用于存储一系列的元素。当你尝试使用不支持的索引类型访问列表元素时&#xff0c;会遇到list indices must be in…

【教学类-36-07】20240608动物面具(通义万相)-A4大小7图15手工纸1图

背景需求&#xff1a; 风变的AI对话大师一年到期了&#xff0c;也没有看到续费的按钮。不能使用它写代码了。 MJ早就用完了&#xff0c;最后480次&#xff0c;我担心信息课题会用到它生图&#xff0c;所以不敢用。 最近探索其他类似MJ的免费出图工具——找到了每天给50张免费图…

DIO控制卡,IRIG-B码卡,PCI-E总线接口卡,百兆数据采集卡

DIO控制卡 ● 4路继电器输出&#xff08;5A250VAC&#xff09; ● 4路开关量输入&#xff08;24VDC&#xff09; ● 1路IDE接口 ● 端口浪涌保护 IRIG-B码卡 ● 1路IRIG-B对时接口&#xff08;RS485/光纤&#xff09; ● 1路IEEE1588 V2对时接口&#xff08;RJ45/光纤&#…

linux本地搭建dns

不需要图形化界面 使用的是dnsmasq&#xff0c;配置简单 1.安装 deb系列linux apt-get install dnsmasqrhat系列linux yum install dnsmasq2.编辑配置文件 vi /etc/dnsmasq.conf设置主dns服务器&#xff0c;比如现有公用的的114.114.114.114 8.8.8.8这类的 server8.8.8.8…

C语言详解(动态内存管理)2

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

零空间(Null Space)控制例子

零空间(Null Space)控制是一种用于多任务控制系统的技术,特别适用于机器人和多自由度系统。其基本原理是将控制任务分解为不同的优先级,其中高优先级任务在主空间(Task Space)中执行,而低优先级任务在零空间(Null Space)中执行。这样可以保证在完成主要任务的同时,次…

VScode的插件使用

1、正则插件-1 2、AI助手工具-1-fittentech 3、画图工具-1 4、GitHub的查看工具 5、shell测试工具

vuInhub靶场实战系列--Kioptrix Level #1

免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关。 目录 免责声明前言一、环境配置1.1 靶机信息1.2 靶场配置 二、信息收集2.1 主机发现2.2 端口扫描2.2.1 masscan2.2.2 nmap 2.3 指纹识别2.4 目录扫描2.4.1 dirb…

Python在股票交易分析中的应用:布林带与K线图的实战回测

引言 在股票交易的世界中&#xff0c;技术分析是投资者们用来预测市场动向的重要工具。布林带&#xff08;Bollinger Bands&#xff09;作为一种动态波动范围指标&#xff0c;因其直观性和实用性而广受欢迎。本文将通过Python代码&#xff0c;展示如何使用布林带结合K线图来分…

【动态规划-BM79 打家劫舍(二)】

题目 BM79 打家劫舍(二) 描述 你是一个经验丰富的小偷&#xff0c;准备偷沿湖的一排房间&#xff0c;每个房间都存有一定的现金&#xff0c;为了防止被发现&#xff0c;你不能偷相邻的两家&#xff0c;即&#xff0c;如果偷了第一家&#xff0c;就不能再偷第二家&#xff0c;如…

鸿蒙低代码开发一个高频问题

在版本是DevEco Studio 3.1.1 Release&#xff0c;SDK是3.1.0(API9)。 创建和设计的visual文件经常会遇到无法渲染的情况&#xff0c;或者自定义组件在Custom列表中突然不见了的情况。 有以下报错信息的&#xff1a; JSON schema validation error: data/visualModel/value/…

【python报错】TypeError: dict.get() takes no keyword arguments

【Python报错】TypeError: dict.get() takes no keyword arguments 在Python中&#xff0c;字典&#xff08;dict&#xff09;是一种非常灵活的数据结构&#xff0c;用于存储键值对。dict.get()方法是用来从字典中获取与给定键&#xff08;key&#xff09;相关联的值&#xff0…

opera打不开网页最简单的解决办法

如果以上为解决问题&#xff0c;继续下面操作 检查网络连接&#xff1a; 确认您的电脑已连接到互联网。 检查网络连接是否稳定&#xff0c;网络速度慢或链路拥堵可能会导致网页加载失败。 修改Local State文件&#xff1a; 关闭Opera浏览器。 定位到Opera浏览器的配置…

Acrobat Pro DC 2023 for Mac/Win:全平台PDF编辑器的终极解决方案

对于需要处理PDF文档的个人和企业用户来说&#xff0c;Adobe Acrobat Pro DC 2023是一款不可或缺的工具。作为全球领先的PDF编辑器&#xff0c;Acrobat Pro DC 2023在Mac和Windows平台上提供了丰富的功能和令人印象深刻的性能&#xff0c;使其成为用户编辑、转换和管理PDF文档的…

idea debug时提示”Method breakpoints may dramatically slow down debugging“的解决办法

问题现象 今天同事喊我过去看一个问题&#xff0c;项目正常启动的时候没问题&#xff0c;debug模式就卡住了&#xff0c;很久不动。我推测是哪个断点导致的&#xff0c;一看断点果然有情况。在方法上打了断点。 解决方式(Android Studio一样的解决&#xff09; 1、View Brea…

分享一个用python的本地WIFI密码查看器

本章教程&#xff0c;主要分享一个本地wifi密码查看器&#xff0c;用python实现的&#xff0c;感兴趣的可以试一试。 具体代码 import subprocess # 导入 subprocess 模块&#xff0c;用于执行系统命令 import tkinter as tk # 导入 tkinter 模块&#xff0c;用于创建图形用…

Typescript 中 tsconfig.json 无法写入文件,因为它会覆盖输入文件

先来看看问题 在开发ts项目的时候&#xff0c;包错提示无法写入文件 tsconfig.json无法写入文件"url"因为它会覆盖输入文件 这是tsconfig.json文件配置问题&#xff0c;需要加入下面的配置就好了&#xff1a; {"compilerOptions": {"outDir": …

Android开机动画关闭流程

一步一图项目上要加一个开机动画结束的回调&#xff0c;我这边看下如何加 好&#xff0c;老规矩&#xff0c;如何启动动画&#xff1f;动画是谁启动的&#xff1f;怎么关闭的&#xff1f;谁通知关闭的 带着问题看源码 动画的启动流程 开机动画的主入口在哪&#xff1f; 这个…

ChatGPT-4o体验demo

OpenAI 最近推出了其最新的人工智能语言模型——GPT-4O。该模型是在原有 GPT-4 的基础上进行优化而成&#xff0c;旨在提升生成质量和响应速度。GPT-4O 采用了更加高效的架构设计&#xff0c;使其在处理复杂文本时表现出更快的速度和更高的准确性。GPT-4O 在训练过程中融入了最…