C++IO流和类型处理(13)

news2024/11/19 11:25:44

IO流

IO流包括 标准IO流,字符串流,文件流

标准IO流

基础使用

#include <iostream> //包括istream和ostream 
cin >> ----- 标准输入 
cout<< ----- 标准输出 
clog<< ----- 带缓冲区的标准错误
cerr<< ----- 不带缓冲区的标准错误              

C++预定义的类和函数参考手册:https://zh.cppreference.com/w/cpp

成员函数

cin.get -------- 读取一个字符 
cout.put -------输出一个字符 
cin.getline ------- 读一行 
cin.ignore ------- 清空缓冲区 
cin.clear ------ 清除错误信息         

字符串流

C语言的字符串处理库函数

字符指针 ------- char *

strcpy ----- 拷贝 
strcmp ----- 比较 
strcat ----- 拼接
strstr ----- 查找子串 
strlen ----- 长度 
strtok ----- 分割  //hello,bybye,new ===>按,分割===>hello byebye new 
strchr ----- 查找字符 
.... 
sprintf ----- 往字符串输出

C++中的字符串

C++预定义了string类来表示字符串

 #include <string> using namespace std;              

构造初始化

 string str("hello");
 string str = "hello";
 str = "welcome";     

重载的运算符

+/+= ------ 拼接
<< >> ----- 输入输出
== != > >= < <= ------ 比较(ASCII码)
[] ------ 根据下标获取字符(不检查越界,不推荐使用,推荐使用检查越界的成员函数at)

#include <iostream>

using namespace std;

int main()
{
    string str1("hello ");

    string str2("worldaaaaaaaaaaaa");

   // str1 += str2;
    //cout << str1;

    cout << str1+str2 << endl;
    //判断了什么??  比较的是第一个字符aiscii码值
    cout << (str1 == str2) << endl;
    cout << (str1 >= str2) << endl;
    cout << (str1 <= str2) << endl;
    //效果一致
    cout << str1[2] << endl;
    cout << str1.at(2) << endl;
    //cout << str1.at(10) << endl; //越界会报异常

    //转换C风格的字符串
    const char* s = str1.c_str();
    cout << s << endl;
    //长度
    cout << str1.length() << endl;
    cout << str1.size() << endl;
    //容量
    cout << str1.capacity() << endl;
    str1 += str2;
    cout << str1.capacity() << endl; //放不下就扩容
    cout << str1.max_size() << endl; //可以放多大的值
    return 0;
}

成员函数

at --------- 获取指定位置的字符
c_str ------ 转换成C风格的字符串(const char *)
size/length ----- 字符串的大小/长度
capacity ----- 容量
max_size ------ 最大支持的大小
empty ----- 判空

copy(char *s,int n,int pos=0); ----- 从pos位置开始拷贝n个字符到s
insert(int pos,const char *s/string s); ------ 从pos位置插入字符串s
insert(int pos,const char *s,int n); ------ 从pos位置插入字符串s的前n个字符
swap(string &s); ------ 交换本字符串和s的内容
find(char ch,int pos=0); ------- 从pos位置开始查找ch字符
find(const char *s/string s,int pos=0); ------- 从pos位置开始查找字符串s
substr(int pos,int n=npos); --------- 获取从pos开始长度为n的子字符串

练习:

完善写的mystring类

重载实现 << + += == [] =

添加at() size() capacity()的成员函数

Cpp/C++/DAY08 at main · Yu-1120/Cpp (github.com)

(3)字符串流

image-20220721225812032

  ```shell
   #include <sstream>   
            
  istringstream ----- 数据来源于字符串(读取字符串)    
  ostringstream ----- 将数据写入字符串     //字符串流和标准IO流的关系 类似于 sprintf/sscanf和printf/scanf的关系 
  ```

文件流

C++中预定义了fstream类来访问文件,分为ifstream(输入类)和ofstream(输出类),分别支持>>和<<的操作,可以使用文件路径来构造文件流,构造会自动打开文件,使用其需要包含头文件

#include

成员函数

1.打开文件 ----- open
    open(路径,打开方式);
打开方式:
    ios::in ----- 读打开
    ios::out ---- 写打开
    ios::app ---- 追加打开
    ios::trunc --- 清空打开
    
2.关闭文件 ----- close
    无参
    
3.读写文件 ----- read/write
    read(读空间的首地址,读的长度);
    write(写空间的首地址,写的长度);
4.gcount() ------ 上次读取(read)的字节数   

文件加密

异或运算 ------- 相同为0,不同为1 ------- 异或0不变,异或1取反

任何数a异或任何数b两次的结果还是a本身

