C语言自定义类型与文件操作
构造类型
枚举类型
若定义不相关的常量使用宏定义;若定义一组相关的常量使用枚举。switch中case后访问的就是枚举。
-
定义:
我们一般情况下定义常量使用宏定义(#define),宏定义适合没有关联关系的常量;但有时需要对一组有关联关系的量进行定义,例如:星期、月份、方向(上下左右中)等,若使用宏定义,可读性差,这时使用枚举。
-
说明
- 枚举类型定义了一组常量,我们在开发中直接使用这些常量。
- 枚举类型也可以类似结构体一样定义变量操作 (不常用)
- 枚举有默认值,从0开始依次+1;同时也可以指定它的默认值,后续的依次根据赋值+1
-
特点:
定义一组常量,类似于定义了多个自定义常量(宏定义)
提供了代码的可读性
-
语法
//定义枚举类型名以后可以定义该枚举类型的变量
enum 枚举类型名 变量列表;//定义枚举类型的同时定义该枚举类型的变量
enum 枚举类型名{枚举元素列表} 变量列表;//直接定义枚举变量
enum {枚举元素列表} 变量列表;enum Week
{//定义枚举元素SUN = 10,MON,TUE,WED,THU,FRI,SAT
};//访问枚举元素
printf("%d,%d,%d\n",SUN,WED,SAT);//定义枚举类型变量(先定义,后赋值)
enum Week week;
//初始化
week = TUE;//定义枚举变量同时赋值
enum Week week1 =THU;
typedef
-
说明:给类型重命名,不会影响类型本身
-
作用:给已有的类型起别名
-
格式:
//先定义结构体类型,再重命名 typedef 已有类型名 新别名; struct Student {int id;char name[20];char sex; };//类型重命名 typedef struct Student Stu;//定义结构体变量 struct Stu stu = {1,"张三",'M'};//定义结构体的同时重命名 typedef struct PersonInfo {int a;double b; } Per;//结构体的别名,本质上还是数据类型struct Per per = {1,5};
-
应用场景:
- 数据类型复杂(结构体、共用体、枚举、结构体指针、无符号长整形)时使用
- 为了跨平台兼容如:
- size_t:类型重命名后数据类型:
typedef unsigned long size_t
- unit_16:类型重名后数据类型
- size_t:类型重命名后数据类型:
文件操作
概述
-
什么是文件
文件是保存在外存储器(U盘,移动硬盘)的数据的集合。
-
文件操作体现在哪几个方面
- 文件内容的读取
- 文件内容的写入
数据的读取和写入可被视为针对文件进行输入(Input)和输出(Output)操作,此时数据像水流一样从外存储器流向内存。或者从内存流向外存储器,所以系统形象的称文件操作为文件流。
C语言程序对文件的操作采用"文件缓存机制"。就是说在程序对文件的数据读写并不是直接操作文件中的数据,而是系统会为文件在内存中创建"文件缓冲区",程序对文件的操作,其实是在缓冲区进行。
-
文件的分类
- 根据数据的存储方式划分
- 文本文件(ASCII文件)
- 二进制文件
- 根据数据的存储方式划分
-
文件的标识
- 文件系统中:路径+文件名 例如:
E:\YQ\code\Homework\20241217
- C语言程序中:文件指针(文件类型指针),语法:FILE* 指针变量名
- 文件系统中:路径+文件名 例如:
-
文件操作的步骤:
- 打开文件
- 文件处理(读写文件)
- 关闭文件
文件的操作
文件的打开与关闭
打开文件
打开文件,让系统为文件创建文件缓冲区
-
函数名:fopen()
-
头文件:
#inculde <stdio.h>
-
函数原型:
FILE* fopen(const char *path,const char *mode);
-
函数功能:打开文件,并为文件创建缓冲区
-
形参
-
path:目标文件的路径
-
mode:文件打开的方式(r-读、w-写、re-读写)
type 读写性 文本/进制文件 新建/打开 r 读 文本 打开文件 w 写 文本 新建文件 a 添加 文本 有就打开无则建新 r+ 读写 无限制 打开 w+ 读写 无限制 建新文件 a+ 读写添加 无限制 有就打开无则建新 -
-
返回值
- 成功:返回文件指针FILE*(缓冲区首地址)
- 失败:返回NULL
关闭文件
文件关闭,文件使用完毕,一定要释放内存
- 函数名:fclose()
- 头文件:
#inculde <stdio.h>
- 函数原型:
int fclose(FILE* fp);
- 函数功能:
- fp已经打开的文件指针
- 返回值
- 成功:返回0
- 失败:返回EOF(-1)
文件打开与关闭案例
#include <stdio.h>int main(int argc, char *argv[])
{// 在命令行执行./a.out的时候,传递一个需要打开的目录文件的地址if (argc < 2){printf("输入有误,请按照<%s文件路径>格式输入\n", argv[0]);return -1;}// 根据文件路径打开文件FILE *fp = fopen(argv[1], "r");// 校验文件是否读取成功if (!fp){perror("文件打开失败!");return -1;}puts("文件打开成功!\n");int ret = fclose(fp);if (ret == -1)perror("文件关闭失败");puts("文件关闭成功");return 0;
}
文件的顺序读写
单字符读取
- 函数名:fgetc
- 头文件:
#inculde <stdio.h>
- 函数原型:
int fgetc(FILE* fp);
- 函数功能:从fp代表的文件中获取一个字符
- 形参
- fp:我们操作的文件指针
- 返回值
- 成功:返回读取的字符
- 失败:或者文件末尾,返回EOF(-1)
方式一(ASCII码)
#include <stdio.h>int main(int argc, char *argv[])
{// 在命令行执行./a.out的时候,传递一个需要打开的目录文件的地址if (argc < 2){printf("输入有误,请按照<%s文件路径>格式输入\n", argv[0]);return -1;}// 根据文件路径打开文件FILE *fp = fopen(argv[1], "r");// 校验文件是否读取成功if (!fp){perror("文件打开失败!");return -1;}char re = 0;// 循环读取文件中所有字符while ((re = fgetc(fp)) != -1){printf("%c", re);}puts("文件打开成功!\n");int ret = fclose(fp);if (ret == -1)perror("文件关闭失败");puts("文件关闭成功");return 0;
}
方式二(ASCII值)
#include <stdio.h>int main(int argc, char *argv[])
{// 在命令行执行./a.out的时候,传递一个需要打开的目录文件的地址if (argc < 2){printf("输入有误,请按照<%s文件路径>格式输入\n", argv[0]);return -1;}// 根据文件路径打开文件FILE *fp = fopen(argv[1], "r");// 校验文件是否读取成功if (!fp){perror("文件打开失败!");return -1;}int re = 0;// 循环读取文件中所有字符while ((re = fgetc(fp)) != EOF){printf("%c", re);}puts("文件打开成功!\n");int ret = fclose(fp);if (ret == -1)perror("文件关闭失败");puts("文件关闭成功");return 0;
}
多字符读取
- 函数名:fgets()
- 头文件:
#inculde <stdio.h>
- 函数原型:
char *fgets(char *buf,int size,FILE *fp)
- 函数功能:从fp代表的文件中获取size个字符(size大小以字节为单位),放置在buf代表的内存中
- 形参
- buf:内存空间首地址用于存放读取的字节
- size:待读取的字符,实际读取size
- fp:已经打开文件指针
- 返回值
- 成功:返回buf
- 失败:或者文件末尾,返回NULL
案例:
#include <stdio.h>
#include <string.h>int main(int argc, char *argv[])
{// 在命令行执行./a.out的时候,传递一个需要打开的目录文件的地址if (argc < 2){printf("输入有误,请按照<%s文件路径>格式输入\n", argv[0]);return -1;}// 根据文件路径打开文件FILE *fp = fopen(argv[1], "r");// 校验文件是否读取成功if (!fp){perror("文件打开失败!");return -1;}char ch[64] = {0};// 循环读取文件中所有字符while (fgets(ch, 64, fp) != NULL){printf("%s", ch);memset(ch, 0, sizeof(ch));}puts("文件打开成功!\n");int ret = fclose(fp);if (ret == -1)perror("文件关闭失败");puts("文件关闭成功");return 0;
}
单字符写入
- 函数名:fputc();
- 头文件:
#inculde <stdio.h>
- 函数原型:
int fputc(int c,FILE* fp);
- 函数功能:想fp代表的文件中写入一个字符
- 形参
- int c:待写入的字符
- fp:已打开文件指针
- 返回值
- 成功:返回字符c
- 失败:返回EOF(-1)
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{// 在命令行执行./a.out的时候,传递一个需要打开的目录文件的地址if (argc < 3){printf("输入有误,请按照<%s 文件路径 文本数据>格式输入\n", argv[0]); // ./a.out./ demo01.c hello return -1;}// 根据提供的文件路径,打开文件(mode:r,w,rw)FILE *fp = fopen(argv[1], "w");// 校验文件是否读取成功if (!fp){perror("文件打开失败!\n");return -1;}puts("文件打开成功!");// 单字符写入// 借助循环,一个字符一个字符写入while (*argv[2] != '\0'){fputc(*argv[2], fp); //argv[2]++; // 指针偏移}// 关闭打开的文件int ret = fclose(fp);if (ret == -1){perror("文件关闭失败!");return -1;}puts("文件关闭成功!");return 0;
}
多字符写入
- 函数名:fputs();
- 头文件:
#inculde <stdio.h>
- 函数原型:
int fputs(const char* buf,FILE* fp);
- 函数功能:想fp代表的文件中写入多个字符
- 形参
- buf:待写入的字符数组
- fp:已打开文件指针
- 返回值
- 成功:返回非负整数>0
- 失败:返回EOF(-1)
/*** 多字符写入*/
#include <stdio.h>
int main(int argc, char **argv)
{if (argc < 3){printf("输入有误,请按照<%s 文件路径 文本数据>格式输入\n", argv[0]);return -1;}FILE *fp = fopen(argv[1], "w");if (!fp){perror("文件打开失败!");return -1;}// 单字符写入// ./a.out file1.txt I_Love_Yourfputs(argv[2], fp);fclose(fp);return 0;
}
文件拷贝
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{// 在命令行执行./a.out的时候,传递一个需要打开的目录文件的地址if (argc < 2){printf("输入有误,请按照<%s 被读文件路径 被写文件路径>格式输入\n", argv[0]); // ./a.out./ demo01.c return -1;}// 根据提供的文件路径,打开文件(mode:r,w,rw)FILE *fp_r = fopen(argv[1], "r");FILE *fp_w = fopen(argv[2], "w");// 校验文件是否读取成功if (!fp_r || !fp_w){perror("文件打开失败!\n");return -1;}puts("文件打开成功!");// 创建一个缓冲区(也就是每次读取字节的大小)char buf[64] = {0};// 循环读取文件中所有字符while (fgets(buf, 64, fp_r) != NULL){// 写入文件fputs(buf, fp_w);// 每读取一次,都需要清空缓冲区memset(buf, 0, sizeof(buf));}// 关闭打开的文件int ret1 = fclose(fp_r);int ret2 = fclose(fp_w);if (ret1 == -1 || ret2 == -1){perror("文件关闭失败!");return -1;}puts("文件关闭成功!");return 0;
}
判别文件结束
- 函数名:feof(fp)
- 头文件:
#inculde <stdio.h>
- 函数原型:
int feof(FILE* fp);
- 函数功能:在读fp指向的文件时判断是否遇到文件结束
- 形参
- fp:已打开的文件指针
- 返回值
- 文件未读取完毕:返回0
- 文件已读取完毕:返回非0
数据块的读写
数据块的读取(二进制)
-
函数名:fread
-
函数原型:
size_t fread(void *ptr,size_t size,size_t count,FILE *fp);
-
函数功能:从fp指向的文件中以字节为单位(一个数据块)读取count个数据块存放在内存中
-
形参
- ptr:内存空间首地址,用于存放读取的数据
- size:数据块大小,以字节为单位
- count:待读取的数据块的个数
- fp:已打开的文件指针
-
返回值
- 成功:返回实际读取的字节数大小
- 失败:读取完毕返回<0
#include <stdio.h> #define SIZE 2struct Student {char name[20];int num;int age;char address[50]; } stus[SIZE];/*保存学生信息到文件 */int save() {FILE *fp;int i;if ((fp = fopen("stu", "wb")) == NULL) // stu保存文件的名称{perror("文件打开失败!");return -1;}// 写入数据for (i = 0; i < SIZE; i++){fwrite(&stus[i], sizeof(struct Student), 1, fp);}// 关闭文件fclose(fp);return 0; }int main() {int i;printf("请输入学生的信息:姓名、学号、年龄、住址\n");for (i = 0; i < SIZE; i++){scanf("%s%d%d%s", stus[i].name, &stus[i].num, &stus[i].age, stus[i].address);// 保存文件}save();return 0; }
数据块的写入
- 函数名:fwrite
- 函数原型:
size_t fwrite(const void *ptr,size_t size,size_t count,FILE *fp);
- 函数功能:向fp指向的文件中以字节为单位(一个数据块)写入count个数据块到fp
- 形参
- ptr:内存空间首地址,用于存放写入的数据
- size:数据块大小,以字节为单位
- count:待写入的数据块的个数
- fp:已打开的文件指针
- 返回值
- 成功:返回实际写入的字节数大小
- 失败:写入完毕返回<0
#include <stdio.h>
#define SIZE 2 // 存放学生的个数
// 创建学生结构体
struct Student
{char name[20];int num;int age;char addr[50];
} stus[SIZE];
int main(int argc, char *argv[])
{int i;FILE *fp;if ((fp = fopen("stu", "rb")) == NULL) // rb 以二进制读取{perror("文件打开失败!");return -1;}// 循环读取二进制读取for (i = 0; i < SIZE; i++){fread(&stus[i], sizeof(struct Student), 1, fp);// 将读取的数据输出到控制台printf("%-10s%-4d%-4d%-20s\n", stus[i].name, stus[i].num, stus[i].age, stus[i].addr);}// 关闭文件fclose(fp);return 0;
}
文件的随机读写
说明:C语言允许在读写文件内容时,可在指定位置上读写数据
文件随机读写的核心操作:文件位置指针的定位
文件位置指针移动方法:
-
rewind
- 头文件:
#include <stdio.h>
- 函数原型:
void rewind(FILE *fp);
- 函数功能:将文件位置指针定位到文件开头
- 形参:
- fp:已经打开文件的指针
- 返回值:空类型
#include <stdio.h>/*有一个磁盘文件第一次将他内容通过控制台输出第二次将其复制到另一个文件 */int main() {// 创建两个指针,用来接收打开的文件FILE *fp1, *fp2;// 校验if (!fp1 && !fp2){perror("文件打开失败!");return -1;}puts("文件打开成功!\n");// 打开文件fp1 = fopen("1.txt", "r");fp2 = fopen("2.txt", "w");// 第一次,读取文件内容通过控制台打印while (!feof(fp1)) // feof函数检测文件是否读完{putchar(getc(fp1));}rewind(fp1);// 第二次,读取文件内容将其拷贝至2.txtwhile (!feof(fp1)){putc(getc(fp1), fp2);}fclose(fp1);fclose(fp2);return 0; }
- 头文件:
-
fseek
-
头文件:
#include <stdio.h>
-
函数原型:
int fseek(File *fp,long offset,int whence);
-
函数功能:将文件位置指针定位到指定位置
-
形参
-
fp:已打开的文件的指针
-
offset:相对参考位置的偏移量
-
whence:参考位置
-
SEEK_SET或0:表示文件头
-
SEEK_CUR或1:表示当前读写位置
-
SEEK_END或2:表示文件尾
-
-
-
返回值:
-
成功:0
-
失败:-1
-
#include <stdio.h> #include <stdlib.h>/*在磁盘文件上存储10个学生的数据要求1,3,5,7,9这五个学生信息输入计算机,并显示 */// 定义学生结构体 struct Student {char name[20];int id;char sex; };typedef struct Student Stu;Stu stus[3] = {0};int main() {FILE *fp = NULL;int len = sizeof(stus) / sizeof(stus[0]);printf("%d", len);// 写入数据if ((fp = fopen("stu", "wb")) == NULL) // stu保存文件的名称{perror("文件打开失败!");return -1;}printf("请输入学生的信息:姓名、学号、性别\n");for (int i = 0; i < len; i++){scanf("%s%d %c", stus[i].name, &stus[i].id, &stus[i].sex);}fwrite(stus, sizeof(Stu), len, fp);fclose(fp); // 关闭文件// 打开文件if ((fp = fopen("stu", "rb")) == NULL){perror("文件打开失败!");return -1;}for (int i = 0; i < len; i += 2){// 跳过文件位置,改变文件指针的指向fseek(fp, i * sizeof(Stu), 0);fread(&stus[i], sizeof(Stu), 1, fp);printf("%s %d %c\n", stus[i].name, stus[i].id, stus[i].sex);}fclose(fp);return 0; }
-
-
ftell
- 头文件
#include <stdio.h>
- 函数原型:
long ftell(FILE* fp);
- 函数功能:获取文件指针当前位置
- 形参
- fp:已打开文件的指针
- 返回值
- 成功:文件位置指针的当前位置
- 失败:-1
- 头文件
#include <stdio.h>
int main(int argc, char *argv[])
{long p;FILE *fp;if ((fp = fopen(argv[1], "a")) == NULL) // 此时的mode:a代表追加(a是append){perror("文件打开失败!");return -1;}// 获取当前位置p = ftell(fp);printf("p=%ld\n", p);// 向文件添加数据fputs("data", fp);p = ftell(fp);printf("p=%ld\n", p);fclose(fp);return 0;
}
相关文章:

C语言自定义类型与文件操作
构造类型 枚举类型 若定义不相关的常量使用宏定义;若定义一组相关的常量使用枚举。switch中case后访问的就是枚举。 定义: 我们一般情况下定义常量使用宏定义(#define),宏定义适合没有关联关系的常量;但有时需要对一组有关联关系…...

《计算机网络A》单选题-复习题库解析-3
目录 106、MAN通常是指( ) 107、下列因素中,不会影响信道数据传输速率的是( ) 108、以太网交换机进行转发决策时使用的PDU地址是( ) 109、下列机制中,可以解决因数据帧丢失而…...

VM虚拟机配置ubuntu网络
目录 桥接模式 NAT模式 桥接模式 特点:ubuntu的IP地址与主机IP的ip地址不同 第一部分:VM虚拟机给ubuntu的网络适配器,调为桥接模式 第二部分:保证所桥接的网络可以上网 第三部分:ubuntu使用DHCP(默认&…...

【每日学点鸿蒙知识】Web高度适配、变量声明规范、动画取消、签名文件、包体积优化相关
1、HarmonyOS Web页面高度适配? 在Web页面设置高度100%时,发现和Web控件的高度不一致,这个需要设置什么可以达到页面高度和Web容器高度一致 目前只支持两种web布局模式,分别为Web布局跟随系统WebLayoutMode.NONE和Web基于页面大…...

uniapp使用ucharts组件
1.ucharts准备 有两种使用方式:一种是在uni的插件市场下载(组件化开发)。一种是手动引入ucharts包。官方都封装好组件了,我们不用岂不是浪费。 直接去dcloud插件市场(DCloud 插件市场)找,第一…...

LabVIEW工程师的未来发展
对于LabVIEW工程师以及更广义的编程从业者(包括“高级民工”码农)来说,随着AI技术和软件编程的逐步成熟,确实面临一些新的挑战和机遇。以下是对此问题的深入分析和未来方向的建议: 现状分析:技术过剩与竞争…...

java的bio、nio、aio 以及操作系统的select、poll、epoll
在 Java 和其他编程语言中,I/O 模型的选择对网络应用的性能和可扩展性有着重要影响。以下是 BIO(Blocking I/O)、NIO(Non-blocking I/O)、AIO(Asynchronous I/O),以及操作系统级别的…...

2024 年发布的 Android AI 手机都有什么功能?
大家好,我是拭心。 2024 年是 AI 快速发展的一年,这一年 AI 再获诺贝尔奖,微软/苹果/谷歌等巨头纷纷拥抱 AI,多款强大的 AI 手机进入我们的生活。 今年全球 16% 的智能手机出货量为 AI 手机,到 2028 年,这…...

RLHF,LM模型
LLM(Large Language Model) RLHF(Reinforcement Learning from Human Feedback),即以强化学习方式依据人类反馈优化语言模型。 RLHF思想:使用强化学习的方式直接优化带有人类反馈的语言模型。RLHF使得在一般文本数据语料库上训练的语言模型能与复杂的人类价值观对齐。 R…...

【机器学习】工业 4.0 下机器学习如何驱动智能制造升级
我的个人主页 我的领域:人工智能篇,希望能帮助到大家!!!👍点赞 收藏❤ 随着科技的飞速发展,工业 4.0 浪潮正席卷全球制造业,而机器学习作为这一变革中的关键技术,正以前…...

REST与RPC的对比:从性能到扩展性的全面分析
在微服务架构中,服务间通信是核心问题之一。常见的两种通信方式是REST(Representational State Transfer)和RPC(Remote Procedure Call)。它们各有优缺点,适用于不同场景。本文将从性能、扩展性、兼容性和开…...

MATLAB中将MAT文件转换为Excel文件
MATLAB中将MAT文件转换为Excel文件 MATLAB提供了多种方法将MAT文件中的数据导出到Excel文件中。下面介绍几种常用的方法: 1. 使用 writetable 函数 优点: 功能强大,可以灵活控制输出格式。用法: data load(your_data.mat); …...

leetcode hot 100 跳跃游戏2
45. 跳跃游戏 II 已解答 中等 相关标签 相关企业 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处: 0 < j…...

【Cesium】八、Cesium 默认地图不显示,不加载默认Bing地图
文章目录 前言实现方法App.vue 前言 Cesium 默认加载的地图是bing地图,个人认为请求bing地图会收到网络限制,导致地图资源下载很慢,所以设置默认不加载bing地图(后续我使用的是天地图) 参考文章: cesium …...

【新方法】通过清华镜像源加速 PyTorch GPU 2.5安装及 CUDA 版本选择指南
下面详细介绍所提到的两条命令,它们的作用及如何在你的 Python 环境中加速 PyTorch 等库的安装。 1. 设置清华镜像源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple这条命令的作用是将 pip (Python 的包管理工具…...

MySQL的sql操作有哪些
MySQL 的 SQL 操作可以分为几个主要类别,每个类别包含了一系列的语句,用于执行不同的数据库操作: 数据查询语言(DQL) SELECT:用于从一个或多个表中检索数据。可以使用 WHERE 子句进行条件筛选,…...

ArcGIS计算矢量要素集中每一个面的遥感影像平均值、最大值等统计指标
本文介绍在ArcMap软件中,基于矢量面要素集,计算在其中每一个面区域内,遥感影像的像元个数、平均值、总和等统计值,并将统计信息附加到矢量图层的属性表中的方法。 首先,明确一下本文的需求。现在有一个矢量面要素集&am…...

EasyExcel(环境搭建以及常用写入操作)
文章目录 EasyExcel环境搭建1.创建模块 easyexcel-demo2.引入依赖3.启动类创建 EasyExcel写1.最简单的写入1.模板2.方法3.结果 Write01.xlsx 2.指定字段不写入Excel1.模板2.方法3.结果 Write02.xlsx 3.指定字段写入excel1.模板2.方法3.结果 Write03.xlsx 4.按照index顺序写入ex…...

探索Milvus数据库:新手入门指南(tencent云)
开启向量数据库的奇妙之旅 在数据科学和机器学习领域,Milvus是一个专为向量数据设计的开源数据库。它以其高性能和易于使用的特点,成为了处理大规模向量搜索任务的理想选择。如果你是Milvus的新手,这篇文章将带你一步步了解如何开始你的Milv…...

MySQL:一文弄懂时区time_zone
你还在被以下问题困扰吗: MySQL 的安装规范中应该设置什么时区? JAVA 应用读取到的时间和北京时间差了 14 个小时,为什么?怎么解决? 已经运行一段时间的业务,修改 MySQL 的时区会影响已经存储的时间类型数据…...

基于python的天气可视化系统
目 录 1绪论 1.1研究背景 1.2研究意义 1.3当前研究现状 1.4研究内容 第2章 相关基础理论 2.1 爬虫技术基础 2.2 Python 在爬虫中的应用 2.3 爬虫系统的设计要点 第3章 天气网数据可视化系统设计 3.1 系统概述及主要内容 3.1.1 系统架构 3.1.2 工具选择…...

STM32 高级 WIFi案例1:测试AT指令
需求描述 测试AT指令是否能够正常控制ESP32的wifi,比如重启、读取设备信息等。 思路: stm32通过串口usart2向ESP32发布命令。ESP32通过串口1返回信息。 配置: 第一步:对ESP32芯片烧录可以读取stm32命令的固件(fac…...

SpringCloud微服务架构
文章目录 认识微服务:SpringCloud 服务拆分及远程调用实现夸远程服务调用使用RestTemplateEureka注册中心 搭建EruekaServer注册服务服务发现 Ribbon负载均衡 修改负载均衡规则解饿加载 Nacos注册中心(nacos一部分功能) 服务注册到nacosnacos…...

WebSocket封装
提示:记录工作中遇到的需求及解决办法 文章目录 前言二、背景三、WebSocket3.1 什么是 WebSocket ?为什么使用他?四、封装 WebSocket4.1 Javascript 版本4.2 Typescript 版本4.3 如何使用?五、我的痛点如何处理前言 本文将介绍 WebSocket 的封装,比如:心跳机制,重连和一…...

基于Flask后端框架的均值填充
Flask可以在Jupyter上运行,首先需要安装这两个库: !pip install Flask-CORS !pip install Flask 引入依赖: from flask import Flask, request, jsonify, send_file import os import pandas as pd import io from flask import Flask fr…...

SQL-Server链接服务器访问Oracle数据
SQL Server 链接服务器访问 Oracle 离线安装 .NET Framework 3.5 方法一:使用 NetFx3.cab 文件 下载 NetFx3.cab 文件,并将其放置在 Windows 10 系统盘的 C:Windows 文件夹中。 以管理员身份运行命令提示符,输入以下命令并回车: …...

Python中continue语句的使用
1 问题 本文将对在循环中continue语句的用途和如何正确使用continue进行分析与总结。 2 方法 (1)定义: 在编程中,“continue”是一个关键字,用于循环结构中。它的作用是跳过当前循环的剩余部分,立即进入下一…...

JavaScript的diff库详解(示例:vue项目实现两段字符串比对标黄功能)
diff库介绍 diff 库是基于 Myers 差分算法 实现的 JavaScript 文本差异库。 Myers 差分算法 是由 Eugene Myers 在 1986 年发表的一篇经典算法论文 “An O(ND) Difference Algorithm and its Variations” 中描述的一种高效算法,用于计算两个序列(通常是…...

自动驾驶3D目标检测综述(六)
停更了好久终于回来了(其实是因为博主去备考期末了hh) 这一篇接着(五)的第七章开始讲述第八章的内容。第八章主要介绍的是三维目标检测的高效标签。 目录 第八章 三维目标检测高效标签 一、域适应 (一)…...

the request was rejected because no multipart boundary was found
文章目录 1. 需求描述2. 报错信息3. 探索过程 1. 使用postman 排除后端错误2. 搜索网上的解决方法3. 解决方法 1. 需求描述 想要在前端上传一个PDF 发票,经过后端解析PDF之后,将想要的值自动回填到对应的输入框中 2. 报错信息 org.apache.tomcat.u…...