当前位置: 首页 > news >正文

【C++进阶之路】IO流

文章目录

  • 一、C语言的IO
    • 1.键盘与显示屏
    • 2. 文件与内存
    • 3.字符串与内存
  • 二、C++IO
    • 1.iostream
      • 1.1基本使用
      • 1.2operator bool
    • 2. fstream
      • 2.1二进制的文件读写
      • 2.2字符串的文件读写
    • 3. sstream
      • 3.1序列化与反序列化
      • 3.2拼接字符串
      • 3.3将数据类型转换为字符串
  • 总结

一、C语言的IO

1.键盘与显示屏

//键盘与显示屏的交互
int main()
{//从键盘读取格式化字符串。int i = 0;scanf("%d", &i);//在显示屏上打印获取到的信息。printf("%d", i);return 0;
}

2. 文件与内存

int main()
{FILE* fptr = fopen("test.txt", "w+");//w只写、w+可读可写。//向文件里输入格式化字符串fprintf(fptr, "%d hello", 123);//调整文件指针的位置为开头rewind(fptr);//从文件里面读取字符串与数字。char arr[15] = { 0 };int n = 0;//只能以某种形式对字符串进行解读fscanf(fptr, "%d%s", &n,arr);printf("%s %d", arr, n);fclose(fptr);//关闭文件并刷新缓存区。return 0;
}

3.字符串与内存

//字符串的输入输出,对字符串按指定方式进行解读。
int main()
{//从内存向字符串输出可控制的格式化字符串char str[100];sprintf(str, "hello %d", 11);//这里的11可变换为变量。cout << "输出的字符串为:" << str << endl;//从字符串向变量中读入可控制的格式化字符串int i = 0;char buf[256];sscanf(str, "%s %d",buf,&i);cout<<"输入的字符为:" << i << " " << buf << endl;return 0;
}
  • 总结:

  • printf 与 scanf 是显示屏与键盘的IO函数

  • sprintf 与 sscanf 是字符串与内存的IO函数

  • fprintf 与 fscanf 是内存与文件的IO函数

  • 唯一不足的就是读取只能一个一个按照顺序的进行读取,无法按照自己想法

对输入输出即 printf 与 scanf 的英文理解:

在这里插入图片描述
说明:这是基于内存的理解,方便理解printf即从内存往外输出,scanf即从外面向内存读写。

补充:程序在运行时默认打开三个流——stdin,stdout,stderror。

至于更多C语言的文件操作内容详见【进阶C语言】文件操作

二、C++IO

  • c++以继承的方式,梳理了所有的流。

在这里插入图片描述
 其中<iostream>是我们经常包的头文件,现在看来竟然还是一个菱形虚拟继承,不愧是实现库的大佬,没有困难创造困难迎着困难上,不过也为我们提供一点的便利。

1.iostream

1.1基本使用

  • cin和cout是我们经常使用的。
  • cerr是面向标准错误流的,clog是应用于日志的,不过日常我们使用前两个即可。

先来看最简便的一段C++代码:

int main()
{int x;cin >> x;//从键盘对x进行输入数据cout << "hello world" << endl;//向显示器上打印数据return 0;
}

 不知各位刚学这一段代码的时候,是什么感觉,我是感觉看起来比较便捷形象易懂,只是最近再看其实就是一大堆的运算符重载形成的集合,而且当我们想要用char*打印地址时,它其实给我们呈现的是一段字符串,而不是地址, 不过用起来是真香。

对自定义类型输入和输出比如之前文章中出现的日期类:

class Date
{friend ostream& operator << (ostream& out, const Date& d);friend istream& operator >> (istream& in, Date& d);
public:Date(int year = 1, int month = 1, int day = 1):_year(year), _month(month), _day(day){}
private:int _year;int _month;int _day;
};
istream& operator >> (istream& in, Date& d)
{in >> d._year >> d._month >> d._day;return in;
}
ostream& operator << (ostream& out, const Date& d)
{out << d._year << " " << d._month << " " << d._day;return out;
}
int main()
{Date d1;cin >> d1;//其原理就是调用自定义的运算符重载函数。cout << d1 << endl;//同理。return 0;
}

稍微总结一下:

  1. 使用运算符重载(流插入和流提取)进行实现,更加形象易懂。
  2. 自定义类型也可重载自己的流插入和流提取,也可使用cin和cout。
  3. 自动类型识别,无需在进行格式化控制。