1111 1111 ^ 1100 0011 = 0011 1100
0011 1100 ^ 1100 0011 = 1111 1111

xxxx xxxx ^ 1111 0011 = yyyy xxyy
yyyy xxyy ^ 1111 0011 = xxxx xxxx

练习:

实现文件解密,测试将一个文件加密后再解密内容是否完全一样。

类型处理

获取类型信息 ------- typeid

typeinfo可以获取 对象/类型 的类型信息。

用法:

#include <typeinfo>

using namespace std;

type_info typeid(类型/对象);

type_info支持的操作:
    ==/!= ------ 判断type_info的两个类型是否相同,相同就是同类型
    name() ----- 获取类型的名称(类类型包括名字的长度)
2.类型转换

类型转换

C++不再推荐使用强转,而提供了四种转换方式代替强转

dynamic_cast<类型>

用于具有多态性的父子对象之间的转换


A a是B b的父类对象,且具有多态性的父子关系
    A *pa = new B;
    B *pb = dynamic_cast<B *>(pa);

const_cast<类型>

去除/添加const属性的转换

A a;
const A *pa = &a;

//去掉pa的const属性
A *pb = const_cast<A *>(pa);
//为pb添加const属性
const A *pc = const_cast<const A *>(pb);

static_cast<类型>

最接近于C语言强转的转换,不能转换完全无关的类型

reinterpret_cast<类型>

危险的转换

struct A{short a;short b;};
int value = 0x10dcf321;
A *pa = reinterpret_cast<A *>(&value);
pa->a ------ 前2个字节的数据
pa->b ------ 后2个字节的数据

作业:

1.使用文件流实现文件的拷贝,输入拷贝的原文件和目标文件

2.附加:使用string类,将用户输入的两个字符串开头相同和结尾相同的部分合并成一个新的字符串

How are you!
Hello,nice to meet you!
===>H you! 

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

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

相关文章

【C6】11111

文章目录 10.动静态库&#xff1a;.a&#xff0c;指定.so&#xff0c;LD_10.1 静态库&#xff1a;链接库的文件名是libpublic.a&#xff0c;链接库名是public&#xff0c;缺点使用的静态库发生更新改变&#xff0c;程序必须重新编译10.2 动态库&#xff1a;动态库发生改变&…

Selenium java自动化

文章目录 1. Selenium的安装2. 了解自动化和selenium2.1 什么是自动化以及为什么要做2.2为什么选择selenium作为我们的文本自动化工具2.3 环境部署2.4什么驱动&#xff0c;驱动的工作原理。2.5一个简单的自动化演示 3. 掌握selenium的基础语法3.1)元素的定位3.2) 元素的操作3.3…

Java解析String类的使用及String a = b + “c“面试题

1.概述 String:字符串&#xff0c;使用一对""引起来表示。 1.String声明为final的&#xff0c;不可被继承 2.String实现了Serializable接口&#xff1a;表示字符串是支持序列化的。 实现了Comparable接口&#xff1a;表示String可以比较大小 3.String内部定义了fina…

作用域问题

全局作用域 作用范围:在全局能够访问到的全局变量 代码实例: var num 10;function fn1() {console.log(num, "全局作用域");}fn1() 打印的结果: 函数作用域 作用范围:只在函数里面能够进行访问 代码实例: function fn1() {var num 10;}console.log(num); …

【Mysql】Explain详解与实践

演示所用user表在上一节有表结构和数据 【Mysql索引数据结构与算法】 脑图链接 一、EXPLAIN简介 使用EXPLAIN关键字可以模拟优化器执行SQL查询语句&#xff0c;从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。 作用 通过EXPLAIN&#xff0…

Ubunt20.04 安装 Gramine

文章目录 参考资料Gramine安装运行helloworld升级kernel到5.15 参考资料 Gramine Quick start Gramine安装 Gramine安装要求&#xff1a; Linux 内核版本至少为 5.11&#xff08;启用 SGX 驱动程序&#xff09; 如果是5.4.0-150-generic版本&#xff0c;则可以参考《Install …

神秘的临时对象

下面的程序输出什么&#xff1f;为什么&#xff1f; 程序意图&#xff1a; 在 Test() 中以 0 作为参数调用 Test(int i) 将成员变量 mi 的初始值设置为 0 运行结果&#xff1a; 成员变量 mi 的值为随机值 构造函数是一个特殊的函数 是否可以直接调用&#xff1f; 是否可以…

濮阳社工百站千室暖万家 | “品味端午,传承文明”儿童活动

端午节是我国传统的民俗节日&#xff0c;也是中华民族的重要节日之一&#xff0c;为了让幼儿了解和感受这一节日的文化内涵&#xff0c;让孩子们在愉快的氛围中感受中华传统文化的魅力。2023年6月20日&#xff0c;范县城关镇社工站于范县未来双语幼儿园开展了“品味端午&#x…

