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 的时区会影响已经存储的时间类型数据…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...
车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...
