C++输入输出流第一弹:标准输入输出流 详解(带测试代码)
目录
C++输入输出流
流的四种状态(重点)
标准输入输出流
标准输入流
逗号表达式
1. 逗号表达式的基本规则
示例
2. 图片中的代码分析
关键点解析
3. 常见误区
误区 1:逗号表达式等同于逻辑与 &&
误区 2:忽略输入失败的情况
缓冲机制
标准输出流
C++输入输出流
-
输入输出的含义
以前所用到的输入和输出,都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上。从操作系统的角度看,每一个与主机相连的输入输出设备都被看作一个文件。除了以终端为对象进行输入和输出外,还经常用磁盘(光盘)作为输入输出对象,磁盘文件既可以作为输入文件,也可以作为输出文件。
在编程语言中的输入输出含义有所不同。程序的输入指的是从输入文件将数据传送给程序(内存),程序的输出指的是从程序(内存)将数据传送给输出文件。
-
C++输入输出流机制
C++ 的 I/O 发生在流中,流是字节序列。如果字节流是从设备(如键盘、磁盘驱动器、网络连接等)流向内存,这叫做输入操作。如果字节流是从内存流向设备(如显示屏、打印机、磁盘驱动器、网络连接等),这叫做输出操作。
就 C++ 程序而言, I/O 操作可以简单地看作是从程序移进或移出字节,程序只需要关心是否正确地输出了字节数据,以及是否正确地输入了要读取字节数据,特定 I/O 设备的细节对程序员是隐藏的。
-
C++常用流类型
C++ 的输入与输出包括以下3方面的内容:
(1) 对系统指定的标准设备的输入和输出。即从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称标准 I/O 。
(2) 以外存磁盘文件为对象进行输入和输出,即从磁盘文件输入数据,数据输出到磁盘文件。以外存文件为对象的输入输出称为文件的输入输出,简称文件 I/O 。
(3) 对内存中指定的空间进行输入和输出。通常指定一个字符数组作为存储空间(实际上可以利用该空间存储任何信息)。这种输入和输出称为字符串输入输出,简称串 I/O 。
常用的输入输出流如下:
| 类名 | 作用 | 头文件 |
|---|---|---|
| istream | 通用输入流 | iostream |
| ostream | 通用输出流 | iostream |
| iostream | 通用输入输出流 | iostream |
| ifstream | 文件输入流 | fstream |
| oftream | 文件输出流 | fstream |
| fstream | 文件输入输出流 | fstream |
| istringstream | 字符串输入流 | sstream |
| ostringstream | 字符串输出流 | sstream |
| stringstream | 字符串输入输出流 | sstream |

流的四种状态(重点)
IO 操作与生俱来的一个问题是可能会发生错误,一些错误是可以恢复的,另一些是不可以的。在C++ 标准库中,用 iostate 来表示流的状态,不同的编译器 iostate 的实现可能不一样,不过都有四种状态:
-
badbit 表示发生系统级的错误,如不可恢复的读写错误。通常情况下一旦 badbit 被置位,流就无法再使用了。
-
failbit 表示发生可恢复的错误,如期望读取一个数值,却读出一个字符等错误。这种问题通常是可以修改的,流还可以继续使用。
-
eofbit表示到达流 , 此时eofbit 和 failbit 都会被置位。
-
goodbit 表示流处于有效状态。流在有效状态下,才能正常使用。如果 badbit 、 failbit 和 eofbit 任何一个被置位,则流无法正常使用。
这四种状态都定义在类 ios_base 中,作为其数据成员存在。在 GNU GCC7.4 的源码中,流状态的实现
如下:

