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

news/2025/1/12 13:35:02/

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

文件加密

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

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

1111 1111 ^ 1100 0011 = 0011 1100
0011 1100 ^ 1100 0011 = 1111 1111xxxx 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.ppmy.cn/news/498174.html

相关文章

SystemVerilog logic、wire、reg数据类型详解

在Verilog中&#xff0c;wire和reg是最常见的两种数据类型&#xff0c;也是初学者非常容易混淆的概念。 SystemVerilog的一大改进是支持logic数据类型&#xff0c;它在多数时候可以不加区分地替代wire和reg。但如果不熟悉logic的限制随意使用&#xff0c;也容易遇到意…

时隔两年,再战女性市场,但小米这次还能重回C位吗?

作为人们生活中早已离不开的电子产品&#xff0c;发展至今&#xff0c;国内各大手机品牌也从单一的销售模式走向多元化发展&#xff0c;手机行业集中度明显提高。 据前瞻经济研究院数据显示&#xff0c;从2015年到2020年我国智能手机市场前五大品牌市占率从59.7%升至96.5%。可…

在 JavaScript 中获取域名

本文将讨论如何使用 JavaScript 事件和函数在网页执行期间以编程方式获取域名。 域名 我们使用域名从客户端应用程序访问网站或网页。 它是映射到 IP 地址&#xff08;数字&#xff09;的文本格式字符串。 用户在 Web 浏览器搜索中键入以调用特定网站的字符串称为域名。 例如…

热门参考设计:基于STM32单片机的WiFi、蓝牙应用方案

&#xfeff;&#xfeff; 基于STM32的WiFi模块EMW3165/3162/3238EMW3238以STM32F4为主控MCU&#xff0c;内置512KB Flash128KB SRAM&#xff0c;高度集成WLAN MAC/BB/RF&#xff0c;蓝牙4.1&#xff0c;3.3V单电源供电&#xff0c;邮票孔SMT封装。 EMW3238运行于MiCO物联网操作…

求大佬改路由器LOGO(有偿)

路由器型号&#xff1a;斐讯K2 迅捷FAC1200R TP-LINK 886N

《安富莱嵌入式周报》第231期:2021.09.20--2021.09.26

往期周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz!http://www.armbbs.cn/forum.php?modforumdisplay&fid12&filtertypeid&typeid104 目录 1、elements消…

《GK101任意波发生器》升级固件发布(版本:1.0.2build539)

一、固件说明&#xff1a; 硬件版本&#xff1a;0&#xff0c;logic.3 固件版本&#xff1a;1.0.2.build539 编译日期&#xff1a;2014-10-08 二、固件版本说明&#xff1a; 1、增加功能&#xff1a;支持英文、中文两种语言  开机选择语言 三、固件下载&#xff1a; 链接: …

如何安排 Mac 每晚重启时间?

在“系统偏好设置”中有一个标题为“节能器”的部分&#xff0c;通常用于处理显示器在不使用时关闭、将硬盘置于睡眠状态、Mac 是否唤醒以进行网络访问以及 Mac 是否会自动返回断电后开机。 还有一个名为 Schedule 的部分&#xff0c;用于管理与 Mac 是开启和可用还是关闭相关的…