C++练级计划-> 《IO流》iostream fstream sstream详解

如果是想全部过一遍就看完,如果想具体的了解某一个请点目录。因为有三种流的使用可能内容多 

目录

流是什么?

C++IO流(iostream)

io流的注意事项

cin和cout为什么能直接识别出类型和数据

fstream

fstream的使用方法: 

1.以二进制打开文件并写入和读取

2.以文本打开文件并读取或写入

3.用>> << 重载符号读取或写入

sstream

stringstream:

1.提取stringstream流中的数据

2.删除stringstream流中的数据

3.stringstream的常见用法:

4.stringstream能使用的oj题:


流是什么?

首先io流就是iostream,全称 in out stream,输入输出流。

怎么理解流呢?

把它想成一个数据结构(抽象的),里面流动的(存的)是字节流,或者字符流。

字节流就是二进制数据,字符流就是字符数据。二进制数据主要是图片视频等,字符数据就是一个文档全是字的。

 所以流就可以想象成从一个地方拿数据,然后供给另一个地方,南水北调,南边的水,供给北方

这里中间传输的过程就是流。南水放入,北方取出加工使用。

C++IO流

这里的ios_base就是大基类(父类),里面保存的就是每个流都应该有的功能,ios是继承自ios_base的一个类,但是不只是只有一个ios,这里的ios类旨在处理char单字符,而对于wchar这样的宽字符它是无法处理的,所以还有另外一个wios类专门用于处理wchar。

ios就是后面的所有类的基类(父类)

iostream(经常用于屏幕打印数据)

in out stream

cin:流提取(istream),用于从io流中提取数据,比如说读文件、获取键盘的信息等

cout:流插入(ostream),将数据放入io流中,供其他程序提取。比如写文件(将数据写到屏幕上就是打印)

cerr:也是流插入(ostream)。某处出错时,将错误数据放入io流。一般在屏幕打印

clog:也是流插入(ostream)。进行日志的输出,屏幕打印

fstream(文件)

file stream:顾名思义这个流是给文件使用的。

sstream(字符串)

string stream:这个则是给字符串使用的。

io流的注意事项

注意:1.cin是以空格和换行为分隔符的

在使用cin时如果我们在输入时,数据中间加了空格,有人要提取数据,提取到的是空格前的数据。下一次有人又来提取时,这时是先把之前空格后的数据先给出去。

#include <iostream>
using namespace std;
int main()
{int a = 0, b = 0;cin >> a; //输入:10 20cout << a << endl;cin >> b; //直接从输入缓冲区提取cout << b << endl;return 0;
}

如上代码我们输入时输入 10 20,第二次cin时根本不会停下来等你输入数据,而是直接把20给b。然后输出。所以在使用cin时要注意空格的使用

2.输入类型和要输出到的类型必须一致

3.getline函数:用于输入时只把换行当做分隔符。

这个函数只能用于字符串,所以1.中输入数字的情况用不了

#include <iostream>
#include <string>
using namespace std;
int main()
{string s;//cin>>s;          //cin输入,最终只输出hellogetline(cin, s);   //输入:"hello world"cout << s << endl; //输出:"hello world"return 0;
}

cin和cout为什么能直接识别出类型和数据

cin重载的>>运算符

 cout重载的<<运算符

在C++标准库中对于内置类型的输入和输出已经全部重载,所以cin和cout能识别类型是这个原因。对于自定义类型而言: class类,在定义类时如果需要使用>> 和 << 需要自己手写接口实现。实现方法对应自己类的功能。

fstream

fstream有三个类和一个filebuf缓冲区

文件流的三个类:

对应操作场景
ofstream只写
ifstream只读
fstream读+写

 文件的打开方式:

打开方式功能
in以读的方式打开文件
out以写的方式打开文件
binary以二进制方式对文件进行操作
ate输出位置从文件的末尾开始
app以追加的方式对文件进行写入
trunc先将文件内容清空再打开文件