说明:

运算符重载vs函数重载

  1. 有更严格的要求,要尽可能在多种状况下都能正确运行。
  2. 运算符重载则需要更多的了解系统中对表达式处理的各种默认形式,那些是你无法去改变的,只能努力适应。
  • 实用小知识

同时回想在进行刷题时,如果面临读入一整行的字符串数据,有什么方法吗?

  1. gets
char* gets(char* str);
  • 缺陷:这个函数比较危险,是因为从缓存区往str读入数据时,并不知道str所指向空间的大小,因此可能会导致使str指向的空间进行越界访问,因此是危险的。
  • 说明:C++(vs2019下)此函数已删除。
  1. fgets
char * fgets ( char * str, int num, FILE * stream );

基本使用:

int main()
{char buf[256];//从标准输入流(键盘)里读取最大不超过buf大小的一行数量,到buf数组中fgets(buf, sizeof(buf), stdin);cout << buf << endl;return 0;
}
  1. scanf
int main()
{char buf[256];//从标准输入流(键盘)里读取一行数量,到buf数组中scanf("%[^\n]", buf);//直到遇到换行才停止。cout << buf << endl;return 0;
}
  • 缺陷是跟gets一样的,不过因为比较好用编译器保留了下来,可以用宏/预处理指令进行屏蔽错误。

4.getline(C++)

  • c++里面的string里面提供了一个接口getline,可以获取一行的字符串。
#include<iostream>
#include<string>
int main()
{string buf;//从标准输入流(键盘)里读取一行数量,到buf中getline(cin, buf);cout << buf << endl;return 0;
}
  • 这是最便捷的也最安全的输入一行字符串的方法,因为string内部会自动进行扩容,也是C++刷题最经常用的方法。

1.2operator bool

 除此之外,我们可能对多组输入的cin,会产生疑惑 , 比如如下一段代码:

int main()
{int x;while (cin >> x){cout << x << endl;}return 0;
}
istream& operator>> (int& val);
//返回的是cin,也就是类型为istream的对象,
//而while()里面进行判断的是bool值,两者能进行转换吗?答案是肯定能的,
//那是如何进行转换的呢?

就比如:

class A
{
public:
private:int _a = 0;
};
int main()
{A a;if(a)//此处会报错:表达式必须包含 bool 类型(或可转换为 bool)	{}return 0;
}
  • 那如何转换为bool呢?其实运算符重载就出现了。
class A
{
public:operator bool(){return _a == 0 ? false : true;}
private:int _a = 0;
};
int main()
{A a;if(a){}//这也间接说明,iostream是实现了operator bool的。return 0;
}

说明:这里的实现的运算符重载没有返回值是有点奇怪的,这里当做特殊情况对待即可,不必深究。

  • cin转bool底层原理:设置标记

在这里插入图片描述

补充:在对循环终止时,有两种方式,ctrl z(正常终止循环) / Ctrl c(退出当前程序)。

2. fstream

在进行输入/输出时可有几种模式:

在这里插入图片描述

  1. 对于fostream的对象默认打开了out,对于fistream的对象默认打开了in。
  2. 操作可通过 | 进行结合起来。
  3. truncate——对文件之前的内容进行覆盖。
  4. 对于有些对象比如fstream,可以支持输入也可以支持输出。

2.1二进制的文件读写

struct PeopleInfor
{PeopleInfor(){}PeopleInfor(const char* id,const char* name,int age)//:_id(id){strcpy(_id, id);strcpy(_name, name);_age = age;}char _id[256];//家庭住址char _name[256] = {0};//名字int _age = 0;//年龄
};
struct ManagePeoInf
{//初始化ManagePeoInf(const char* file):_FileName(file){}//向文件以二进制写入个人信息void WriteBianry(const PeopleInfor& pe){ofstream of(_FileName, ios_base::out | ios_base::binary);//这里的out默认已经有了,可以不写。of.write((char*)&pe, sizeof(pe));}void ReadBinary(PeopleInfor& pe){ifstream in(_FileName, ios_base::in | ios_base::binary);//这里的in默认已经有了,可以不写。in.read((char*)&pe, sizeof(pe));}//向文件以二进制读取个人信息string _FileName;
};void BinaryWrite()
{PeopleInfor pe1 = { "河南省","舜华",19 };ManagePeoInf m1("text.txt");//向文件中输出字符串xm1.WriteBianry(pe1);
}
void BinaryRead()
{PeopleInfor pe2;ManagePeoInf m2("text.txt");m2.ReadBinary(pe2);cout << pe2._id << " " << pe2._name << " " << pe2._age << endl;
}
int main()
{//向文件里以二进制的形式写入数据BinaryWrite();//从文件中以二进制的形式读取数据BinaryRead();return 0;
}

