个人主页:企鹅不叫的博客
专栏
- C语言初阶和进阶
- C项目
- Leetcode刷题
- 初阶数据结构与算法
- C++初阶和进阶
- 《深入理解计算机操作系统》
- 《高质量C/C++编程》
- Linux
⭐️ 博主码云gitee链接:代码仓库地址
⚡若有帮助可以【关注+点赞+收藏】,大家一起进步!
【初阶与进阶C++详解】第一篇:C++入门知识必备
【初阶与进阶C++详解】第二篇:C&&C++互相调用(创建静态库)并保护加密源文件
【初阶与进阶C++详解】第三篇:类和对象上(类和this指针)
【初阶与进阶C++详解】第四篇:类和对象中(类的六个默认成员函数)
【初阶与进阶C++详解】第五篇:类和对象下(构造+static+友元+内部类
【初阶与进阶C++详解】第六篇:C&C++内存管理(动态内存分布+内存管理+new&delete)
【初阶与进阶C++详解】第七篇:模板初阶(泛型编程+函数模板+类模板+模板特化+模板分离编译)
【初阶与进阶C++详解】第八篇:string类(标准库string类+string类模拟实现)
【初阶与进阶C++详解】第九篇:vector(vector接口介绍+vector模拟实现+vector迭代器区间构造/拷贝构造/赋值)
【初阶与进阶C++详解】第十篇:list(list接口介绍和使用+list模拟实现+反向迭代器和迭代器适配)
【初阶与进阶C++详解】第十一篇:stack+queue+priority_queue+deque(仿函数)
【初阶与进阶C++详解】第十二篇:模板进阶(函数模板特化+类模板特化+模板分离编译)
【初阶与进阶C++详解】第十三篇:继承(菱形继承+菱形虚拟继承+组合)
【初阶与进阶C++详解】第十四篇:多态(虚函数+重写(覆盖)+抽象类+单继承和多继承)
【初阶与进阶C++详解】第十五篇:二叉树搜索树(操作+实现+应用KVL+性能+习题)
【初阶与进阶C++详解】第十六篇:AVL树-平衡搜索二叉树(定义+插入+旋转+验证)
【初阶与进阶C++详解】第十七篇:红黑树(插入+验证+查找)
【初阶与进阶C++详解】第十八篇:map_set(map_set使用+multiset_multimap使用+模拟map_set)
【初阶与进阶C++详解】第十九篇:哈希(哈希函数+哈希冲突+哈希表+哈希桶)
【初阶与进阶C++详解】第二十篇:unordered_map和unordered_set(接口使用+模拟实现)
【初阶与进阶C++详解】第二十一篇:哈希应用(位图实现应用+布隆过滤器增删查优缺点+海量数据面试题)
【初阶与进阶C++详解】第二十二篇:C++11新特性(列表初始化+变量类型推到+右值引用+新增默认成员函数+可变模板参数+lambda表达式+包装器function_bind)
【初阶与进阶C++详解】第二十三篇:异常(异常抛出+异常捕获+异常优缺点)
【初阶与进阶C++详解】第二十四篇:智能指针(内存泄漏+RAII+auto_ptr+unique_ptr+shared_ptr+weak_ptr+定制删除器)
【初阶与进阶C++详解】第二十五篇:类型转换(static_cast+reinterpret_cast+const_cast+dynamic_cast+RTTI)
【初阶与进阶C++详解】第二十六篇:特殊类设计(单例模式)
C++系统实现了一个庞大的类库,其中ios为基类,其他类都是直接或间接派生自ios类
C++标准库提供了4个全局流对象cin、cout、cerr、clog,使用cout进行标准输出,即数据从内存流向控制台(显示器)。使用cin进行标准输入即数据通过键盘输入到程序中,同时C++标准库还提供了cerr用来进行标准错误的输出,以及clog进行日志的输出 ,在使用时候必须要包含文件并引入std标准命名空间。
- cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中拿。如果一次输入过多,会留在那儿慢慢用,如果输入错了,必须在回车之前修改,如果回车键按下就无法挽回了。只有把输入缓冲区中的数据取完后,才要求输入新的数据
- 对于自定义类型,如果要支持cin和cout的标准输入输出,需要对<<和>>进行重载
- istream类型对象转换为逻辑条件判断值
istream& operator>> (int& val); explicit operator bool() const;
实际上我们看到使用while(cin>>i)去流中提取对象数据时,调用的是operator>>,返回值是istream类型的对象,那么这里可以做逻辑条件值,源自于istream的对象又调用了operator bool,operator bool调用时如果接收流失败,或者有结束标志,则返回false
和C语言一样,C++根据文件内容的数据格式将文件分为二进制文件和文本文件,包含头文件< fstream >。
定义一个文件流对象
类 操作场景 ofstream (只输出用) 只写 ifstream (只输入用) 只读 fstream (既输入又输出用) 读+写 使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系
打开方式 功能 in 以读的方式打开文件 out 以写的方式打开文件 binary 以二进制方式对文件进行操作 ate 输出位置从文件的末尾开始 app 以追加的方式对文件进行写入 trunc 先将文件内容清空再打开文件 使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写
成员函数 功能 put 插入一个字符到文件 write 插入一段字符到文件 get 从文件提取字符 read 从文件提取多个字符 tellg 获取当前字符在文件当中的位置 seekg 设置对文件进行操作的位置 >>运算符重载 将数据形象地以“流”的形式进行输入 <<运算符重载 将数据形象地以“流”的形式进行输出 close()关闭文件
int main() { ifstream ifs("Test.cpp");//(输入用) ofstream ofs("Copy.cpp");//创建一个新文件Copy.cpp(输出用) while (ifs) { char ch = ifs.get();//将Test.cpp文件按照一个一个字符读出 ofs << ch; cout << ch; } return 0; }
在程序中如果想要使用stringstream(流的输入输出操作),必须要包含头文件 < sstream >
将数值类型数据格式化为字符串
int main() { int a = 10; string ss; stringstream s; s << a;//将int类型的a放入到输入流 s >> ss;//从s中抽取前面插入的int类型的值,赋值给string类型 cout << ss << endl; s.str("");//将stringstream底层管理的string对象设置为"" s.claer();//将上一次转换状态秦清除 return 0; }
字符串拼接
int main() { stringstream sstream; // 将多个字符串放入 sstream 中 sstream << "first" << " " << "string,"; sstream << " second string"; cout << "strResult is: " << sstream.str() << endl; return 0; }
序列化和反序列化结构数据
struct A { char arr[100]; int a; }; int main() { stringstream ss; ss.str("abc 123");//设置字符串内容,字段之间用空格隔开 A tmp; ss >> tmp.arr >> tmp.a; cout << tmp.arr << " " << tmp.a << endl; return 0; }
- stringstream实际是在其底层维护了一个string类型的对象用来保存结果。
- 多次数据类型转化时,一定要用clear()来清空,才能正确转化,但clear()不会将stringstream底层的
- string对象清空。
- 可以使用s. str(“”)方法将底层string对象设置为""空字符串。
- 可以使用s.str()将让stringstream返回其底层的string对象。
- stringstream使用string类对象代替字符数组,可以避免缓冲区溢出的危险,而且其会对参数类型进行推演,不需要格式化控制,也不会出现格式化失败的风险,因此使用更方便,更安全。