文件流的函数:

成员函数功能
put插入一个字符到文件
write插入一段字符到文件
get从文件提取字符
read从文件提取多个字符
tellg获取当前字符在文件当中的位置
seekg设置对文件进行操作的位置
>>运算符重载将数据形象地以“流”的形式进行输入
<<运算符重载将数据形象地以“流”的形式进行输出

fstream的使用方法: 

1.以二进制打开文件并写入和读取

写入文件:

#include <iostream>
#include<fstream>
using namespace std;
void ofsteam_test_binary()
{//为什么o是写入,output是输出的意思,意味着我们要从流中输出给文件ofstream ofs;ofs.open("binoptest.txt", ofstream::binary | ofstream::out);//以二进制写的方式打开文件char str[] = "中国无敌";ofs.write(str, strlen(str));ofs.put('!');//put是单字符的写入//使用任何类时都要记得closeofs.close();
}
int main()
{ofsteam_test_binary();return 0;
}

解释:我们创建一个ofstream对象,用二进制out的方式打开文件binoptest.txt,为什么out是输出这里我们要把视角看成是流的视角:流把数据output进了binoptest.txt,所以ofstream是输出流。

结果:

1.在当前目录生成一个binoptest.txt文件 

2.文件内容为:

读取文件:

void ifstream_test_binary()
{ifstream ifs;ifs.open("binoptest.txt", std::ios::binary | std::ios::in);char str[32];//计算文档内容的大小ifs.seekg(0,std::ios::end);int len = ifs.tellg();ifs.seekg(0,std::ios::beg);//读取文件放入strifs.read(str, len);ifs.close();//字符串末尾置为0str[len] = '\0';printf("%s", str);
}

解释:创建ifstream对象,打开文件创建str储存读取出来的数据。

注意:计算文档大小没有什么size函数但是可以用下面的代码

//计算文档内容的大小ifs.seekg(0,std::ios::end);int len = ifs.tellg();ifs.seekg(0,std::ios::beg);

seekg用来定位读指针,第一个参数是偏移量,代表从哪里开始定位,第二个参数是根据偏移量后从哪里开始end代表结尾,beg代表开始,我们一开始就把定位移到了最后,然后tellg是用来计算当前读指针的偏移量的(从头开始计算),然后再让读指针回到beg开始,就完成了一次文档计数

结果 :

2.以文本打开文件并读取或写入

写入文件:

void ofstream_test_text()
{ofstream ofs;//默认的output方式是文本的ofs.open("text.txt");char str[] = "中国无敌";ofs.write(str, strlen(str));ofs.put('!');//put是单字符的写入//使用任何类时都要记得closeofs.close();
}

 和二进制的区别只是,在open时二进制文件和文本文件不同,open默认打开文件是以文本方式打开的,如果要使用二进制打开就需要设置打开方式。

结果:

读取文件:

void ifstream_test_text()
{ifstream ifs;ifs.open("text.txt");char str[32];//计算文档内容的大小ifs.seekg(0, std::ios::end);int len = ifs.tellg();ifs.seekg(0, std::ios::beg);//读取文件放入strifs.read(str, len);ifs.close();//字符串末尾置为0str[len] = '\0';printf("%s", str);
}

和写入文件一样:和二进制的区别就是open的打开方式。

结果: 

注意:除了指定二进制外,我们还可以指定读和写:默认的情况下:ifstream打开文件是以读的方式,ofstream打开文件是以写的方式打开,而fstream是以读加写的方式打开。

3.用>> << 重载符号读取或写入

写入文件:

void writefile()
{ofstream ofs;ofs.open("file.text");string s = "中国无敌!";ofs << s;
}

结果:

读取文件:

void readfile()
{ifstream ifs;ifs.open("file.text");string s;ifs >> s;cout << s;ifs.close();
}

结果:

 