说明:这里的_id与_name并没有采用string的形式进行使用,而是char类型的数组进行的使用,其原因在于拷贝的是对象的内存,而string里面存的是指向字符串的地址,string释放时,读取在恢复时,其实是一段野指针,即使访问成功了也是幸运。

2.2字符串的文件读写

struct PeopleInfor
{PeopleInfor(){}PeopleInfor(const char* id, const char* name, int age):_id(id){//strcpy(_id, id);strcpy(_name, name);_age = age;}string _id;//家庭住址char _name[256] = { 0 };//名字int _age = 0;//年龄
};
struct ManagePeoInf
{//初始化ManagePeoInf(const char* file):_FileName(file){}//向文件以二进制写入个人信息void WriteText(const PeopleInfor& pe){ofstream of(_FileName, ios_base::binary);of << pe._id << " " << pe._name << " " << pe._age;//这里的id是调用了string的流插入。}void ReadText(PeopleInfor& pe){ifstream in(_FileName, ios_base::binary);in >> pe._id >> pe._name >> pe._age;//这里的_id是调用了string的流提取。//读取自动识别空格与换行与分割符。}//向文件以二进制读取个人信息string _FileName;
};
void WriteText()
{PeopleInfor pe1 = { "河南省","舜华",19 };ManagePeoInf m1("text.txt");m1.WriteText(pe1);
}
void ReadText()
{PeopleInfor p2;ManagePeoInf m2("text.txt");m2.ReadText(p2);cout << p2._id << " " << p2._name << " "  << p2._age << endl;
}
int main()
{WriteText();ReadText();return 0;
}

3. sstream

3.1序列化与反序列化

  • 此处说明:这里存在序列化与反序列化,因为在存储的形式中,要么以二进制的形式进行存储(人看不懂),要么以字符串的形式进行存储(序列化),总之在计算机用于计算的类型比如int,float,double等形式,在文件中不复存在,因此计算机要想用存储的数据进行计算,就需要将字符串转换为相应的格式再参与计算(反序列化)。
#include<iostream>
#include<string>
#include<sstream>
using namespace  std;
class Date
{friend ostream& operator << (ostream& out, const Date& d);friend istream& operator >> (istream& in, Date& d);
public:Date(int year = 1, int month = 1, int day = 1):_year(year), _month(month), _day(day){}
private:int _year;int _month;int _day;
};
istream& operator >> (istream& in, Date& d)
{in >> d._year >> d._month >> d._day;return in;
}
ostream& operator << (ostream& out, const Date& d)
{out << d._year << " " << d._month << " " << d._day;return out;
}
int main()
{string str;Date d = { 2023,10,21 };ostringstream os;os << d;str = os.str();cout<<"字符串:" << str << endl;//再将字符串转换为日期类Date d1;istringstream is(str);is >> d1;cout<<"日期类:" << d1 << endl;return 0;
}

这里附上一道序列化与反序列化的题:二叉树的序列化与反序列化

3.2拼接字符串

#include<iostream>
#include<string>
#include<sstream>
using namespace  std;
int main()
{ostringstream os;os << "hello";//当然也可是一些变量,比如intos << " world";//同理cout << os.str() << endl;return 0;
}

说明:

