【Linux文件IO】Linux中标准IO的API的描述和基本用法
Linux中标准IO的API的描述和基本用法
- 一、标准IO相关API
- 1、文件的打开和关闭
- 示例代码:
- 2、文件的读写
- 示例代码:
- 用标准IO(fread、fwrite)实现文件拷贝(任何文件均可拷贝)
- 3、文件偏移设置
- 示例代码:
- 4、fgets fputs fgetc fputc gets puts putchar getchar putc getc
- 示例代码:
- (1) fgets按行读取数据
- (2) fputs写入数据到文件
- (3) fgets和fputs另外一个功能(标准输入和标准输出)
- (4) fgetc读取一个字符和fputc写入一个字符
- 5、判断是否到达文件末尾
- 示例代码:
- 6、fprintf和fscanf()
- 示例代码:
- 7、主动刷新缓冲区
- 示例代码:
- 二、对比系统IO和标准IO的区别
- 1、
- 2、
- 3、
一、标准IO相关API
1、文件的打开和关闭

注意:
- 总共有6中打开模式,不能自创别的模式,比如 “rw” 是非法的。

注意: - fclose函数涉及内存释放,不可对同一个文件多次关闭。
示例代码:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>int main(int argc, char const *argv[])
{FILE * fp;// 以只读方式打开文件,要求文件必须存在// fp = fopen("1.txt", "r"); // 文件打开失败 提示: No such file or directory// 以读写方式打开文件,要求文件必须存在// fp = fopen("1.txt", "r+"); // 文件打开失败 提示: No such file or directory// 以只写方式打开文件,不存在就新建,存在则清空fp = fopen("1.txt", "w"); // if (fp == NULL){perror("文件打开失败\n");return -1;}// 关闭文件fclose(fp);return 0;
}
2、文件的读写
//按照数据块来读取数据
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);返回值(重点):成功 返回读取到的完整的数据块的个数失败 -1参数:ptr --》存放读取的内容size(重点) --》要读取的数据块大小,字节nmemb(重点) --》打算读取多少个数据块stream --》要读取的那个文件比如:read(fd,buf,100); fread(buf,50,2); //读取2个数据块,每个数据块50个字节fread(buf,20,5); //读取5个数据块,每个数据块20个字节fread(buf,10,10); //读取10个数据块,每个数据块10个字节fread(buf,1,100); //读取100个数据块,每个数据块1个字节 情况1:如果文件剩余的字节数>=100个字节,以上四种写法都可以成功读取100个字节区别就是返回值不同情况2:如果文件剩余的字节数<100个字节,以上四种写法都可以成功读取剩余所有的字节区别就是返回值不同size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);返回值(重点): 成功 nmemb是多少,返回值就是多少参数:ptr --》存放要写入的内容size(重点) --》要写入的数据块大小,字节nmemb(重点) --》打算写入多少个数据块stream --》要写入的那个文件总结:无论write还是fwrite写入的字节数搞多了,都会找垃圾凑够需要写的字节数fwrite第三个参数写的是多少,返回值就是多少
示例代码:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>/*fread返回值:返回完整数据块个数fwrite返回值:nmemb是多少,返回值就是多少
*/int main(int argc, char const *argv[])
{FILE *fp = fopen("1.txt", "r+");int ret = 0; if (fp == NULL){perror("打开文件失败\n");return -1;}char buf[20] = "helloword";// ret = fread(buf, 10, 1, fp); // 读取1个数据块,数据块大小为10个字节 读取的内容是:1234567890// fread(buf, 5, 2, fp); // 读取2个数据块,数据块大小为5个字节 读取的内容是:1234567890// ret = fread(buf, 1, 10, fp); // 读取10个数据块,数据块大小为1个字节 读取的内容是:1234567890// fread(buf, 2, 5, fp); // 读取5个数据块,数据块大小为2个字节 读取的内容是:1234567890// ret = fread(buf, 6, 2, fp);// printf("读取的内容是:%s\n", buf);// printf("fread的返回值ret:%d\n", ret);ret = fwrite(buf, 10, 1, fp);printf("fwrite的返回值ret:%d\n", ret);return 0;
}
用标准IO(fread、fwrite)实现文件拷贝(任何文件均可拷贝)
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>int main(int argc, char const *argv[])
{char buf[100] = {0};int ret = 0;FILE *fp1 = fopen("1.txt", "r+");if (fp1 == NULL){perror("打开文件失败\n");return -1;}FILE *fp2 = fopen("new.txt", "w+");if (fp1 == NULL){perror("新建文件失败\n");return -1;}while (1){bzero(buf, 100);// 每次读取100字节,即读取100个数据块,每个数据块1字节ret = fread(buf, 1, 100, fp1); // 读取完成则退出循环if (ret == 0) {break;}// 写入到目标文件fwrite(buf, 1, ret, fp2);}fclose(fp1);fclose(fp2);return 0;
}
3、文件偏移设置

示例代码:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>int main(int argc, char const *argv[])
{char buf[100] = {0};int ret = 0;FILE *fp1 = fopen("1.txt", "r+");if (fp1 == NULL){perror("打开文件失败\n");return -1;}// 从起始位置往后偏移5个字节,返回值与lseek不一样,0:成功, -1:失败ret = fseek(fp1, 5, SEEK_SET);printf("fseek的返回值是:%d\n", ret); // fseek的返回值是:0// 获取当前光标距离起始位置的字节数printf("当前光标距离起始位置的字节数:%ld\n", ftell(fp1)); // 当前光标距离起始位置的字节数:5// 读取文件,从第六个字节开始读取fread(buf, 1, 5, fp1);// 偏移后读取的数据是:world 若读取数据有误,现在linux中手动删除(rm 1.txt)在新建(vim 1.txt)printf("偏移后读取的数据是:%s\n", buf); // 关闭文件fclose(fp1);return 0;
}
4、fgets fputs fgetc fputc gets puts putchar getchar putc getc
char *fgets(char *s, int size, FILE *stream); //按行读取数据,一次最多读取一行(遇到回车结束读取)返回值:成功 返回读取的一行数据的首地址失败 NULL参数:s --》存放读取到的一行数据size --》打算读取多少字节的数据stream --》要从哪个文件读取一行特点:假如一行只有10个字符fgets(buf,5,myfile); //只能读取4个有效字符,最后一个fgets会帮你填充\0fgets(buf,11,myfile); //前面10个是有效字符,第11个是\0fgets(buf,12,myfile); //前面11个是有效字符(会把回车\n读取,windows上的回车是\r\n),第12个是\0
int fputs(const char *s, FILE *stream); //往一个文件中写入字符串返回值:成功 >0 失败 -1 参数:s --》要写入的内容stream --》要写入的那个文件 fputs有局限性(char *),只能写入字符串,但是fwrite可以写任意类型(void *)的数据int fgetc(FILE *stream); //按字符读取数据,一次只能读取一个字节的数据返回值:读取到的那个字符的ASCII码值失败 -1
int fputc(int c, FILE *stream); //把c这个字符写入到stream表示的文件中char *gets(char *s); //只能读取键盘输入的字符串,把字符串保存到s中
int puts(const char *s) //把s这个字符串在标准输出(液晶屏)上打印出来int getc(FILE *stream); //按字符读取数据,一次只能读取一个字节的数据
int putc(int c, FILE *stream); //把c这个字符写入到stream表示的文件中int getchar(void); //从IO缓冲区读取一个字符
int putchar(int c); //把c代表的字符在液晶屏上打印出来
示例代码:
(1) fgets按行读取数据
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>/*fgets按行读取文件特点:fgets遇到回车就结束读取,并且会把回车也读取出来特点: 假如一行只有10个字符fgets(buf,5,myfile); //只能读取4个有效字符,最后一个fgets会填充\0fgets(buf,11,myfile); //前面10个是有效字符,第11个是\0fgets(buf,12,myfile); //前面11个是有效字符(会把回车\n读取,windows上的回车是\r\n),第12个是\0
*/
int main(int argc, char const *argv[])
{char buf[100] = {0};int ret = 0;FILE *fp1 = fopen("1.txt", "r+");if (fp1 == NULL){perror("打开文件失败\n");return -1;}// 每一轮读取一行数据 // for (int i = 0; i < 3; i++)// {// bzero(buf, 0);// fgets(buf, 100, fp1);// printf("buf :%s\n", buf);// }
/*
原始数据:helloworld你好你最棒
执行结果:buf :helloworldbuf :你好buf :你最棒 */// 第二个参数需要设置到足够大,否则一直读取第一行数据直至读完才会读取第二行数据bzero(buf, 100);fgets(buf,5,fp1);printf("buf :%s\n", buf);bzero(buf, 100);fgets(buf,5,fp1);printf("buf :%s\n", buf);bzero(buf, 100);fgets(buf,5,fp1);printf("buf :%s\n", buf);
/*
原始数据:helloworldnihaonihaohelloworld
执行结果:buf :hellbuf :oworbuf :ld
*/// 关闭文件fclose(fp1);return 0;
}
(2) fputs写入数据到文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>int main(int argc, char const *argv[])
{char buf[100] = {0};int ret = 0;FILE *fp1 = fopen("1.txt", "r+");if (fp1 == NULL){perror("打开文件失败\n");return -1;}// 写入字符串fputs("hello", fp1);fputs("world", fp1);fseek(fp1, 0, SEEK_SET);fread(buf, 1, 100, fp1);printf("buf:%s\n", buf);// 关闭文件fclose(fp1);return 0;
}
(3) fgets和fputs另外一个功能(标准输入和标准输出)
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>int main(int argc, char const *argv[])
{char buf[100] = {0};// fgets读取键盘输入的字符串(标准输入)printf("fgets从键盘输入一个字符串:");fgets(buf, 100, stdin);// fputs写入字符串到液晶屏(标准输出)printf("fputs从液晶屏输出一个字符串:");fputs(buf, stdout);return 0;
}/*
执行结果:fgets从键盘输入一个字符串:nihaofputs从液晶屏输出一个字符串:nihao
*/
(4) fgetc读取一个字符和fputc写入一个字符
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>int main(int argc, char const *argv[])
{char buf[100] = {0};int ret = 0;FILE *fp1 = fopen("1.txt", "r+");if (fp1 == NULL){perror("打开文件失败\n");return -1;}// 读取一个字节ret = fgetc(fp1);printf("读取到的内容:%c, %d\n", ret, ret); // 读取到的内容:h, 104fputc('#', fp1);fseek(fp1, 0, SEEK_SET);fread(buf, 1, 100, fp1);printf("写入#后的内容是:%s\n", buf); // 写入#后的内容是:h#lloworld// 关闭文件fclose(fp1);return 0;
}
5、判断是否到达文件末尾
int feof(FILE *stream);返回值:1 表示达到文件末尾
示例代码:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>int main(int argc, char const *argv[])
{char buf[100] = {0};FILE *fp = fopen("1.txt", "r+");if (fp == NULL){perror("打开文件失败\n");return -1;}while(1){bzero(buf, 100);char *ret = fgets(buf, 100, fp);printf("读取到一行的数据:%s\n", buf);// 方法1:通过fgets和fread的返回值判断// if (ret == NULL)// {// printf("读取完毕\n");// break;// }// 方法2:使用feof函数判断if (feof(fp) == 1){printf("读取完毕\n");break;}}fclose(fp);return 0;
}/* 执行结果:读取到一行的数据:h#lloworld读取到一行的数据:nihao读取到一行的数据:666666读取完毕 */
6、fprintf和fscanf()
sprintf 拼接字符串printf 打印字符串
int fprintf(FILE *stream, const char *format, ...); //按照指定格式,把数据合并写入到stream代表的文件中int fscanf(FILE *stream, const char *format, ...); //按照指定格式,把数据读取出来fscanf读取指定格式的数据
如果指定的格式是%s,fscanf会把整个文件内容都当成是字符串
示例代码:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>int main(int argc, char const *argv[])
{/* fprintf 把字符串拼接好写入指定的文件中 */char read_buf[100] = {0};char *buf = "hello";int year = 2025;float score = 99.9;FILE *fp = fopen("2.txt", "w+");if (fp == NULL){perror("打开文件失败\n");return -1;}fprintf(fp, "%s%d-%f", buf, year, score);// 写完后此时光标移至末尾,需要将光标重新移至开头fseek(fp, 0, SEEK_SET);// 读取文件fread(read_buf, 1, 100, fp);printf("read_buf:%s\n", read_buf); // read_buf:hello2025-99.900002// 关闭文件fclose(fp);/* fscanf 把文件中的内容读取并拆分 */char *write_buf = "2025-01-01";int y,m,d;FILE *fp2 = fopen("3.txt", "w+");if (fp2 == NULL){perror("打开文件失败\n");return -1;}// 写入文件fwrite(write_buf, 1, strlen(write_buf), fp2);// 写入文件时会将光标移至文件末尾。需要将光标重新移至开头fseek(fp2, 0, SEEK_SET);// 把文件中的内容读取并拆分fscanf(fp2, "%d-%d-%d", &y, &m, &d);printf("年:%d\n", y);printf("月:%d\n", m);printf("日:%d\n", d);return 0;
}
/*
执行结果:read_buf:hello2025-99.900002年:2025月:1日:1
*/
7、主动刷新缓冲区
正常情况下标准IO是带缓冲区:情况一:缓冲区满了,自动刷新情况二:缓冲区没有满,主函数return退出的时候也会自动刷新缓冲区情况三:fclose关闭文件的时候也会刷新缓冲区
int fflush(FILE *stream);返回值:成功:0 失败:-1
示例代码:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>int main(int argc, char const *argv[])
{int n = 0;FILE *fp = fopen("4.txt", "r+");if (fp == NULL){perror("打开文件失败\n");return -1;}while (1){fwrite("hello", 1, 5, fp);sleep(1);fflush(fp); // 主动刷新缓冲区}fclose(fp);// return 0;
}
二、对比系统IO和标准IO的区别
1、
- 系统IO采用文件描述符来表示文件
- 标准IO采用FILE*来表示文件
2、
系统IO 0 1 2#define STDIN_FILENO 0 标准输入--》键盘#define STDOUT_FILENO 1 标准输出--》液晶屏#define STDERR_FILENO 2 标准错误输出--》液晶屏标准IO stdin stdout stderrFILE *stdin; 标准输入--》键盘FILE *stdout; 标准输出--》液晶屏 FILE *stderr; 标准错误输出--》液晶屏
3、
- 系统IO没有缓冲区
- 标准IO带缓冲区
相关文章:
【Linux文件IO】Linux中标准IO的API的描述和基本用法
Linux中标准IO的API的描述和基本用法 一、标准IO相关API1、文件的打开和关闭示例代码: 2、文件的读写示例代码:用标准IO(fread、fwrite)实现文件拷贝(任何文件均可拷贝) 3、文件偏移设置示例代码: 4、fgets fputs fget…...
深度学习篇---PaddleDetectionPaddleOCR
文章目录 前言1.代码2.代码介绍2.1 **导入模块**2.2 **配置区域**2.3 ExpressInfoProcessor类2.4 **主程序**: 3.使用说明3.1环境准备3.2模型准备3.3数据库初始化3.4串口配置3.5信息提取优化3.6注意事项 前言 本文简单介绍了PaddleDetection和PaddleOCR相结合的示例…...
Ant Design Vue Select 选择器 全选 功能
Vue.js的组件库Ant Design Vue Select 选择器没有全选功能,如下图所示: 在项目中,我们自己实现了全选和清空功能,如下所示: 代码如下所示: <!--* 参数配置 - 风力发电 - 曲线图 * 猴王软件学院 - 大强 …...
系统与网络安全------网络应用基础(1)
资料整理于网络资料、书本资料、AI,仅供个人学习参考。 TCP/IP协议及配置 概述 TCP/IP协议族 计算机之间进行通信时必须共同遵循的一种通信规定 最广泛使用的通信协议的集合 包括大量Internet应用中的标准协议 支持跨网络架构、跨操作系统平台的数据通信 主机…...
ZIP_STORED和ZIP_LZMA没有compresslevel参数!
在使用py的zipfile库进行压缩的时候,有这么一个函数: def write(self, filename, arcnameNone,compress_typeNone, compresslevelNone): 一般我们在压缩文件进去的时候都是用这个函数的; 对于compresslevel这个函数,它是用来指…...
坦克大战(c++)
今天我给大家分享一个c游戏。 废话不多说,作品展示: #include <stdio.h> #include <windows.h> #include <time.h> //里规格:长39*278 (真坐标)(假坐标宽为39) 高39 //外规格:长…...
论文阅读:2023 EMNLP SeqXGPT: Sentence-level AI-generated text detection
总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 SeqXGPT: Sentence-level AI-generated text detection https://aclanthology.org/2023.emnlp-main.73/ https://github.com/Jihuai-wpy/SeqXGPT https://www.doubao.com/chat/21003…...
JDK 24 发布,新特性解读!
一、版本演进与技术格局新动向 北京时间3月20日,Oracle正式发布Java SE 24。作为继Java 21之后的第三个非LTS版本,其技术革新力度远超预期——共集成24项JEP提案,相当于Java 22(12项)与Java 23(12项&#…...
k8s中service概述(二)NodePort
NodePort 是 Kubernetes 中一种用于对外暴露服务的 Service 类型。它通过在集群的每个节点上开放一个静态端口(NodePort),使得外部用户可以通过节点的 IP 地址和该端口访问集群内部的服务。以下是关于 NodePort Service 的详细说明࿱…...
Oracle归档配置及检查
配置归档位置到 USE_DB_RECOVERY_FILE_DEST,并设置存储大小 startup mount; !mkdir /db/archivelog ALTER SYSTEM SET db_recovery_file_dest_size100G SCOPEBOTH; ALTER SYSTEM SET db_recovery_file_dest/db/archivelog SCOPEBOTH; ALTER SYSTEM SET log_archive…...
计算机二级:函数基础题
函数基础题 第一题 rinput("请输入半径:") c3.1415926*r*2 print("{:.0f}".format(c))输出: Type Error第二题 a7 b2 print(a%2)输出 1第三题 ab4 def my_ab(ab,xy):abpow(ab,xy)print(ab,end"\n") my_ab(ab,2)prin…...
Python爬虫-爬取AliExpress商品搜索词排名数据
前言 本文是该专栏的第49篇,后面会持续分享python爬虫干货知识,记得关注。 本文,笔者以AliExpress平台为例。基于Python爬虫,通过某个指定的“搜索关键词”,批量获取该“搜索关键词”的商品排名数据。 具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。废…...
AI 时代,我们需要什么样的数据库?
AI 时代,我们需要什么样的数据库? 人工智能正在悄然改变软件开发的方式。过去一年间,诸如 GitHub Spark、Replit 和 Bolt 等新兴 AI 工具层出不穷,能够快速生成简单的前端应用,甚至无需传统意义上的后端服务就能部署上…...
刷机维修进阶教程-----adb禁用错了系统app导致无法开机 如何保数据无损恢复机型
在刷机维修过程中 。我们会遇到一些由于客户使用adb指令来禁用手机app而导致手机无法开机进入系统的故障机型。通常此类问题机型有好几种解决方法。但如果客户需要保数据来恢复机型。其实操作也是很简单的.还有类似误删除应用导致不开机等等如何保数据。 通过博文了解💝💝�…...
Vue3 实战:基于 mxGraph 与 WebSocket 的动态流程图构建
本文将详细介绍如何在 Vue3 项目中集成 mxGraph 可视化库,并通过 WebSocket 实现画布元素的实时更新。适合有 Vue 基础的前端开发者学习参考。 一、技术栈准备 Vue3:采用 Composition API 开发mxGraph:JavaScript 流程图库(版本 …...
Ubuntu AX200 iwlwifi-cc-46.3cfab8da.0.tgz无法下载的解决办法
文章目录 前言一、检查网卡是否被识别二、确认内核模块是否可用1.AX200 wifi 要求内核5.12.检查 iwlwifi.ko 是否存在:3.如果未找到,可能是内核模块未正确生成。尝试安装 linux-modules-extra:4.再次检查 iwlwifi.ko 是否存在:5.确…...
蓝桥杯,利用 Vue.js 构建简易任务管理器
在日常开发中,我们经常需要处理各种任务和计划。一个简单且高效的任务管理器可以帮助我们更好地组织和安排时间。今天,我将向大家展示如何使用 Vue.js 构建一个简易的任务管理器。这个项目不仅能够帮助我们更好地理解 Vue.js 的基本语法和功能࿰…...
国际机构Gartner发布2025年网络安全趋势
转自:中国新闻网 中新网北京3月14日电 国际机构高德纳(Gartner)14日发布的消息称,网络安全和风险管理在2025年“面临挑战与机遇并存的局面”,“实现转型和提高弹性”对确保企业在快速变化的数字世界中,实现安全且可持续的创新至关…...
【设计模式】单件模式
七、单件模式 单件(Singleton) 模式也称单例模式/单态模式,是一种创建型模式,用于创建只能产生 一个对象实例 的类。该模式比较特殊,其实现代码中没有用到设计模式中经常提起的抽象概念,而是使用了一种比较特殊的语法结构&#x…...
Elasticsearch + Docker:实现容器化部署指南
Elasticsearch是一款强大的分布式搜索和分析引擎,广泛应用于日志分析、全文检索、实时数据分析等场景。而Docker作为一种轻量级的容器化技术,能够帮助开发者快速部署和管理应用。将Elasticsearch与Docker结合,不仅可以简化部署流程࿰…...
win32汇编环境,网络编程入门之十一
;win32汇编环境,网络编程入门之十一 ;在上一教程里,我们学习了如何读取大容量的网页内容,在这一教程里,我们学习一下如何在wininet或winhttp机制中提取网页中的超链接 ;>>>>>>>>>>>>>>>>>…...
穿越之程序员周树人的狂人日记Part3__人机共生纪元
穿越之程序员周树人的狂人日记Part3__人机共生纪元 代码知识点:协程、内存管理、版本控制 故事一【协程陷阱】择偶标准的多核运算 故事二【内存泄漏】中产幻觉的垃圾回收 故事三【版本控制】人设仓库的强制推送 故事四【容器化生存】:员工生存之现状 静夜…...
后端——AOP异步日志
需求分析 在SpringBoot系统中,一般会对访问系统的请求做日志记录的需求,确保系统的安全维护以及查看接口的调用情况,可以使用AOP对controller层的接口进行增强,作日志记录。日志保存在数据库当中,为了避免影响接口的响…...
【C#语言】深入理解C#多线程编程:从基础到高性能实践
文章目录 ⭐前言⭐一、多线程的本质价值🌟1、现代计算需求🌟2、C#线程演进史 ⭐二、线程实现方案对比🌟1、传统线程模型🌟2、现代任务模型(推荐)🌟3、异步编程范式 ⭐三、线程安全深度解析&…...
第十四章:模板实例化_《C++ Templates》notes
模板实例化 核心知识点解析多选题设计题关键点总结 核心知识点解析 两阶段查找(Two-Phase Lookup) 原理: 模板在编译时分两个阶段处理: 第一阶段(定义时):检查模板语法和非依赖名称࿰…...
循环查询指定服务器开放端口(Python)
循环查询指定服务器开放端口列表 # Time : 2025/3/22 # Author : cookie # Desc :import socket import concurrent.futures from datetime import datetime# 设置目标IP和端口范围 target_ip input("请输入目标IP地址: ") start_port int(input("请输入…...
算法 | 蜣螂优化算法原理,引言,公式,算法改进综述,应用场景及matlab完整代码
蜣螂优化算法(Dung Beetle Optimizer, DBO)详解 1. 算法原理 蜣螂优化算法(DBO)是一种基于自然界蜣螂行为的元启发式优化算法,灵感来源于蜣螂的滚球、繁殖、觅食和偷窃行为。其核心思想是通过模拟蜣螂在复杂环境中的协作与竞争机制,解决全局优化问题。关键行为模拟: 滚球…...
排序复习_代码纯享
头文件 #pragma once #include<iostream> #include<vector> #include<utility> using std::vector; using std::cout; using std::cin; using std::endl; using std::swap;//插入排序 //1、直接插入排序(稳定) void InsertSort(vecto…...
【STM32】第一个工程的创建
目录 1、获取 KEIL5 安装包2、开始安装 KEIL52.1、 激活2.2、安装DFP库 3、工程创建4、搭建框架5、开始编写代码 1、获取 KEIL5 安装包 要想获得 KEIL5 的安装包,在百度里面搜索“KEIL5 下载”即可找到很多网友提供的下载文件,或者到 KEIL 的官网下载&a…...
SpringBoot+策略模式+枚举类,优雅消除if-else
需求分析 公司做物联网系统的,使用nettry进行设备连接,对设备进行数据采集,根据设备的协议对数据进行解析,解析完成之后存放数据库,但是不同厂家的设备协议不同。公司系统使用了使用了函数式编程的去写了一个解析类&am…...