可以看出如果以重载符来写入或者读取时使用方法和cout 和 cin 类似区别只是在于 cout 和 cin的默认设备分别是屏幕和键盘,而我们用文件流的写入和读取,可以自己选择文件。键盘和屏幕也是文件。 

sstream

对应操作场景
ostringstream输出操作
istringstream输入操作
stringstream输入操作+输出操作

介绍一下:sstream 全称 stringstream 字符串流:顾名思义一定和字符串有关,而这里的stringstream就是用来解决字符串转换的问题,在c语言时要进行字符串转换就要用到itoa等函数,在c++中用stringstream就可以完成 

stringstream:

因为用法类似所以这里只介绍stringstream,stringstream是在底层维护了一个字符串,在这个字符串中完成对应的操作,放进这个字符串的数据默认就变成字符了。

1.提取stringstream流中的数据

有两种从流中提取数据的方法:

    s.str(""); //将stringstream底层管理的string对象设置为""。s.clear(); //将上次转换状态清空掉

1.使用>>从流中提取

    int a = 10;string sa;stringstream s;s << a; //将int类型的a放入输入流s >> sa; //从s中抽取前面插入的int类型的值,赋值给string类型(方式一)cout << sa << endl;

2.使用.str()函数的方式提取

    double b = 3.14;s << b;sa = s.str(); //获取stringstream中管理的string类型(方式二)cout << sa << endl;

二者没什么差别>>是将stringstream中的内容通过复制的方式给出,而 .str()是通过 返回一个字符串的方式然后在赋值给出。

2.删除stringstream流中的数据
    s.str(""); //将stringstream底层管理的string对象设置为""。s.clear(); //将上次转换状态清空掉

上面的代码,首先将stringstream中的字符串给变为空字符串,然后用clear函数将状态清空。关于这个状态又是一个知识点:

stringstream底层在一次转换完成后会把标志位记成badbit这时代表的是流不可转换数据,使用clear后变成goodbit流才可转换。但是clear只是更改标记位而不会对内置的字符串进行更改所以这时需要将str置为空。

3.stringstream的常见用法:

1.将数据转换为字符类型

    int a = 10;string sa;stringstream s;s << a; //将int类型的a放入输入流s >> sa; //从s中抽取前面插入的int类型的值,赋值给string类型(方式一)cout << sa << endl;

2.字符串的拼接

#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{string rets;stringstream s;s << "2021" << "dragon"; //将多个字符串放入stringstream中s >> rets; //方式一获取cout << rets << endl;s.str(""); //将stringstream底层管理的string对象设置为空字符串s.clear(); //将上次转换状态清空掉s << "Thanks" << " " << "for" << " " << "reading"; //将多个字符串放入stringstream中rets = s.str(); //方式二获取cout << rets << endl;return 0;
}
4.stringstream能使用的面试题:

1.统计字符串的个数

输入:“hello world c plus plus”
输出:5

#include <iostream>
#include <sstream>
#include <string>using namespace std;int main() {string str = "hello world c plus plus";int count = 0;stringstream ss(str);string word;while (ss >> word)count++;cout << count << endl;return 0;
}

很简单因为使用 >> 符号是以空格或者换行为分割符的,所以只要统计总共有几次输入进流中即可。 

2.反转字符串中的单词

class Solution {
public:string reverseWords(string s) {string res,temp;stringstream ss(s);while(ss>>temp){cout<<temp<<endl;res = temp + " " + res;}if(!res.empty()){res.pop_back();}return res;}
};

这题也很简单,将s 传入 ss的构造函数中,这时ss的底层里保存的就是s。此时通过>>流提取符号放入temp中,将数据类似头插的方法将temp放到res前面最后再把最后的空格删除。从这里也可以看出stringstream的>> 流插入符号是从字符串头的位置开始插入的,所以才能让temp中每次只出现一个字符串。

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

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

相关文章

EDA软件研发的DevOps平台