  1. stringstream实际是在其底层维护了一个string类型的对象用来保存结果。
  2. 多次数据类型转化时,一定要用clear()来清空,才能正确转化,但clear()不会将stringstream底层的string对象清空。
  3. 可以使用s. str(“”)方法将底层string对象设置为""空字符串。
  4. 可以使用s.str()将让stringstream返回其底层的string对象。
  5. stringstream使用string类对象代替字符数组,可以避免缓冲区溢出的危险,而且其会对参数类型进行推演,不需要格式化控制,也不会出现格式化失败的风险,因此使用更方便,更安全。

3.3将数据类型转换为字符串

int main()
{int a = 12345678;string sa;// 将一个整形变量转化为字符串,存储到string类对象中stringstream s;s << a;s >> sa;s.str("");//将s维护的字符串置为空s.clear();// 说明:// stringstreams在转换结尾时(即最后一个转换后),会将其内部状态设置为badbit// 因此下一次转换是必须调用clear()将状态重置为goodbit才可以转换double d = 12.34;s << d;s >> sa;string sValue;sValue = s.str();cout << sValue << endl;return 0;
}

总结

 今天的分享就到此结束了,我是舜华,期待与你的下次相遇!

相关文章:

【C++进阶之路】IO流

文章目录 一、C语言的IO1.键盘与显示屏2. 文件与内存3.字符串与内存 二、CIO1.iostream1.1基本使用1.2operator bool 2. fstream2.1二进制的文件读写2.2字符串的文件读写 3. sstream3.1序列化与反序列化3.2拼接字符串3.3将数据类型转换为字符串 总结 一、C语言的IO 1.键盘与显…...

$GNGGA,传感器传输的数据解析

每一秒传输这一帧数据如下&#xff1a; $GNGGA,090022.000,3959.82136,N,11628.16507,E,1,06,3.5,21.4,M,0.0,M,,*4D $GNGLL,3959.82136,N,11628.16507,E,090022.000,A,A*4F $GPGSA,A,3,03,16,26,,,,,,,,,,4.1,3.5,2.1*32 $BDGSA,A,3,07,21,42,,,,,,,,,,4.1,3.5,2.1*21 $GPGSV…...

javaEE - 2(11000字详解多线程)

一&#xff1a;多线程带来的的风险-线程安全 线程安全的概念&#xff1a;如果多线程环境下代码运行的结果是符合我们预期的&#xff0c;即在单线程环境应该的结果&#xff0c;则说这个程序是线程安全的。 当多个线程同时访问共享资源时&#xff0c;就会产生线程安全的风险&am…...

easyphoto 妙鸭相机

AIGC专栏7——EasyPhoto 人像训练与生成原理详解-CSDN博客如何训练一个高品质的人像Lora与应用高品质Lora的链路对于写真生成而言非常重要。由《LoRA: Low-Rank Adaptation of Large Language Models》 提出的一种基于低秩矩阵的对大参数模型进行少量参数微调训练的方法&#x…...

【Qt控件之QMdiArea】介绍及使用

描述 QMdiArea小部件提供了一个区域&#xff0c;用于显示MDI窗口。QMdiArea的功能类似于MDI窗口的窗口管理器。例如&#xff0c;它在自身上绘制和排列管理的窗口&#xff0c;可以按级联或平铺模式排列它们。通常&#xff0c;QMdiArea被用作QMainWindow的中心小部件&#xff0c…...

Linux网络编程-极简HTTPUDP服务器

HTTP服务器 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet.h>#define PORT 8080 #define BUFFER_SIZE 2048void handle_client(int client_socket) {char buffer[BUFFER_SIZE];recv(cl…...

虚拟化、容器与Docker基本介绍以及安装部署(Docker 基本管理)

目录 1 Docker 概述 1.1 Docker与虚拟机的区别 1.2 容器在内核中支持2种重要技术 1.3 Docker核心概念 2 安装 Docker 2 Docker 镜像操作 2.1 搜索镜像 2.2 获取镜像 2.3 镜像加速下载 2.4 查看镜像信息 2.4.1 查看下载的镜像文件信息 2.4.2 查看下载到本地的所有镜像…...

Spring Boot中捕获异常错误信息并将其保存到数据库中

Spring Boot中捕获异常错误信息并将其保存到数据库中: 1.创建数据库表&#xff1a; 首先&#xff0c;您需要创建一个用于存储异常信息的数据库表。可以使用SQL脚本或者使用Hibernate实体类来创建表。以下是一个用于存储异常信息的表的示例SQL&#xff1a; CREATE TABLE erro…...

CNN记录】pytorch中flatten函数

pytorch原型 torch.flatten(input, start_dim0, end_dim- 1) 作用&#xff1a;将连续的维度范围展平维张量&#xff0c;一般写再某个nn后用于对输出处理&#xff0c; 参数&#xff1a; start_dim&#xff1a;开始的维度 end_dim&#xff1a;终止的维度&#xff0c;-1为最后…...

科普长文--网络安全拟态防御技术概念及应用

网络安全拟态防御技术概念 什么是网络安全拟态防御? 网络安全拟态防御技术是一种基于生物拟态原理,利用动态异构冗余构造、拟态伪装机制、测不准效应等手段,实现网络空间的主动防御和内生安全的技术。它是由中国工程院院士邬江兴首创的,旨在应对网络空间中的各种未知威胁…...

框架篇

一、Spring中的单例Bean是线程安全的吗 二、AOP相关面试题 三、Spring中的事务 四、Spring中事务失效的场景有 五、Spring bean的生命周期 六、Spring的循环依赖 七、SpringMVC的执行流程 八、自动配置原理 九、Spring框架常见的注解 十、Mybatis的执行流程 十一、MyBatis延迟加…...

Spring MVC(中)

1、Spring MVC视图&#xff1a; SpringMVC中的视图是View接口&#xff0c;视图的作用渲染数据&#xff0c;将模型Model中的数据展示给用户 SpringMVC视图的种类很多&#xff0c;默认有转发视图和重定向视图 当工程引入jstl的依赖&#xff0c;转发视图会自动转换为JstlView …...

10月19日,每日信息差

今天是2023年10月19日&#xff0c;以下是为您准备的17条信息差 第一、中国海洋石油遭南向资金净卖出2.38亿港元 第二、阅文集团侯晓楠&#xff1a;网文已经成为中国文化的一张全球名片。据了解&#xff0c;2022年以来&#xff0c;阅文已经在海外上线了自制的300多部动漫影视作…...

【VSCode】解决Open in browser无效

问题描述&#xff1a; 在VSCode中无论是点击右键&#xff0c;选择在默认浏览器中打开&#xff0c;还是按快捷键alt b都没有反应。 解决办法&#xff1a; 右击文件 --> 在文件资源管理器中显示 右击文件&#xff0c;选择属性 点击更改 选择用默认浏览器打开 最后 此时…...

测试饱和了? 大数据测试就业薪资和前景究竟怎么样?

随着不断有转行人员及毕业的大学生进入IT行业&#xff0c;在很多外界人眼里&#xff0c;这个行业的“缺口”已满&#xff0c;人员趋于饱和&#xff0c;但事实真的这样吗&#xff1f;还真没有。只是最基础的岗位需求在慢慢变少了&#xff0c;但行业中比较深的细分岗位&#xff0…...

DDR3笔记 频率配置

可参考 基于FPGA的DDR3设计&#xff08;2&#xff09;DDR3各时钟频率及带宽分析 - 知乎 (zhihu.com) DDR3的时钟频率配置要看两个手册&#xff1a; 1.DDR3器件的手册。 2.开发板芯片的手册 器件 器件名称&#xff1a;MT41J128M16JT-125:K tCK 1.25ns&#xff0c;就可以算出…...

数据结构与算法-(10)---列表(List)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…...

Node-Web模块的用法

题记 node.js中web模块的用法&#xff0c;以下是具体操作过程和代码。 Web服务器一般指网站服务器&#xff0c;是指驻留于因特网上某种类型计算机的程序&#xff0c;Web服务器的基本功能就是提供Web信息浏览服务。它只需支持HTTP协议、HTML文档格式及URL&#xff0c;与客户端的…...

基于TCP的RPC服务

TCP服务器上的RPC&#xff0c;通过创建一个服务器进程监听传入的tcp连接&#xff0c;并允许用户 通过此TCP流执行RPC命令 -module(tr_server). -author("chen"). -behaviour(gen_server).%% API -export([start_link/1,start_link/0,get_count/0,stop/0 ]).-export(…...

docker报错问题解决:Error Invalid or corrupt jarfile app.jar

文章目录 1.问题描述2.问题分析3.问题解决 1.问题描述 此时处在 /home/ubuntu/app 目录下&#xff0c;并且在该目录下有一个 jenkins-0.0.1-SNAPSHOT.jar。 我在 /home/ubuntu/app 目录下执行了 docker 容器运行命令&#xff1a; # 映射 8859 端口 # 容器名为 jenkins-demo #…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...