C语言学习之文件操作
经过前面的学习,我们已经基本掌握了如何去写一个C语言的代码了。但是在实际的项目中,我们不可能不需要文件去操作。因为如果没有文件,我们写的程序是存储在电脑的内存中的。如果程序推出,内存回收数据就随之丢失了。如果我们要对数据进行永久性的保存,我们就需要使用文件。
接下来我们就文件的操作进行学习
目录
什么是文件
程序文件
数据文件
文件名
二进制文件和文本文件
科普:绝对路径和相对路径:
1. 绝对路径
2. 相对路径
3. 关键区别对比
4. 实际编程注意事项
5. 示例场景
文件的打开与关闭
流和标准流
流
标准流
文件指针
文件的打开与关闭
文件的顺序读写
对比两组函数scanf/fscanf/sscanf和printf/fprintf/sprintf
对比表格
1. 功能与数据流方向
3. 安全性问题
2. 参数差异
4. 典型应用场景
5.典型应用场景
文件的随机读写
fseek函数
ftell函数
rewind函数
文件读取结束的判定
错误使用的feof
文件缓冲区
什么是文件
文件是磁盘(磁盘)的文件
但是在程序设计上,我们一般谈及的文件分为两种:程序文件、数据文件(文件功能角度来区分)。
程序文件
程序文件包括程序文件(后缀为.c),目标文件(Windows环境下后缀为.obj),可执行程序(Windows环境下后缀为.exe)
数据文件
文件内容不一定是程序,而是程序运行时读写的数据,如程序运行时需要从中读取数据的文件,或者输出内容的文件
本篇中讨论的是数据⽂件。
在之前的学习中所处理数据的输⼊输出都是以终端为对象的,即从终端的键盘输⼊数据,运⾏结果显⽰到显⽰器上。其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使⽤,这⾥处理的就是磁盘上⽂件。
文件名
一个文件要有唯一的标识,以便于用户识别和引用
文件名包含三部分:文件路径+文件名主干+文件后缀
如:D:\VS2022\c-language-practice\test.c
为了方便起见,文件标识就是文件名
二进制文件和文本文件
根据数据的组织形式,数据⽂件被称为⽂本⽂件和⼆进制⽂件。
数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的⽂件中,就是⼆进制⽂件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂本⽂件。
⼀个数据在⽂件中是怎么存储的呢?
字符⼀律以ASCII形式存储,数值型数据既可以⽤ASCII形式存储,也可以使⽤⼆进制形式存储。如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占⽤5个字节(每个字符⼀个字节),⽽⼆进制形式输出,则在磁盘上只占4个字节。
测试代码:
#include<stdio.h>
int main()
{int a = 100;FILE* fp = fopen("test.txt", "wb");fwrite(&a,4,1,fp);//二进制写入文件中fclose(fp);fp = NULL;return 0;
}
运行之后是这个样子,也就是什么都没有
通过这里打开可以发现
生成了一个txt的文本文件
这个文件在VS内是无法打开的
但是我们可以在VS中打开它(虽然实际意义不是很大)
显示结果为:
科普:绝对路径和相对路径:
1. 绝对路径
定义
从根目录开始的完整路径,明确指向文件或目录的位置。
-
Windows示例:
C:\\Users\\Name\\Documents\\file.txt
-
Linux/macOS示例:
/home/name/Documents/file.txt
特点
FILE* fp = fopen("data/input.csv", "r"); // 当前目录下的data子目录
// 或
FILE* fp = fopen("../logs/error.log", "w"); // 上级目录的logs子目录
2. 相对路径
定义
相对于程序当前工作目录的路径,不包含根目录。
-
示例:
-
data/file.txt
:当前目录下的data
子目录中的文件。 -
../config/settings.ini
:上级目录的config
子目录中的文件。
-
特点
-
灵活性:路径随程序的工作目录变化而变化。
-
简洁性:路径较短,便于维护。
-
符号说明:
-
.
:当前目录(可省略)。 -
..
:上级目录。
-
C语言中的使用
FILE* fp = fopen("data/input.csv", "r"); // 当前目录下的data子目录
// 或
FILE* fp = fopen("../logs/error.log", "w"); // 上级目录的logs子目录
适用场景
-
项目内部资源文件(如配置文件、数据文件)。
-
需要跨平台移植的代码。
缺点
-
依赖工作目录:若程序运行时工作目录改变,路径可能失效。
-
调试困难:路径错误可能导致文件找不到,需检查当前目录。
3. 关键区别对比
对比项 | 绝对路径 | 相对路径 |
---|---|---|
路径起点 | 根目录(如 C:\\ 或 / ) | 程序当前工作目录 |
唯一性 | 唯一确定文件位置 | 随工作目录变化 |
可移植性 | 低(依赖系统目录结构) | 高(路径与项目结构相关) |
典型使用场景 | 系统级文件访问(如日志、全局配置) | 项目内部资源访问(如数据文件、模块配置) |
路径长度 | 长 | 短 |
安全性 | 可能暴露敏感路径 | 更安全(隐藏具体系统路径) |
4. 实际编程注意事项
(1) 路径分隔符
-
Windows:默认使用反斜杠
\
,但在C字符串中需转义为\\
,或统一使用正斜杠/
(兼容)。 -
Linux/macOS:使用正斜杠
/
。 -
跨平台写法:
// 统一使用正斜杠 FILE* fp = fopen("data/files/image.png", "rb");
(2) 获取当前工作目录
-
C标准库函数:
getcwd
(需包含<unistd.h>
或<direct.h>
)。#include <unistd.h> char cwd[256]; getcwd(cwd, sizeof(cwd)); // 获取当前工作目录 printf("当前目录:%s\n", cwd);
(3) 路径拼接
-
手动拼接(不推荐):
char path[256]; snprintf(path, sizeof(path), "%s/%s", base_dir, filename);
-
使用库函数(推荐):
-
C17引入的
std::filesystem
(C++),但C语言需依赖平台API(如Windows的PathCombine
)。
-
(4) 错误处理
-
检查文件是否成功打开:
FILE* fp = fopen("data.txt", "r");
if (fp == NULL) {perror("文件打开失败"); // 输出:文件打开失败: No such file or directoryreturn 1;
}
5. 示例场景
场景1:读取项目内的配置文件
-
相对路径:
config/settings.ini
FILE* fp = fopen("config/settings.ini", "r");
场景2:写入系统日志文件
-
绝对路径(Linux):
FILE* fp = fopen("/var/log/myapp/error.log", "a");
总结
-
绝对路径:精准但不可移植,适合访问系统级固定文件。
-
相对路径:灵活且可移植,适合项目内部资源管理。
-
编程建议:优先使用相对路径,结合环境变量或配置文件动态设置路径,提升代码可维护性和跨平台能力。
文件的打开与关闭
流和标准流
流
我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。
C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的。
⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后操作。
标准流
那为什么我们从键盘输⼊数据,向屏幕上输出数据,并没有打开流呢?那是因为C语⾔程序在启动的时候,默认打开了3个流:
• stdin - 标准输⼊流,在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。
• stdout - 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出流中。
• stderr - 标准错误流,⼤多数环境中输出到显⽰器界⾯。
这是默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进⾏输⼊输出操作的。stdin、stdout、stderr 三个流的类型是: FILE * ,通常称为⽂件指针。
C语⾔中,就是通过 FILE* 的⽂件指针来维护流的各种操作的。
那么什么是文件指针呢,接下来我们来学习以下
文件指针
缓冲⽂件系统中,关键的概念是“⽂件类型指针”,简称“⽂件指针”。
每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名字,⽂件状态及⽂件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名 FILE.
不同C编译器的FILE类型包含的内容不完全相同,但是大同小异
每当打开⼀个⽂件的时候,系统会根据⽂件的情况⾃动创建⼀个FILE结构的变量,并填充其中的信息,使⽤者不必关⼼细节。
⼀般都是通过⼀个FILE的指针来维护这个FILE结构的变量,这样使⽤起来更加⽅便。
下⾯我们可以创建⼀个FILE*的指针变量
FILE *pf;//文件指针变量
定义pf是⼀个指向FILE类型数据的指针变量。可以使pf指向某个⽂件的⽂件信息区(是⼀个结构体变量)。通过该⽂件信息区中的信息就能够访问该⽂件。也就是说,通过⽂件指针变量能够间接找到与它关联的⽂件。
⽐如:
文件的打开与关闭
⽂件在读写之前应该先打开⽂件,在使⽤结束之后应该关闭⽂件。
在编写程序的时候,在打开⽂件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建⽴了指针和⽂件的关系。
ANSI C 规定使⽤ fopen 函数来打开⽂件, fclose函数 来关闭⽂件。
//打开文件
FILE*fopen(const char *filename,const char*mode);
//关闭文件
FILE*fclose(FILE*stream);
mode表示文件打开模式,下面的是所有的文件打开模式
文件打开模式 | 含义 | 文件不存在时的行为 |
---|---|---|
"r" | 只读模式打开文本文件 | 返回NULL ,打开失败 |
"rb" | 只读模式打开二进制文件 | 返回NULL ,打开失败 |
"w" | 写入模式打开文本文件,清空文件内容(若存在) | 创建新文件 |
"wb" | 写入模式打开二进制文件,清空文件内容(若存在) | 创建新文件 |
"a" | 追加模式打开文本文件,写入从文件末尾开始 | 创建新文件 |
"ab" | 追加模式打开二进制文件,写入从文件末尾开始 | 创建新文件 |
"r+" | 读写模式打开文本文件(文件必须存在) | 返回NULL ,打开失败 |
"rb+" / "r+b" | 读写模式打开二进制文件(文件必须存在) | 返回NULL ,打开失败 |
"w+" | 读写模式打开文本文件,清空文件内容(若存在) | 创建新文件 |
"wb+" / "w+b" | 读写模式打开二进制文件,清空文件内容(若存在) | 创建新文件 |
"a+" | 读写模式打开文本文件,写入从文件末尾开始,读取从头开始 | 创建新文件 |
"ab+" / "a+b" | 读写模式打开二进制文件,写入从文件末尾开始,读取从头开始 | 创建新文件 |
"wx" (C11) | 独占写入模式打开文本文件(若文件存在则失败) | 创建新文件(若存在则失败,返回NULL ) |
"wbx" (C11) | 独占写入模式打开二进制文件(若文件存在则失败) | 创建新文件(若存在则失败,返回NULL ) |
举例说明:
#include<stdio.h>
int main()
{//fopen()函数用于打开文件,返回一个FILE*指针// 如果成功打开文件,则返回文件信息区的指针// 如果打开失败,则返回NULL。FILE* fp=fopen("D:\\VS2022\\c-language-practice\\文件操作学习\\test.txt","r");if(fp==NULL){perror("fopen");return 1;}else{printf("文件打开成功\n");}return 0;
}
文件的顺序读写
顺序读写函数的介绍
函数名 | 功能 | 适用场景 |
---|---|---|
fgetc | 从文件流中读取一个字符 | 逐个字符读取文本文件(如解析配置文件、简单文本处理) |
fputc | 向文件流中写入一个字符 | 逐个字符写入文本文件(如生成日志、构建文本内容) |
fgets | 从文件流中读取一行或指定长度的字符串(包含换行符,自动添加\0 ) | 按行读取文本文件(如读取CSV、配置文件) |
fputs | 向文件流中写入一个字符串(不自动添加换行符) | 写入字符串到文本文件(如保存用户输入、导出数据) |
fscanf | 从文件流中按格式读取数据(类比 scanf ) | 读取结构化文本数据(如读取"Name: %s, Age: %d" 格式的记录) |
fprintf | 向文件流中按格式写入数据(类比 printf ) | 写入结构化文本数据(如生成格式化日志、保存表格数据) |
fread | 从文件流中读取二进制数据块(按字节数和项数) | 读取二进制结构体或数组(如加载图片、音视频文件或程序状态快照) |
fwrite | 向文件流中写入二进制数据块(按字节数和项数) | 写入二进制结构体或数组(如保存游戏进度、序列化数据) |
getc | 与 fgetc 功能相同,但可能通过宏实现(性能略高) | 同 fgetc ,常用于高频字符读取场景 |
putc | 与 fputc 功能相同,但可能通过宏实现(性能略高) | 同 fputc ,常用于高频字符写入场景 |
ungetc | 将字符退回输入流,使下次读取可重新获取该字符 | 解析需要“向前看”的场景(如词法分析器中回退字符) |
上⾯说的适⽤于所有输⼊流⼀般指适⽤于标准输⼊流和其他输⼊流(如⽂件输⼊流);所有输出流⼀般指适⽤于标准输出流和其他输出流(如⽂件输出流)。
关键说明
-
文本模式 vs 二进制模式:
-
文本模式函数(
fgetc
、fputs
等)会自动处理换行符转换(如Windows的\r\n
↔\n
)。 -
二进制模式函数(
fread
、fwrite
)直接操作原始字节,无格式转换。
-
-
顺序读写特性:
-
所有函数按文件指针顺序操作,每次读写后指针自动后移。
-
与随机访问函数(
fseek
、ftell
)互补,不可混用。
-
-
典型应用场景:
-
文本处理:
fgets
+fputs
(逐行读写),fscanf
+fprintf
(格式化数据)。 -
二进制处理:
fread
+fwrite
(结构体/数组持久化)。 -
低层操作:
fgetc
+fputc
(自定义解析或生成。
-
举例说明:写入一个字符
fputc函数的结构:
#include<stdio.h>
int main()
{FILE* fp=fopen("test.txt","w");if(fp==NULL){perror("fopen");return 1;}//写文件fputc('a', fp);fputc('b', fp);fputc('c', fp);fputc('d', fp);fputc('e', fp);fputc('f', fp);fputc('g', fp);fputc('h', fp);fputc('i', fp);fputc('j', fp);fputc('k', fp);//关闭文件fclose(fp);fp = NULL;return 0;
}
代码为0 ,代表运行成功
成果展示:
读字符
#include<stdio.h>
int main()
{FILE* fp=fopen("test.txt","r");if(fp==NULL){perror("fopen");return 1;}//写文件fputc('a', fp);fputc('b', fp);fputc('c', fp);fputc('d', fp);fputc('e', fp);fputc('f', fp);fputc('g', fp);fputc('h', fp);fputc('i', fp);fputc('j', fp);fputc('k', fp);//读文件int ch;while((ch=fgetc(fp))!=EOF){printf("%c ", ch);}//关闭文件fclose(fp);fp = NULL;return 0;
}
对比两组函数scanf/fscanf/sscanf和printf/fprintf/sprintf
对比表格
对比项 | scanf 系列 (scanf /fscanf /sscanf ) | printf 系列 (printf /fprintf /sprintf ) |
---|---|---|
核心功能 | 从输入源按格式解析数据并存储到变量。 | 将数据按格式格式化输出到目标输出源。 |
函数分类 | scanf :标准输入(键盘)fscanf :文件流sscanf :字符串 | printf :标准输出(屏幕)fprintf :文件流sprintf :字符串 |
参数顺序 | scanf(format, &var1, &var2...) fscanf(stream, format, &var...) | printf(format, val1, val2...) fprintf(stream, format, val...) |
输入/输出源 | 输入源:键盘(stdin )、文件、字符串 | 输出目标:屏幕(stdout )、文件、字符串 |
返回值 | 返回成功解析的项数(失败返回EOF ) | 返回成功输出的字符数(失败返回负值) |
安全性风险 | 缓冲区溢出(如%s 无长度限制) | sprintf 存在缓冲区溢出风险,建议用snprintf |
典型应用场景 | 读取用户输入、解析文件数据、提取字符串中的结构化信息 | 打印日志、生成格式化字符串、写入文件数据 |
详细对比说明
1. 功能与数据流方向
3. 安全性问题
-
scanf
系列:-
从输入源(键盘、文件、字符串)读取数据,按格式解析后存入变量。
-
-
示例:
int age; char name[32]; sscanf("Name: Alice, Age: 25", "Name: %s, Age: %d", name, &age);
printf
系列: -
将数据按格式转换为字符串,输出到目标(屏幕、文件、字符串)。
-
示例:
char buffer[100]; sprintf(buffer, "Result: %d", 42); // 输出到字符串
2. 参数差异
-
scanf
系列:-
scanf
:直接从stdin
读取,无需指定输入源。 -
fscanf
:需传入文件指针(如FILE* fp
)。 -
sscanf
:需传入源字符串。 -
变量参数:必须传递变量的地址(如
&num
)。
-
-
printf
系列:-
printf
:直接输出到stdout
。 -
fprintf
:需传入文件指针。 -
sprintf
:需传入目标字符数组。 -
变量参数:直接传递变量值(非指针)。
-
-
scanf
系列:-
%s
和%[
格式符可能导致缓冲区溢出。 -
改进方法:指定最大宽度(如
%31s
限制长度为31字符)。
-
-
printf
系列:-
sprintf
可能因目标缓冲区过小导致溢出。 -
改进方法:使用
snprintf
限制写入长度。
-
char buf[10];
snprintf(buf, sizeof(buf), "%s", "Too long string"); // 安全截断
4. 典型应用场景
函数 | 应用场景 |
---|---|
scanf | 交互式程序读取用户输入(需配合输入验证) |
fscanf | 读取配置文件、日志文件等结构化文本文件 |
sscanf | 解析字符串中的数字或字段(如解析HTTP响应头) |
printf | 输出调试信息、程序运行结果到控制台 |
fprintf | 写入日志文件、生成报告文件 |
sprintf | 动态生成格式化字符串(需注意缓冲区大小,优先用 snprintf ) |
5.典型应用场景
输入函数组
// 从键盘读取输入
int num;
scanf("%d", &num); // 从文件读取
FILE* fp = fopen("data.txt", "r");
fscanf(fp, "Value: %d", &num);// 从字符串解析
char str[] = "2023-10-01";
int year, month, day;
sscanf(str, "%d-%d-%d", &year, &month, &day);
输出字符组
// 输出到屏幕
printf("Result: %d\n", 42);// 输出到文件
FILE* fp = fopen("log.txt", "w");
fprintf(fp, "Error: %s\n", "File not found");// 输出到字符串
char buffer[64];
sprintf(buffer, "Date: %04d-%02d-%02d", year, month, day);
文件的随机读写
fseek函数
根据文件指针的位置和偏移量来定位文件的指针(文件内容的光标)
int fseek(FILE*stream,long int offset,int origin);
例子:
#include<stdio.h>
int main()
{FILE* pfile;pfile = fopen("test.txt", "wb");fputs("Hello, world!", pfile);fseek(pfile,9,SEEK_SET);fputs(" IM THE WORLD", pfile);fclose(pfile);return 0;
}
结果:
ftell函数
返回文件指针相对起始位置的偏移量
#include<stdio.h>
int main()
{FILE* pfile;long size;pfile = fopen("test.txt", "rb");if (pfile == NULL){perror("打开失败");return 1;}else{fseek(pfile, 0, SEEK_END);size=ftell(pfile);fclose(pfile);printf("文件大小为:%ld\n", size);}return 0;
}
rewind函数
让文件指针回到文件的起始位置
void rewind (FILE*stream);
#include<stdio.h>
int main()
{int n;FILE* pfile;char str[27];pfile = fopen("test.txt", "w+");for (n='A';n<= 'Z';n++){fputc(n,pfile);}rewind(pfile);fread(str, 1, 26, pfile);fclose(pfile);str[26] = '\0';printf("%s\n", str);return 0;
}
结果为:
文件读取结束的判定
错误使用的feof
牢记:在⽂件读取过程中,不能⽤ feof 函数的返回值直接来判断⽂件的是否结束。feof 的作⽤是:当⽂件读取结束的时候,判断读取结束的原因是否是:遇到⽂件尾结束。
1. ⽂本⽂件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )例如:• fgetc 判断是否为 EOF .• fgets 判断返回值是否为 NULL .
2. ⼆进制⽂件的读取结束判断,判断返回值是否⼩于实际要读的个数。例如:• fread判断返回值是否⼩于实际要读的个数。
文本文件的例子:
#include<stdio.h>
#include<stdlib.h>
int main()
{int c;//要处理EOF,必须为int型变量FILE* pfile=fopen("test.txt", "r");if (!pfile){perror("打开失败");return 1;}//输入失败的时候会返回EOFwhile ((c = fgetc(pfile)) != EOF){putchar(c);}//判断原因if (ferror(pfile)){puts("读取失败");}else if(feof(pfile)){puts("文件结束");}fclose(pfile);return 0;
}
二进制文件的例子:
#include<stdio.h>
enum {SIZE=5};
int main()
{double a[SIZE] = {1.1, 2.2, 3.3, 4.4, 5.5};FILE* pfile = fopen("test.txt", "wb");//以二进制方式打开文件fwrite(a, sizeof(double), SIZE, pfile);//将数组a写入文件fclose(pfile);//关闭文件double b[SIZE];pfile =fopen("test.txt", "rb");//以二进制方式打开文件size_t ret_code = fread(b, sizeof(double), SIZE, pfile);//从文件中读取数组bif (ret_code==SIZE){puts("数组读取内容为:");for (int n = 0;n < SIZE;n++){printf("%.2f ",b[n]);}putchar('\n');}else{if (feof(pfile)){puts("文件读取结束");}else if (ferror(pfile)){puts("文件读取失败");}}fclose(pfile);//关闭文件return 0;
}
文件缓冲区
ANSI C 标准采⽤“缓冲⽂件系统” 处理数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的⼤⼩根据C编译系统决定的。
这⾥可以得出⼀个结论:因为有缓冲区的存在,C语⾔在操作⽂件的时候,需要做刷新缓冲区或者在⽂件操作结束的时候关闭⽂件。如果不做,可能导致读写⽂件的问题。
以上就是本期C语言的内容了,希望各位读者朋友点个赞,谢谢
相关文章:
C语言学习之文件操作
经过前面的学习,我们已经基本掌握了如何去写一个C语言的代码了。但是在实际的项目中,我们不可能不需要文件去操作。因为如果没有文件,我们写的程序是存储在电脑的内存中的。如果程序推出,内存回收数据就随之丢失了。如果我们要对数…...
《AI大模型应知应会100篇》第63篇:AutoGPT 与 BabyAGI:自主代理框架探索
第63篇:AutoGPT 与 BabyAGI:自主代理框架探索 摘要 随着大语言模型(LLM)技术的不断演进,自主代理(Autonomous Agent) 正在成为 AI 应用的新范式。它不仅能够理解用户意图,还能自主规…...
使用大模型预测急性结石性疾病技术方案
目录 1. 数据预处理与特征工程伪代码 - 数据清洗与特征处理数据预处理流程图2. 大模型构建与训练伪代码 - 模型训练模型训练流程图3. 术前预测系统伪代码 - 术前风险评估术前预测流程图4. 术中实时调整系统伪代码 - 术中风险预警术中调整流程图5. 术后护理系统伪代码 - 并发症预…...
基于运动补偿的前景检测算法
这段代码实现了基于运动补偿的前景检测算法。 主要功能包括: 运动补偿模块:使用基于网格的 KLT 特征跟踪算法计算两帧之间的运动,然后通过单应性变换实现帧间运动补偿。前景检测模块:结合两帧运动补偿结果,通过帧间差…...
鸿蒙OSUniApp开发富文本编辑器组件#三方框架 #Uniapp
使用UniApp开发富文本编辑器组件 富文本编辑在各类应用中非常常见,无论是内容创作平台还是社交软件,都需要提供良好的富文本编辑体验。本文记录了我使用UniApp开发一个跨平台富文本编辑器组件的过程,希望对有类似需求的开发者有所启发。 背景…...
W5500使用SocketTool工具测试
W5500使用SocketTool工具测试 1、按“WINR” 2、输入“IPCONFIG”,得到计算机的IP地址,子网掩码和网关 3、设置W5500设备网络参数如下: 本地网关:192.168.1.1 本地子网掩码: 255.255.255.0 本地物理地址:0C 2…...
《Python星球日记》 第71天:命名实体识别(NER)与关系抽取
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、命名实体识别(NER)基础1. 什么是命名实体识别&#…...
双向长短期记忆网络-BiLSTM
5月14日复盘 二、BiLSTM 1. 概述 双向长短期记忆网络(Bi-directional Long Short-Term Memory,BiLSTM)是一种扩展自长短期记忆网络(LSTM)的结构,旨在解决传统 LSTM 模型只能考虑到过去信息的问题。BiLST…...
CentOS7原有磁盘扩容实战记录(LVM非LVM)【针对GPT分区】
一、环境 二、命令及含义 fdisk fdisk是一个较老的分区表创建和管理工具,主要支持MBR(Master Boot Record)格式的分区表。MBR分区表支持的硬盘单个分区最大容量为2TB,最多可以有4个主分区。fdisk通过命令行界面进行操…...
如何在终端/命令行中把PDF的每一页转换成图片(PNG)
今天被对象安排了一个任务: 之前自己其实也有这个需要,但是吧,我懒:量少拖拽,量大就放弃。但这次躲不过去了,所以研究了一下有什么工具可以做到这个需求。 本文记录我这次发现的使用 XpdfReader 的方法。…...
【0415】Postgres内核 释放指定 memory context 中所有内存 ④
1. frees all memory (memory context) Postgres内核中由函数 AllocSetReset() 完成该功能。即 “释放给定set中分配的所有内存。” 它应当将所有已分配的chunks标记为已释放,但不一定需要归还set所拥有的全部资源。我们的实际实现是,除了“保留”块(“keeper” block)(…...
2025年Flutter初级工程师技能要求
在2025年,随着移动应用市场的持续增长和跨平台开发需求的不断增加,Flutter已经成为许多公司构建高性能、跨平台应用的首选框架。对于初入职场的Flutter初级工程师来说,掌握以下技能要求是必不可少的。这些技能不仅能够帮助你在工作中快速上手…...
AWS技术助力企业满足GDPR合规要求
GDPR(通用数据保护条例)作为欧盟严格的数据保护法规,给许多企业带来了合规挑战。本文将探讨如何利用AWS(亚马逊云服务)的相关技术来满足GDPR的核心要求,帮助企业实现数据保护合规。 一、GDPR核心要求概览 GDPR的主要目标是保护欧盟公民的个人数据和隐私权。其核心要求包括: 数…...
MVCC:数据库并发控制的利器
在并发环境下,数据库需要处理多个事务同时访问和修改数据的情况。为了保证数据的一致性和隔离性,数据库需要采用一些并发控制机制。MVCC (Multi-Version Concurrency Control,多版本并发控制) 就是一种常用的并发控制技术,它通过维…...
第二章、Isaaclab强化学习包装器(3):SKRL Wrapper
0 前言 官方文档:https://isaac-sim.github.io/IsaacLab/main/source/api/lab_rl/isaaclab_rl.html#module-isaaclab_rl.skrl https://skrl.readthedocs.io/en/latest/intro/getting_started.html 在本节中,您将学习如何使用 skrl 库的各种组件来创建强…...
AI数字人实现原理
随着人工智能与数字技术的快速发展,AI数字人(Digital Human)作为新一代人机交互媒介,正在多个行业中快速落地。无论是在虚拟主播、在线客服、教育培训,还是在数字代言、元宇宙中,AI数字人都扮演着越来越重要…...
RBTree的模拟实现
1:红黑树的概念 红⿊树是⼀棵⼆叉搜索树,他的每个结点增加⼀个存储位来表⽰结点的颜⾊,可以是红⾊或者⿊⾊。通过对任何⼀条从根到叶⼦的路径上各个结点的颜⾊进⾏约束,红⿊树确保没有⼀条路径会⽐其他路径⻓出2倍,因…...
ssh connect to remote gitlab without authority
ssh connect to remote gitlab without authority 1 this command can produce a ssh key for authority ssh-keygen -t ed25519 -C "your_emailexample.com"2 this command can get the comment about the key cat ~/.ssh/id_ed25519.pubcopy all content !!!...
gitlab提交测试分支的命令和流程
写在前面 先npm run lint:eslint 先走一遍代码校验然后再提交先把检验跑了再add commit push那些注意一下这个问题:git commit规范不对导致报错subject may not be empty[subject-empty]type may not be empty[type-empty]. 配置lint检查后, 使用commitlint之后报…...
序列化和反序列化hadoop实现
### Hadoop 中序列化与反序列化的实现机制 Hadoop 提供了自己的轻量级序列化接口 Writable,用于高效地在网络中传输数据或将其存储到磁盘。以下是关于其核心概念和实现方式的详细介绍: --- #### 1. **Hadoop 序列化的核心原理** Hadoop 的序列化是一…...
[操作系统] 策略模式进行日志模块设计
文章目录 [toc]一、什么是设计模式?二、日志系统的基本构成三、策略模式在日志系统中的落地实现✦ 1. 策略基类 LogStrategy✦ 2. 具体策略类▸ 控制台输出:ConsoleLogStrategy▸ 文件输出:FileLogStrategy 四、日志等级枚举与转换函数五、日…...
LeetCode 每日一题 3341. 到达最后一个房间的最少时间 I + II
3341. 到达最后一个房间的最少时间 I II 有一个地窖,地窖中有 n x m 个房间,它们呈网格状排布。 给你一个大小为 n x m 的二维数组 moveTime ,其中 moveTime[i][j] 表示在这个时刻 以后 你才可以 开始 往这个房间 移动 。你在时刻 t 0 时从…...
《Python星球日记》 第68天:BERT 与预训练模型
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、BERT模型基础1. 什么是BERT?2. BERT 的结构3.预训练和微调对比二、BERT 的预训练任务1. 掩码语言模型 (MLM)2. 下一句预测 (NSP)三、微调 …...
Angular 知识框架
一、Angular 基础 1. Angular 简介 Angular 是什么? 基于 TypeScript 的前端框架(Google 维护)。 适用于构建单页应用(SPA)。 核心特性 组件化架构 双向数据绑定 依赖注入(DI) 模块化设计…...
python三方库sqlalchemy
SQLAlchemy 是 Python 中最强大、最受欢迎的 ORM(对象关系映射)库,它允许你使用 Python 对象来操作数据库,而不需要直接编写 SQL 语句。同时,它也提供了对底层 SQL 的完全控制能力,适用于从简单脚本到大型企…...
【SSL部署与优化】如何为网站启用HTTPS:从Let‘s Encrypt免费证书到Nginx配置
网站启用HTTPS 的完整实战指南,涵盖从 Let’s Encrypt 免费证书申请到 Nginx 配置的详细步骤,包括重定向、HSTS 设置及常见问题排查: 一、准备工作 1. 确保域名解析正确 • 在 DNS 管理后台,将域名(如 example.com&…...
Kubernetes控制平面组件:Kubelet详解(四):gRPC 与 CRI gRPC实现
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
电商平台自动化
为什么要进行独立站自动化 纯人工测试人力成本高,相对效率低 回归测试在通用模块重复进行人工测试,测试效率低 前期调研备选自动化框架(工具): Katalon Applitools Testim 阿里云EMAS Playwright Appium Cypress 相关…...
【kafka】kafka概念,使用技巧go示例
1. Kafka基础概念 1.1 什么是Kafka? Kafka是一个分布式流处理平台,用于构建实时数据管道和流式应用。核心特点: 高吞吐量:每秒可处理百万级消息持久化存储:消息按Topic分区存储在磁盘分布式架构:支持水平…...
计算机系统结构——Cache性能分析
一、实验目的 加深对Cache的基本概念、基本组织结构以及基本工作原理的理解。掌握Cache容量、相联度、块大小对Cache性能的影响。掌握降低Cache不命中率的各种方法以及这些方法对提高Cache性能的好处。理解LRU与随机法的基本思想以及它们对Cache性能的影响。 二、实验平台 实…...
Spring Web MVC————入门(2)
1,请求 我们接下来继续讲请求的部分,上期将过很多了,我们来给请求收个尾。 还记得Cookie和Seesion吗,我们在HTTP讲请求和响应报文的时候讲过,现在再给大家讲一遍,我们HTTP是无状态的协议,这次的…...
Adobe DC 2025安装教程
一.软件下载 点此下载 二.软件安装...
W1电力线载波通信技术
CK_Label_W1 产品型号:CK_Label_W1 尺寸:37*65*33.7mm 按键:1 指示灯:1 RGB灯(红/绿/蓝/黄/紫/白/青) 外观颜色:白色 合规认证:CE, RoHS 工作温度:0-50℃ 提示功能:蜂鸣器声音…...
现代 Web 自动化测试框架对比:Playwright 与 Selenium 的深度剖析
现代 Web 自动化测试框架对比:Playwright 与 Selenium 的深度剖析 摘要:本文对 Playwright 与 Selenium 在开发适配性、使用难度、场景适用性及性能表现等方面进行了全面深入的对比分析。通过详细的技术实现细节阐述与实测数据支撑,为开发者…...
第二章:CSS秘典 · 色彩与布局的力量
剧情承接:色彩失衡的荒原 林昊穿过 HTML 大门,眼前却是一片 灰白扭曲的荒原。所有页面元素如同幽灵般漂浮,没有色彩、没有结构,错乱无章。 “这是失控的样式荒原。” 零号导师的声音再次响起, “HTML 给了你骨架&…...
ubuntu studio 系统详解
Ubuntu Studio 系统详解:面向多媒体创作的专业 Linux 发行版 一、定位与目标用户 Ubuntu Studio 是 Ubuntu 的官方衍生版本(Flavor),专为 音频、视频、图形设计、音乐制作、影视后期 等多媒体创作场景设计。目标用户包括&#x…...
在 Ubuntu 20.04.6 LTS 中将 SCons 从 3.1.2 升级到 4.9.1
在 Ubuntu 20.04.6 LTS 中将 SCons 从 3.1.2 升级到 4.9.1,可以通过以下步骤完成: 方法 1:使用 pip 安装(推荐) 步骤 1:卸载旧版本 SCons # 如果通过 apt 安装的旧版本,先卸载 sudo apt remov…...
边缘计算网关工业物联网应用:空压机远程运维监控管理
边缘计算网关在空压机远程运维监控管理中的工业物联网应用,主要体现在数据采集与处理、设备监控、故障诊断与预警、远程控制等方面,以下是具体介绍: 数据采集与处理 多源数据采集:边缘计算网关能连接空压机的各类传感器…...
【大模型面试每日一题】Day 18:大模型中KV Cache的作用是什么?如何通过Window Attention优化其内存占用?
【大模型面试每日一题】Day 18:大模型中KV Cache的作用是什么?如何通过Window Attention优化其内存占用? 📌 题目重现 🌟🌟 面试官:大模型中KV Cache的作用是什么?如何通过Window Attention优…...
Spring的 @Validate注解详细分析
在 Spring Boot 中,参数校验是保证数据合法性的重要手段。除了前面提到的NotNull、Size等基础注解外,JSR-303(Bean Validation 1.0)、JSR-349(Bean Validation 1.1)和 JSR-380(Bean Validation …...
现代计算机图形学Games101入门笔记(三)
三维变换 具体形式缩放,平移 特殊点旋转。这里涉及到坐标系,先统一定义右手坐标系,根据叉乘和右手螺旋判定方向。这里还能法线Ry Sina 正负与其他两个旋转不一样。这里可以用右手螺旋,x叉乘z,发现大拇指朝下࿰…...
AI时代的弯道超车之第八章:具体分享几个AI实际操作方法和案例
在这个AI重塑世界的时代,你还在原地观望吗?是时候弯道超车,抢占先机了! 李尚龙倾力打造——《AI时代的弯道超车:用人工智能逆袭人生》专栏,带你系统掌握AI知识,从入门到实战,全方位提升认知与竞争力! 内容亮点: AI基础 + 核心技术讲解 职场赋能 + 创业路径揭秘 打破…...
企业网络新选择:软件定义架构下的MPLS
随着现代企业园区网络和运营商级基础设施的不断发展,多协议标签交换 (MPLS) 已成为一项基础技术,这要归功于其高效的数据包转发、高级流量工程功能以及对多租户环境的强大支持。 什么是MPLS? MPLS(多协议…...
SparkSQL操作Mysql
(一)准备mysql环境 我们计划在hadoop001这台设备上安装mysql服务器,(当然也可以重新使用一台全新的虚拟机)。 以下是具体步骤: 使用finalshell连接hadoop001.查看是否已安装MySQL。命令是: rpm -qa|grep…...
【论文阅读】UNIT: Backdoor Mitigation via Automated Neural Distribution Tightening
ECCV2024 https://github.com/Megum1/UNIT 我们的主要贡献总结如下: 我们引入了UNIT(“AUtomated Neural DIstribution Tightening”),这是一种创新的后门缓解方法,它为每个神经元近似独特的分布边界,用于…...
Android逆向学习(十) IDA逆向编辑Android so文件
Android逆向学习(十) IDA逆向编辑Android so文件 一、 写在前面 这是吾爱破解论坛正己大大的第10个教程 native code在我之前的博客中讲到过,所以这里就不讲了 简单来说,native code就是在android中使用c或c语言进行开发 这样…...
OpenCV + PyAutoGUI + Tkinter + FastAPI + Requests 实现的远程控制软件设计方案
以下是基于 OpenCV PyAutoGUI Tkinter FastAPI Requests 实现的远程控制软件设计方案。该方案分为 被控端(服务端) 和 控制端(客户端),支持屏幕实时查看、键盘映射和鼠标操作。 1. 系统架构 ------------------- …...
C++.神经网络与深度学习(赶工版)(会二次修改)
神经网络与深度学习 1. 神经网络基础1.1 神经元模型与激活函数1.2 神经网络结构与前向传播2.1 损失函数与优化算法均方误差损失函数交叉熵损失函数梯度下降优化算法 2.2 反向传播与梯度计算神经元的反向传播 3.1 神经元类设计与实现神经元类代码实现代码思路 3.2 神经网络类构建…...
砷化镓太阳能电池:开启多元领域能源新篇
砷化镓太阳能电池作为一种高性能的光伏产品,具有诸多独特优势。其中,锗衬底砷化镓太阳能电池表现尤为突出,它具备高转化效率、耐辐照和高电压等特性。在空间供电电源领域,这些优势使其成为人造卫星、太空站、太空探测器和登陆探测…...
[Linux] vim及gcc工具
目录 一、vim 1.vim的模式 2.vim的命令集 (1):命令模式 (2):底行模式 3.vim配置 二、gcc 1.gcc格式及选项 2.工作布置 三、自动化构建工具makefile 1.基本使用方法 2.配置文件解析 3.拓展 在linux操作系统的常用工具中,常用vim来进行程序的编写;…...