1&#xff1a;什么是DevOps DevOps是十几年前&#xff0c;在互联网比较火的词&#xff0c;实际上就是ci/cd平台的另外一种说法&#xff0c;核心是说打破研发&#xff0c;测试&#xff0c;运维的边界&#xff0c;能够将整个产品开发的流程快速循环起来&#xff0c;随时可发版&a…

自动化是语法,智能化是语义与语用

自动化与智能化可以从语言学的角度来进行类比和探讨。 1. 自动化是语法 自动化可以类比为“语法”的部分&#xff0c;因为它关注的是操作过程的规则、结构和执行方式。语法是语言中关于词汇、句子结构和规则的系统&#xff0c;它提供了语言运作的框架和规范。类似地&#xff0c…

Spring源码-Bean的生命周期和模板方法

Bean的生命周期 之前我们提到过SpringApplication的run方法不光可以启动程序&#xff0c;还会返回一个容器&#xff0c;为了演示Bean的从创建到销毁的整个阶段&#xff0c;我们会关闭掉容器。 接下来我们来看想要加入到容器当中的类&#xff0c;映入眼帘的是这几个方法和其注解…

Mysql数据库基础篇笔记

目录 sql语句 DDL——数据库定义语言&#xff08;定义库&#xff0c;表&#xff0c;字段&#xff09; 数据库操作&#xff1a; 表操作&#xff1a; DML 增删改语句 DQL 语法编写顺序&#xff1a; 条件查询 DCL 用户管理&#xff1a; 权限管理&#xff1a; 函数 常见字符串内置函…

算法编程题-煎饼排序 不含AAA或者BBB的字符串

算法编程题-煎饼排序 &&不含AAA或者BBB的字符串 煎饼排序原题描述思路简述代码实现复杂度分析 不含AAA或者BBB的字符串原题描述思路简述代码实现复杂度分析 摘要&#xff1a;本文将对两道LeetCode原题进行介绍&#xff0c;分别是煎饼排序和不含AAA或者BBB的字符串。在陈…

分享一款 Vue 图片编辑插件 (推荐)

&#x1f4a5;本篇文章给大家分享一款强大到没朋友的Vue图片编辑插件&#xff0c;可以对图片进行旋转、缩放、裁剪、涂鸦、标注、添加文本等&#xff0c;快来试试并收藏吧&#xff01;&#x1f495; 这是一款对图片进行旋转、缩放、裁剪、涂鸦、标注、添加文本在线处理的图片处…

MySQL 核心基础 | Pandaer杂货铺

MySQL一个后端开发必须会接触的中间件&#xff0c;也是关系型数据库的代表。如果你希望看下去这篇文章&#xff0c;需要你有使用MySQL或者相关关系型数据库的经验&#xff0c;不然这篇文章在你眼中就会索然无味了。 这篇文章不会讲解如何使用MySQL&#xff0c;例如如何安装&am…

【网络】应用层协议HTTPHTTPcookie与sessionHTTPS协议原理

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;计算机网络原理_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.应用层协议HTTP 2.认识 URL 2.1 urlencode 和 urldecode 3.HTTP 协议请求与响应格式 3.1 HTTP 请求 3.2 HTTP 响应 …

搭建业务的性能优化指南

这是一篇搭建业务优化的心路历程&#xff0c;也是写给搭建业务的性能优化指南。 前言 直到今天&#xff0c;淘内的页面大多都迁移到了 SSR&#xff0c;从我们终端平台 - 搭建研发团队的视角看&#xff0c;业务大致可以分为两类 —— 搭建派 和 源码派。 这两者互不冲突&#xf…

Swift实现高效链表排序:一步步解读

文章目录 前言摘要问题描述题解解题思路Swift 实现代码代码分析示例测试与结果 时间复杂度空间复杂度总结关于我们 前言 本题由于没有合适答案为以往遗留问题&#xff0c;最近有时间将以往遗留问题一一完善。 148. 排序链表 不积跬步&#xff0c;无以至千里&#xff1b;不积小流…