通过流的状态函数实现
bool good() const //流是goodbit状态,返回true,否则返回false
bool bad() const //流是badbit状态,返回true,否则返回false
bool fail() const //流是failbit状态,返回true,否则返回false
bool eof() const //流是eofbit状态,返回true,否则返回false
标准输入输出流
对系统指定的标准设备的输入和输出。即从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准输入输出,简称标准 I/O
C++标准库定义了三个预定义的标准输入输出流对象,分别是 std::cin、std::cout 和 std::cerr。它们分别对应于标准输入设备(通常是键盘)、标准输出设备(通常是显示器)和标准错误设备(通常是显示器)。
标准输入、输出的内容包含在头文件iostream中。
有时候会看到通用输入输出流的说法,这是一个更广泛的概念,可以与各种类型的输入输出设备进行交互,包括标准输入输出设备、文件、网络等。
标准输入流
istream 类定义了一个全局输入流对象,即 cin , 代表的是标准输入,它从标准输入设备(键盘)获取数据,程序中的变量通过流提取符 “>>”(输入流符号) 从流中提取数据。
流提取符 “>>” 从流中提取数据时通常跳过输入流中的空格、 tab 键、换行符等空白字符。只有在输入完数据再按回车键后,该行数据才被送入键盘缓冲区,形成输入流,提取运算符 “>>” 才能从中提取数据。需要注意保证从流中读取数据能正常进行。(流的缓冲机制在下一节中学习)(cin << 遇到换行符等会断掉,可以理解为一个 << 流提取符只能提取一次?)
下面来看一个例子,每次从 cin 中获取一个字符:
void printStreamStatus(std::istream & is){ cout << "is's goodbit:" << is.good() << endl;cout << "is's badbit:" << is.bad() << endl;cout << "is's failbit:" << is.fail() << endl;cout << "is's eofbit:" << is.eof() << endl;
}void test0(){printStreamStatus(cin); //goodbit状态int num = 0; cin >> num; cout << "num:" << num << endl;printStreamStatus(cin); //进行一次输入后再检查cin的状态
}
因为这个cin是一个全局变量,不可复制,当不加引用时,传入cin会进行复制,已经将cin的拷贝构造进行删除因为而全局只能有一个输入流对象,所以要加&,不进行值传递,前面的const可加可不加但是这是一个输入流对象可能会对值进行修改所以就不加了。
如果没有进行正确的输入,输入流会进入failbit的状态,无法正常工作,需要恢复流的状态。
查看C++参考文档,需要利用clear和ignore函数配合,实现这个过程
if(!cin.good()){//恢复流的状态cin.clear();//清空缓冲区,才能继续使用cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');cout << endl;printStreamStatus(cin);}
如果不进行缓冲区的清除就会直接将上面输入的字符输入然后输出。


//下面为测试代码,可以自行测试
#include <iostream>
#include <string>
#include <limits>
using std::istream;
using std::cout;
using std::endl;
using std::cin;
using std::string;void checkStreamStatus(istream & is)
{cout << is.good() << endl;cout << is.bad() << endl;cout << is.fail() << endl;cout << is.eof() << endl;
}void test0()
{int num = 10;cout << "执行输入操作前检查流的状态" << endl;checkStreamStatus(cin);cout << endl;cin>> num;cout << "执行输入操作后检查流的状态" << endl;checkStreamStatus(cin);cout << endl;if(!cin.good()){//恢复流的状态cin.clear();//还需要清除缓冲区,才能使用//在limits的头文件里面cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');// checkStreamStatus(cin);}string str;cin >> str;cout << "str :" << str <<endl;cout << "num:" << num << endl;}
int main()
{test0();return 0;
}
ignore函数,如果只写释出多少个字符,如果多了再次再缓冲区输入字符也会被释出,因为直到释出那么多字符才会开始输入,所以格式就变成释出字符变为流的最大size,然后再加一个参数,表示直到这个字符,释出结束,就可以解决上面的问题了。
这里提到直到并包含delim说明'\n'也会被释出这就是为什么输出没有的原因。
-
终止字符
'\n'会被一并跳过:当ignore()遇到'\n'时,会将其从输入流中提取并丢弃。 -
流中剩余的字符:
'\n'之后的内容(如果有)会保留在流中。
思考,如何完成一个输入整型数据的实现(如果是非法输入则继续要求输入)
这里为什么使用逗号表达式,cin >> number 这个表达式的返回值就是这个while的判断条件,当给num成功赋值就是good状态,只有good状态时可以视为true,还可以继续正常工作,这就是为什么使用逗号表达式,要不然错误输入就会结束循环

下面为测试代码,可自行测试验证
//完成输入一个整型数据的实现
#include <iostream>
#include <string>
#include <limits>
using std::istream;
using std::cout;
using std::endl;
using std::cin;
using std::string;void InputInt(int &num)
{cout << "请输入一个int型数据"<<endl;//逗号表达式整体的值为最后一个逗号之后的表达式的值while(cin >> num,!cin.eof()) //切换到eof()状态 Ctrl+D 循环结束{if(cin.bad()){cout << "cin has broken !" << endl;return;}else if(cin.fail()){cin.clear();cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');cout << "请输入一个int型数据" << endl;}else{//输入是合法的cout << "num : " << num << endl;break;}}
}int main()
{int num;InputInt(num);return 0;
}

if(cin.good())
{cout << "hello " << endl;
}
//cin还没用状态为good,可以继续使用
if(cin)
{cout << "hello" << nedl;
}
逗号表达式
以下是关于 C++ 中 逗号表达式 的详细讲解,结合你提供的图片中的代码场景:
1. 逗号表达式的基本规则
-
定义:逗号表达式由多个子表达式组成,形式为
表达式1, 表达式2, ..., 表达式N。 -
求值顺序:从左到右依次执行所有子表达式。
-
最终值:整个逗号表达式的值为 最后一个子表达式 的值。
示例
int a = (10, 20, 30); // a = 30
int b = (printf("A"), printf("B"), 5);
// 输出 "AB",b = 5
2. 图片中的代码分析
根据你描述的代码片段:
// 逗号表达式整体的值为最后一个逗号之后的表达式的值
while (cin >> num, !cin.eof()) {if (cin) {// 处理输入...}
}
关键点解析
-
逗号表达式的作用:
-
子表达式1:
cin >> num(从输入流读取数据到num)。 -
子表达式2:
!cin.eof()(检查输入流是否未到达文件末尾)。 -
整个条件的值:由
!cin.eof()决定,但cin >> num会先执行。
-
-
循环逻辑:
-
每次循环前:先执行
cin >> num,再检查是否未到达文件末尾。 -
循环继续条件:只要未到达文件末尾(
!cin.eof()为true),循环继续。
-
3. 常见误区
误区 1:逗号表达式等同于逻辑与 &&
// 错误理解:认为 while(cin >> num && !cin.eof())
// 实际行为:逗号表达式与 && 的短路逻辑不同!
-
区别:
-
&&:若左侧表达式为false,右侧不执行。 -
逗号表达式:所有子表达式都会执行,无论前面的结果如何。
-
误区 2:忽略输入失败的情况
-
问题:如果
cin >> num失败(如输入非数字),cin会进入错误状态,但!cin.eof()可能仍为true,导致死循环。 -
改进方法:在条件中同时检查输入是否成功:
while ((cin >> num) && !cin.eof()) { // 使用 && 而非逗号// 处理有效输入... }
对代码进行测试,发现当我们输入3.4时,这时num为3,我们这是可能会猜测,是不是都读取到了然后将数据类型转化了呢,然后我们又测试了一个整型加一个字符串,我们发现没有错误,num值为整型值,说明当读到.4和后面的字符值时发现已经不为整型了,就不继续读取了,剩下的就被留在了缓存区。 那么要如何解决需要后面字符串的输入流


缓冲机制
在标准输入输出流的测试中发现,流有着缓冲机制。缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。
输入或输出的内容会存在流对象对应的缓冲区,在特定情景下会从缓冲区释出。
-
为什么要引入缓冲区?
比如我们从磁盘里取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取,这样就可以减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于对磁盘的操作,故应用缓冲区可大大提高计算机的运行速度。
又比如,我们使用打印机打印文档,由于打印机的打印速度相对较慢,我们先把文档输出到打印机相应的缓冲区,打印机再自行逐步打印,这时我们的 CPU 可以处理别的事情。因此缓冲区就是一块内存区,它用在输入输出设备和 CPU 之间,用来缓存数据。它使得低速的输入输出设备和高速的CPU 能够协调工作,避免低速的输入输出设备占用 CPU,解放出 CPU,使其能够高效率工作。
-
缓冲区要做哪些工作?
从上面的描述中,不难发现缓冲区向上连接了程序的输入输出请求,向下连接了真实的 I/O 操作。作为中间层,必然需要分别处理好与上下两层之间的接口,以及要处理好上下两层之间的协作。
输入或输出的内容会存在流对象对应的缓冲区,在特定情景下会从缓冲区释出。
-
缓冲机制
缓冲机制分为三种类型:全缓冲、行缓冲和不带缓冲。
全缓冲:在这种情况下,当填满缓冲区后才进行实际 I/O 操作。全缓冲的典型代表是对磁盘文件的读写。
行缓冲:在这种情况下,当在输入和输出中遇到换行符时,执行真正的 I/O 操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的 I/O 操作。典型代表是cin。
不带缓冲:也就是不进行缓冲,有多少数据就刷新多少。标准错误输出 cerr是典型代表,这使得出错信息可以直接尽快地显示出来。
cout既有全缓冲的机制,又有行缓冲的机制;cin通常体现行缓冲机制;cerr属于不带缓冲机制,通常用于处理错误信息。
标准输出流
ostream 类定义了全局输出流对象 cout,即标准输出,先将要输出的内容传给了cout对象,在缓冲区刷新时将数据输出到终端。
如下几种情况会导致输出缓冲区内容被刷新:
-
程序正常结束;
马上输出了1025个a

-
缓冲区满;
马上输出了1024个a,等待2秒后输出了最后一个a
(说明在实验环境中cout对象的默认缓冲区大小是1024个字节,缓冲区满了就刷新出了所有内容,后面还有一个字符,就要等程序正常结束时刷新出来)
-
使用操纵符显式地刷新输出缓冲区,如endl ;
加上endl这种操作符,直接输出了5个a,等待2秒程序结束;如果不加endl,等待2秒程序结束时才会输出5个a

—— 查看ostream头文件中endl的定义(刷新缓冲区 + 换行)


来看一个简单的例子:在使用cout时,如果在输出流语句末尾使用了endl函数,会进行换行,并刷新缓冲区
void test0(){for(int i = 0; i < 1025; ++i){cout << 'a' << endl; }
}
如果在使用cout时,没有使用endl函数,键盘输入的内容会存在输出流对象的缓冲区中,当缓冲区满或遇到换行符时,将缓冲区刷新,内容传输到终端显示。可使用sleep函数查看缓冲的效果。
#include <unistd.h>
void test0(){for(int i = 0; i < 1024; ++i){cout << 'a'; }sleep(2);cout << 'b';sleep(2);
}
GCC中标准输出流的默认缓冲区大小就是1024个字节。
上面的输出结果:1024个字节,缓冲区没有满,在加一个字节才会满出来所以现象就是sleep 2秒当再次加入b时缓冲区满了,将1024个a输出,再等待2秒钟,等程序结束输出b。
如果不用sleep函数,即使没有endl或换行符,所有内容依然是直接输出
——因为程序执行完时也会刷新缓冲区。
-
关于操作符
endl : 用来完成换行,并刷新缓冲区
ends : 在输入后加上一个空字符('\0'),然后再刷新缓冲区
flush : 用来直接刷新缓冲区的 cout.flush();
-
标准错误流
ostream 类还定义了全局输出流对象 cerr,标准错误流(不带缓冲)
试试看如下的代码运行会有什么效果
#include <unistd.h>
void test1(){cerr << 1;cout << 3;sleep(2);
}
相关文章:
C++输入输出流第一弹:标准输入输出流 详解(带测试代码)
目录 C输入输出流 流的四种状态(重点) 标准输入输出流 标准输入流 逗号表达式 1. 逗号表达式的基本规则 示例 2. 图片中的代码分析 关键点解析 3. 常见误区 误区 1:逗号表达式等同于逻辑与 && 误区 2:忽略输入…...
{瞎掰} 手机安装app问题:app签名,手机 or OS官方商店 其他非官方app源,安全防护 突破限制
以下,在华为安卓系统手机中,在安装app过程中得到的一些可能是错误的经验。 商品化 app 的收钱方式:通过商店来收钱,通过 app 本身提供的注册码功能来收钱,或是其他的收钱方式。 手机安装 app的特点 从官方商店里安装…...
鸿蒙NEXT项目实战-百得知识库05
代码仓地址,大家记得点个star IbestKnowTeach: 百得知识库基于鸿蒙NEXT稳定版实现的一款企业级开发项目案例。 本案例涉及到多个鸿蒙相关技术知识点: 1、布局 2、配置文件 3、组件的封装和使用 4、路由的使用 5、请求响应拦截器的封装 6、位置服务 7、三…...
记录一次,rabbitmq开启stomp插件之后,还是连不上15674端口的问题
原因是装在docker 里面的rabbitmq 没有映射15674端口,需重新删除容器之后重新运行 docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -p 15674:15674 -p 1883:1883 -p 15675:15675 rabbitmq:版本号 进入docker容器开启插件 docker exec -it rabbitm…...
黑马node.js教程(nodejs教程)——AJAX-Day01-04.案例_地区查询——查询某个省某个城市所有地区(代码示例)
文章目录 代码示例效果 代码示例 axiosTest.html <!DOCTYPE html> <!-- 文档类型声明,告诉浏览器这是一个HTML5文档 --> <html lang"en"> <!-- HTML根元素,设置文档语言为英语 --><head> <!-- 头部区域&am…...
vue 自制列表,循环滚动
需求人员表示,超过高度的表格内容需要滚动展示,所以效果图如下: 自定义列表样式,主要是通过flex布局,控制 类th 与 类td 的宽度保持一致,标签结构还是参考了table的结构,由thead与tbody包裹tr再…...
【QA】模板方法模式在Qt中有哪些应用?
在 Qt 框架中,模板方法模式(Template Method Pattern)被广泛应用于框架的设计中,通过定义算法骨架并允许子类在不改变结构的情况下重写部分步骤。以下是 Qt 中典型的应用场景及示例: 1. 事件处理(Event Ha…...
图论——kruskal算法
53. 寻宝(第七期模拟笔试) 题目描述 在世界的某个区域,有一些分散的神秘岛屿,每个岛屿上都有一种珍稀的资源或者宝藏。国王打算在这些岛屿上建公路,方便运输。 不同岛屿之间,路途距离不同,国王希望你可以规划建公路的方案,如何可以以最短的总公路距离将 所有岛屿联通…...
Windows主机、虚拟机Ubuntu、开发板,三者之间文件互传
以下内容源于日常学习的整理,欢迎交流。 下图是Windows主机、虚拟机Ubuntu、开发者三者之间文件互传的方式示意图: 注意,下面谈及的所有方式,都要求两者的IP地址处于同一网段,涉及到的软件资源见felm。 一、Windows主…...
Flutter Dart 泛型详解
引言 在 Flutter 开发中,Dart 语言的泛型是一项强大且实用的特性。泛型允许我们在定义类、方法或接口时使用类型参数,这样可以编写更加灵活、可复用且类型安全的代码。下面将详细介绍 Dart 泛型的各个方面,并结合代码示例进行说明。 1. 泛型…...
Windows Docker 报错: has no HTTPS proxy,换源
pull python 3.7报错: 尝试拉取Docker 测试库hello world也失败 尝试使用临时镜像源,可以成功拉取: sudo docker pull docker.m.daocloud.io/hello-world说明确实是网络问题,需要配置镜像源,为了方便,在d…...
Java:Arrays类:操作数组的工具类
文章目录 Arrays类常见方法SetAll(); 代码排序如果数组中存储的是自定义对象 Arrays类 常见方法 SetAll(); 注意: 不能用新的数组接是因为修改的是原数组,所以完了要输出原数组发现会产生变化参数是数组下标变成灰色是因为还能简化(Lambda…...
【面试场景题-Redis中String类型和map类型的区别】
今天在面试中碰到一个场景题:在 Redis 中存储 100 万用户数据时,使用 String 类型和 Hash(Map)类型的主要区别是什么?体现在以下几个方面: 1. 存储结构与内存占用 String 类型 存储方式:每个用…...
List附加对象
List里面的某个对象需要修改,赋值 可以使用ALL或者ForEach,All的话,不能直接使用赋值对象只能赋值对象的某个字段 static void Main(string[] args){List<UserData> UserDatas new List<UserData>{new UserData { Id 1, Name …...
VLLM专题(三十六)—自动前缀缓存
PagedAttention 的核心思想是将每个请求的 KV 缓存划分为 KV 块。每个块包含固定数量的标记(tokens)对应的注意力键(keys)和值(values)。PagedAttention 算法允许将这些块存储在非连续的物理内存中,从而通过按需分配内存来消除内存碎片。 为了自动缓存 KV 缓存,我们利…...
相机光学(四十七)——相纸材质
1. 光面相纸 光面相纸表面光滑,亮度高,反光性好,能够呈现出清晰、鲜艳的图像效果,适合用于表现色彩艳丽、反差要求较高的题材,如产品照、艺术照和风景照。然而,这种相纸容易沾上指纹和灰尘。 2. 绒面相纸…...
数据表100多字段如何写mapper文件的xml
编写一个包含100多个字段的插入语句通常涉及到使用<mapper>标签来定义映射规则,特别是在使用MyBatis这样的持久层框架时。 1. 定义<mapper>命名空间 order表 <mapper namespace"com.example.mapper.orderMapper"><!-- 插入语句 --…...
只是“更轻更薄”?不!遨游三防平板还选择“更强更韧”
当消费电子领域普遍追求“更轻更薄”的设计美学时,遨游三防平板不止于此,还选择了另一条道路——“更强更韧”。在智能制造的复杂场景中,三防平板需直面高温、油污、撞击与极端气候的考验。普通消费级平板因防护性能不足,常因环境…...
拉取镜像太慢?一文解决!
# 拉取 Docker 镜像太慢?一文解决!🚀在国内使用 Docker 拉取镜像时,可能会遇到速度慢甚至失败的情况。别担心!本文带你快速优化 Docker 拉取方法!🔥01 | 确保 Docker Hub 登录认证 🔐…...
基于RAGFlow本地部署DeepSeek-R1大模型与知识库:从配置到应用的全流程解析
作者:后端小肥肠 🍊 有疑问可私信或评论区联系我。 🥑 创作不易未经允许严禁转载。 姊妹篇: DeepSpeek服务器繁忙?这几种替代方案帮你流畅使用!(附本地部署教程)-CSDN博客 10分钟上手…...
(分块)洛谷 P2801 教主的魔法 题解
之前学过 莫队 算法,其运用了分块思想;但是我居然是第一次写纯种的分块题目。 题意 给你一个长度为 n n n 的序列 a a a(一开始 ∀ a i ∈ [ 1 , 1000 ] \forall a_i\in[1,1000] ∀ai∈[1,1000])。要求执行 q q q 次操作&…...
[蓝桥杯 2023 省 B] 飞机降落(不会dfs的看过来)
[蓝桥杯 2023 省 B] 飞机降落 题目描述 N N N 架飞机准备降落到某个只有一条跑道的机场。其中第 i i i 架飞机在 T i T_{i} Ti 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 D i D_{i} Di 个单位时间,即它最早可以于 T i T_{i} Ti 时刻…...
信创系统极速文件查找:locate 命令详解
原文链接:信创系统极速文件查找:locate 命令详解 Hello,大家好啊!今天给大家带来一篇信创终端操作系统上 locate 命令详解的文章。在 Linux 及信创终端操作系统(如 统信 UOS、麒麟 KOS)中,查找…...
C# | 超简单CSV表格读写操作(轻松将数据保存到CSV,并支持读取还原)
C# | 超简单CSV表格读写操作(轻松将数据保存到CSV,并支持读取还原) 文章目录 C# | 超简单CSV表格读写操作(轻松将数据保存到CSV,并支持读取还原)一、上位机开发中的CSV应用背景二、CSV读写实战教学1. 基本对…...
PostgreSQL:语言基础与数据库操作
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
RK3568 Android11 sh366006驱动
sh366006.c /* 谁愿压抑心中怒愤冲动咒骂这虚与伪与假从没信要屈膝面对生命纵没有别人帮一生只靠我双手让我放声疯狂叫囔今天的他 呼风可改雨不可一世太嚣张 --《不可一世》Beyond */ #include <linux/module.h> #include <linux/init.h> #include <linux/fs.h…...
蓝桥杯学习——二叉树+奇点杯题目解析
基础认知 一、二叉树种类: 1.满二叉树。记深度k,节点数量2^k-1。 2.完全二叉树:除了底层,其余全满,底部从左到右连续。 3,平衡二叉搜索树:左子树和右子树高度差不大于1。 二、存储方式&…...
基于django+vue的购物商城系统
开发语言:Python框架:djangoPython版本:python3.8数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 系统首页 热卖商品 优惠资讯 个人中心 后台登录 管理员功能界面 用户管理 商品分类管理…...
AI安全、大模型安全研究(DeepSeek)
DeepSeek 点燃AI应用革命之火,但安全 “灰犀牛” 正在逼近 DeepSeek-R1国产大模型的发布,以技术创新惊艳了全球,更是极致的性价比推动国内千行百业接入 AI,政府、企业竞速开发智能业务处理、智能客服、代码生成、营销文案等应用,“落地效率” 成为第一关键词。然而与此相…...
卷积神经网络 - 汇聚层
卷积神经网络一般由卷积层、汇聚层和全连接层构成,本文我们来学习汇聚层。 汇聚层(Pooling Layer)也叫子采样层(Subsampling Layer),其作用是进 行特征选择,降低特征数量,从而减少参数数量。 卷积层虽然可以显著减少网络中连接的…...