哪些方法可以帮助你更有效地管理时间和提高工作效率?

如何更有效地管理时间和提高工作效率&#xff1f; 在现代社会&#xff0c;时间是最宝贵的资源之一。每个人都希望能够更好地管理时间&#xff0c;提高工作效率&#xff0c;从而更好地完成工作和生活。以下是一些方法&#xff0c;可以帮助您更有效地管理时间和提高工作效率。 …

H3C IRF基本内容概述

IRF IRF&#xff1a;Intelligent Resilient Framework&#xff0c;即智能弹性架构&#xff0c;是H3C专有的设备虚拟化技术&#xff0c;将实际物理设备虚拟化为逻辑设备供用户使用。 核心思想&#xff1a;将多台设备通过IRF物理端口连接在一起&#xff0c;进行必要的配置后&am…

Android 实现在图片上画标注框

之前是用glide加载然后在图片上画标注框是有问题的所以换了另外一种方式 思路&#xff1a;1.先把网络图片下载到本地之后画标注框 最后再压缩图片 及展示 上代码&#xff1a; 下载图片&#xff1a; public class NetWorkUtils {public static InputStream getImageInputStr…

LeetCode - #84 柱状图中最大的矩形(Top 100)

文章目录 前言1. 描述2. 示例3. 答案题解 1题解 2 关于我们 前言 本题为 LeetCode 前 100 高频题 本题由于没有合适答案为以往遗留问题&#xff0c;最近有时间将以往遗留问题一一完善。 我们社区陆续会将顾毅&#xff08;Netflix 增长黑客&#xff0c;《iOS 面试之道》作者&am…

机器学习(三)线性回归原理

上述考虑的问题&#xff0c;我们会得到一个式子&#xff0c;即&#xff1a;Yθ1X1θ2X2。但该线性公式没办法拟合所有的数据点&#xff0c;如下图。 这里“θ0”作为偏置项&#xff0c;在二维平面里&#xff0c;即为截距。因此&#xff0c;上述公式“Yθ1X1θ2X2”即可修改为“…

深入源码解析 ReentrantLock、AQS:掌握 Java 并发编程关键技术

前言Lock重入锁synchronizedReentrantLock ReentrantReadWriteLock 读写锁ReentrantLock 实现原理AQSAQS 内部实现Node 内部结构Node 变更过程添加节点释放节点 ReentrantLock 类源码分析时序图锁竞争核心方法NonfairSync#lockAQS#acquireReentrantLock.NonfairSync#tryAcquire…

js的 Babel原理

简介 babel是一个JavaScript编译器,可以将ES2015 转换为向后兼容的JavaScript代码, Babel的原理是将JavaScript代码分为三个阶段: 解析, 转换和输出 1. 解析阶段 Babel首先会使用 Babylon 解析器将输出的 ES2015diamagnetic解析成抽象语法树(AST), 抽象语法树是 一种JSON形式…

端午节,不能只知道吃吃吃.....玩玩玩......

系列文章目录 作者&#xff1a;i阿极 作者简介&#xff1a;数据分析领域优质创作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏&#x1f4c1;评论&#x1f4d2;…

FWI 地震数据的认识

目录 1、数据来源。 1&#xff09;SEG 系列。 2&#xff09;OpenFWI 系列。 2、数据量&#xff0c;尺寸。 1&#xff09; SEG 包含两个数据集&#xff1a;SEGSaltData 和 SimulateData。 2&#xff09;OpenFWI 包含12个数据集&#xff1a; 3、地震数据对应的观测系统。…

Redis原理 - IO详解

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis原理 - IO详解 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-IO.html 用户空间与内核空间 任何Linux 系统的发行版&#xff0c;其系统内核都是 Linux 。我们的应用都需要通过 Linux 内核与硬…

02py游戏开发基础

版本 pygame 2.4.0 (SDL 2.26.4, Python 3.8.2) Hello from the pygame community. https://www.pygame.org/contribute.html Python开发基础 Pygame常用模块 background_image_filename "bg.jpg"#设置图像文件名称 mouse_image_filename "ship.bmp"# 将…

JVM优化00

JVM优化 0.目标 了解下我们为什么要学习JVM优化掌握jvm的运行参数以及参数的设置掌握jvm的内存模型&#xff08;堆内存&#xff09;掌握jmap命令的使用以及通过MAT工具进行分析掌握定位分析内存溢出的方法掌握jstack命令的使用掌握VisualJVM工具的使用 1.为什么学习JVM优化 …