开源 - Ideal库 - Excel帮助类,TableHelper实现(三)

书接上回&#xff0c;我们今天继续讲解实现对象集合与DataTable的相互转换。 01、把表格转换为对象集合 该方法是将表格的列名称作为类的属性名&#xff0c;将表格的行数据转为类的对象。从而实现表格转换为对象集合。同时我们约定如果类的属性设置了DescriptionAttribute特性…

基于DHCP,ACL的通信

该问题为华为的学习资料 1.首先把所有的PC机全部设置为DHCP 2.配置地址 3.ospf 4.dhcp 5.acl AR1 dhcp en interface GigabitEthernet0/0/0ip address 192.168.1.254 255.255.255.0 dhcp select global interface GigabitEthernet0/0/1ip address 10.1.12.1 255.255.255.…

基于深度学习的卷积神经网络十二生肖图像识别系统(PyQt5界面+数据集+训练代码)

本研究提出了一种基于深度学习的十二生肖图像识别系统&#xff0c;旨在利用卷积神经网络&#xff08;CNN&#xff09;进行图像分类&#xff0c;特别是十二生肖图像的自动识别。系统的核心采用了两种经典的深度学习模型&#xff1a;ResNet50和VGG16&#xff0c;进行图像的特征提…

探索温度计的数字化设计:一个可视化温度数据的Web图表案例

随着科技的发展&#xff0c;数据可视化在各个领域中的应用越来越广泛。在温度监控和展示方面&#xff0c;传统的温度计已逐渐被数字化温度计所取代。本文将介绍一个使用Echarts库创建的温度计Web图表&#xff0c;该图表通过动态数据可视化展示了温度值&#xff0c;并通过渐变色…

Attention显存统计与分析

Attention显存估计 简单的Attention函数 import torch import torch.nn as nn import einops class Attention(nn.Module):def __init__(self, dim, num_heads8, qkv_biasFalse, qk_scaleNone, attn_drop0., proj_drop0.):super().__init__()self.num_heads num_headshead_d…

[MacOS] [kubernetes] MacOS玩转虚拟化最佳实践

❓ 为什么不在MacOS本机安装呢&#xff1f;因为M系列芯片是Arm架构&#xff0c;与生产环境或者在本地调试时候&#xff0c;安装虚拟镜像和X86不同&#xff0c;造成不必要的切换环境的额外成本&#xff0c;所以在虚拟化的x86调试 步骤 & 详情 一: 安装OrbStack & 并配置…

Unity世界坐标转屏幕坐标报错解决办法。

问题描述&#xff0c;如果你在脚本中尝试使用Camera.转换世界坐标的时候发现点不出来&#xff0c;可以点到你的Camera这个方法看能否跳转&#xff0c;如果能够跳转&#xff0c;并且这个脚本是你自己写的&#xff0c;那么恭喜你&#xff0c;下面就是解决办法&#xff0c;直接将C…

系统监控——分布式链路追踪系统

摘要 本文深入探讨了分布式链路追踪系统的必要性与实施细节。随着软件架构的复杂化&#xff0c;传统的日志分析方法已不足以应对问题定位的需求。文章首先解释了链路追踪的基本概念&#xff0c;如Trace和Span&#xff0c;并讨论了其基本原理。接着&#xff0c;文章介绍了SkyWa…

IAR中编译下载未下载问题

第一张图片是正常下载&#xff0c;第二张未正常下载。经过查看download选项发现 启用了 suppress download &#xff08;禁用下载)

【UE5 C++】判断两点连线是否穿过球体

目录 前言 原理 代码 测试 结果 前言 通过数学原理判断空间中任意两点的连线是否穿过球体&#xff0c;再通过射线检测检验算法的正确性。 原理 &#xff08;1&#xff09;设球体球心的坐标为 &#xff0c;半径为r&#xff1b; &#xff08;2&#xff09;设线段中A点的坐…