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)字符串流
```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!