C语言文件操作(上)
文章目录
- 一、为什么使用文件
- 二、什么是文件
- 1.程序文件
- 2.数据文件
- 3.文件名
- 三、文件的打开与关闭
- 1.文件指针
- 2.文件的打开和关闭
- fopen 与 fclose
- 四、文件的顺序读写
- 01 字符输出函数:fputs
- 02 字符输入函数:fgetc
- 03 文本行输出函数:fputs
- 04 文本行输入函数:fgets
- 05 格式化输出函数:fprintf
- 06 格式化输入函数:fscanf
- 07 二进制输出函数:fwrite
- 08 二进制输入函数:fread
- 五、 文件的随机读写
- 01 文件指针定位函数:fseek
- 02 返回偏移量函数:ftell
- 03 文件指针回到起始位置函数:rewind
- 六、 文本文件和二进制文件
- 01 文本文件
- 02 二进制文件
- 03 数据在文件中的存储方式
- 七、 文本结束的判定
- 01 被错误使用的feof
- 02 正确使用方式
- 八、文件缓冲区
一、为什么使用文件
在我们的一般程序中,我们所输入的数据都是存储在内存中的,当程序退出的时候,我们存储的数据也就相应消失了;那么,我们怎么才能做到完成相应数据的长时间存储呢?
这就涉及到了数据持久化的问题,我们一般数据持久化的方法有:把数据存放在磁盘文件、存放到数据库等方式。使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。
二、什么是文件
简单来讲,文件就是磁盘中的文件。
但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。
1.程序文件
包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。
比如说下图的文件就是程序文件



2.数据文件
文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。
比如下图中我们对某个文件进行读取或者输入数据,那么这个文件就是数据文件

3.文件名
文件名存在的意义:作为一个文件惟一的文件标识,方便用户识别和引用。
文件名包含:文件路径 + 文件名主干 + 文件后缀
例如:(C:\code\test.text)
为了方便,文件标识通常被称为文件名
三、文件的打开与关闭
1.文件指针
概念:每个被使用的文件都会在内存在开辟一个相应的文件信息区,用来存储于文件相关的信息(如:文件名、文件状态于文件当前位置);这些信息保存在一个结构体变量中,这个结构体变量由系统进行声明,称为FILE
在VS2013中是这样声明对的
struct _iobuf {char *_ptr;int _cnt;char *_base;int _flag;int _file;int _charbuf;int _bufsiz;char *_tmpfname;};
typedef struct _iobuf FILE;
注意:
1、不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异
2、每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节
3、我们一般会通过一个 FILE 的指针来维护这个 FILE 结构的变量。并不会直接使用,而是拿一个结构体指针指向这个结构,通过这个指针来访问和维护相关的数据,这样使用起来会更加方便
下面让我们来创建一个指针变量
FILE* pf;//文件指针变量
定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。

2.文件的打开和关闭
文件的使用一般是:打开文件——>使用文件——>关闭文件
而我们打开与关闭文件需要用到两个函数:>fopen和>fclose
这两个函数的头文件都是<stlib.h>
fopen 与 fclose


示例:
int main() {//打开文件FILE* p = fopen("test1.txt","r");if (p == NULL) {perror("fopen");return 1;}else {printf("yes\n");}//关闭文件fclose(p);p = NULL;return 0;
}
结果:

注意:不关闭文件的后果:一个程序能够打开的文件是有限的,文件属于一种资源。如果只打开不释放,文件就会被占用。可能会导致一些操作被缓冲在内存中,如果不能正常关闭,缓冲在内存中的数据就不能正常写入到文件中从而导致数据的丢失。
四、文件的顺序读写
顺序读写,顾名思义就是按照顺序在文件中读和写。
函数一览:

01 字符输出函数:fputs
//字符输出
int fputc(int character,FILE* stream);
将参数 character 指定的字符写入到指定的流 stream 中,并把位置标识符向前移动 (字符必须为一个无符号字符)。适用于所有输出流。
示例:
int main() {FILE* p = fopen("test1.txt", "w");if (p == NULL) {perror("fopen");return 1;}fputc('k',p);char ch = 0;for (ch = 'a'; ch < 'z'; ch++) {if (ch % 5 == 0) {fputc('\n', p);}fputc(ch, p);}fclose(p);p = NULL;return 0;
}
结果:

此外,我们在使用W 打开的时候还会有覆盖效果,让我们来尝试一下
我们把刚刚那段代码中关于字符输出的部分进行注释
int main() {FILE* p = fopen("test1.txt", "w");if (p == NULL) {perror("fopen");return 1;}/*fputc('k',p);char ch = 0;for (ch = 'a'; ch < 'z'; ch++) {if (ch % 5 == 0) {fputc('\n', p);}fputc(ch, p);}*/fclose(p);p = NULL;return 0;
}
结果:

结果我们发现文件中的内容被覆盖了,这就是 W 的覆盖效果
02 字符输入函数:fgetc
//字符输入
int fgetc(FILE* stream);
从指定的流 stream 获取下一个字符,并把位置标识符后移(字符必须为一个无符号字符)。如果读取成功会返回相应的ASCII码值,如果读取失败会返回一个EOF。适用于所有输入流。
示例:
//使用fgetc读取文件
int main(void) {FILE* pf = fopen("test1.txt", "r");if (pf == NULL) {perror("fopen");return 1;}//读文件int ret = fgetc(pf);printf("%c\n", ret);ret = fgetc(pf);printf("%c\n", ret);ret = fgetc(pf);printf("%c\n", ret);fclose(pf);pf = NULL;return 0;
}
结果:

注意:在读取时要把文件打开方式变为“r”
03 文本行输出函数:fputs
//文本行输出
int fputs(const char* str, FILE* stream);
将字符串写入到指定的流 stream 中(不包括空字符)。适用于所有输出流。
示例:
int main() {FILE* pf = fopen("text2.txt","w");if (pf == NULL) {perror("fopen");return 1;}fputs("abcd",pf);char arr[] = "abcdefgh";fputs(arr,pf);fclose(pf);pf = NULL;return 0;
}
结果:

04 文本行输入函数:fgets
//文本输入函数
int fgets(char* str, int num, FILE* stream);
从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串中,当读取(n-1)个字符时,或者读取到换行符、到达文件末尾时,它会停止,具体视情况而定。适用于所有输入流。
示例:
int main() {FILE* pf = fopen("text2.txt","r");if (pf == NULL) {perror("fopen");return 1;}char arr[10];fgets(arr,4,pf);printf("%s\n",arr);fgets(arr, 4, pf);printf("%s\n", arr);fclose(pf);pf = NULL;return 0;
}
结果:

**注意:**假如 n 是100,读取到的就是99个字符(n-1),因为要留一个字符给斜杠0。
05 格式化输出函数:fprintf
用于对格式化的数据进行写文件,发送格式化输出到流 stream 中。适用于所有输出流。
示例:
struct test {char name[10];int age;char sex[4];
};
int main() {FILE* pf = fopen("text3.txt", "w");if (pf == NULL) {perror("fopen");return 1;}struct test ts = { "张三",18,"男"};fprintf(pf, "%s %d %s", ts.name, ts.age, ts.sex);fclose(pf);pf = NULL;return 0;
}
结果:

06 格式化输入函数:fscanf
//格式化输入函数
int fscanf(FILE* stream, const char* format, ...);
用于对格式化的数据进行读取,从流 stream 读取格式化输入。适用于所有输入流
示例:
struct test {char name[10];int age;char sex[4];
};
int main() {FILE* pf = fopen("text3.txt", "r");if (pf == NULL) {perror("fopen");return 1;}struct test ts = { 0 };fscanf(pf,"%s %d %s",ts.name,&(ts.age),ts.sex);printf("%s %d %s", ts.name, ts.age, ts.sex);fclose(pf);pf = NULL;return 0;
}
结果:

07 二进制输出函数:fwrite
//二进制输出函数
size_t fwrite(const void* ptr,size_t size,size_t count,FILE* stream);
将ptr指向的数据写入流stream中
示例:
struct test {char name[10];int age;char sex[4];
};
int main() {FILE* pf = fopen("text4.txt", "w");if (pf == NULL) {perror("fopen");return 1;}struct test ts = { "abcdef",22,"cdd"};fwrite(&ts,sizeof(struct test),1,pf);fclose(pf);pf = NULL;return 0;
}
结果:

结果显示我们输入的文字数据相显示的是乱码,让我们用二进制形式打开文件来检查一下

打开后结果:

原因:
我们刚才用的都是文本编译器,文本编译器打开二进制形式的文件完全是两种状态;对于字符串,以文本形式写进去和以二进制形式写进去是一样的;但是对于整数、浮点数等来说就不一样了,文本形式写入和二进制形式写入完全是两个概念。
08 二进制输入函数:fread
//二进制输入函数
size_t fread(void* ptr, size_t size, size_t count, FILE* stream);
将二进制数据从stream指向的文件流中读取到ptr指向的对象中
示例:
struct test {char name[10];int age;char sex[4];
};
int main() {FILE* pf = fopen("text4.txt", "r");if (pf == NULL) {perror("fopen");return 1;}struct test ts = { 0 };fread(&ts, sizeof(struct test), 1, pf);printf("%s %d %s\n",ts.name,ts.age,ts.sex);fclose(pf);pf = NULL;return 0;
}
结果:

五、 文件的随机读写
01 文件指针定位函数:fseek
//文件指针定位函数
int fseek(FILE* stream,long int offset,int origin);
根据文件指针的位置和偏移量来定位文件指针
a.参数:offset,是偏移量
b.origin是其实位置,一共有三个
SEEK_CUR :当前文件指针位置
SEEK_END :文件末尾位置
SEEK_SET:文件起始位置
示例:
int main() {FILE* pf = fopen("text3.txt","r");if (pf == NULL) {perror("fopen"); return 1;}int ch = fgetc(pf);printf("%c\n",ch);ch = fgetc(pf);printf("%c\n", ch);//从当前文件指针位置向前移动两个单位fseek(pf,-2,SEEK_CUR);ch = fgetc(pf);printf("%c\n", ch);fclose(pf);pf = NULL;return 0;
}
结果:

02 返回偏移量函数:ftell
//返回偏移量函数
long int ftell(FILE* stream);
返回当前文件指针相对于起始位置的偏移量
示例:
//返回文件指针相对于起始位置的偏移量
int main() {FILE* pf = fopen("text4.txt", "r");if (pf == NULL) {perror("fopen");return 1;}//调整文件指针位置fseek(pf,5,SEEK_SET);//使文件指针从起始位置右移5个单位int ch = fgetc(pf);printf("%c\n",ch);//返回文件指针所处位置的偏移量int ret = ftell(pf);printf("%d\n",ret);fclose(pf);pf = NULL;return 0;
}
结果:

03 文件指针回到起始位置函数:rewind
//使文件指针回到起始位置
void rewind(FILE* stream);
示例:
//返回文件指针相对于起始位置的偏移量
int main() {FILE* pf = fopen("text4.txt", "r");if (pf == NULL) {perror("fopen");return 1;}//调整文件指针位置fseek(pf,5,SEEK_SET);//使文件指针从起始位置右移5个单位int ch = fgetc(pf);printf("%c\n",ch);//返回文件指针所处位置的偏移量int ret = ftell(pf);printf("%d\n",ret);int arr[10];rewind(pf);fgets(arr,7,pf);printf("%s\n",arr);fclose(pf);pf = NULL;return 0;
}
结果:

六、 文本文件和二进制文件
根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
01 文本文件
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。
02 二进制文件
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
03 数据在文件中的存储方式
存储方式:字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。
具体使用:
举个简单的例子:比如整数10000,如果以 ASCII 码的形式形式输出到磁盘,则磁盘中占用5个字节(每个字符占1个字节)。而如果以二进制的形式输出,则在磁盘上只占4个字节。
int main() {FILE* pf = fopen("text5.txt", "wb");if (pf == NULL) {perror("fopen");return 1;}int a = 10000;fwrite(&a,sizeof(int),1,pf);fclose(pf);pf = NULL;return 0;
}
以二进制形式打开文件:
我们检验一下,这个数字是否是10000



七、 文本结束的判定
01 被错误使用的feof
feof 函数介绍:在文件结束时,判断文件因为何种原因导致文件结束的函数,判断是因为读取失败而结束,还是因为遇到文件尾而结束。如果文件结束,则返回非0值,否则返回0。
错误用途:feof 函数是个经常被错误使用的一个函数。在文件读取过程中,不能用 feof 函数的返回值直接判断文件是否结束!feof 函数绝对不是用来判断文件是否结束的函数!feof 不是用来判定文件是否结束了的,还是在文件已经结束时,判断是什么原因导致文件结束的。
正确用途:当文件读取结束时,判断是因为读取失败而结束,还是因为遇到文件尾而结束。
int main() {FILE* pf = fopen("text4.txt", "r");if (pf == NULL) {perror("fopen");return 1;}int ch = 0;while ((ch = fgetc(pf)) != EOF) {putchar(ch);}printf("\n");if (ferror(pf)) {puts("文件读取失败");}else if (feof(pf)) {puts("遇到文件末尾停止");}fclose(pf);pf = NULL;return 0;
}

02 正确使用方式
文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
例如:
fgetc 判断是否为 EOF .
fgets 判断返回值是否为 NULL .
2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:
fread判断返回值是否小于实际要读的个数。
八、文件缓冲区
ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

示例:
#include <stdio.h>
#include <windows.h>int main()
{FILE* pf = fopen("test6.txt", "w");fputs("abcdef", pf);//先将代码放在输出缓冲区printf("睡眠10秒-已经写数据了,打开test.txt文件,发现文件没有内容\n");Sleep(10000);printf("刷新缓冲区\n");fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到文件(磁盘)//注:fflush 在高版本的VS上不能使用了printf("再睡眠10秒-此时,再次打开test.txt文件,文件有内容了\n");Sleep(10000);fclose(pf);//注:fclose在关闭文件的时候,也会刷新缓冲区pf = NULL;return 0;
}
这里可以得出一个结论:
因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。
如果不做,可能导致读写文件的问题。
相关文章:
C语言文件操作(上)
文章目录 一、为什么使用文件二、什么是文件1.程序文件2.数据文件3.文件名 三、文件的打开与关闭1.文件指针2.文件的打开和关闭fopen 与 fclose 四、文件的顺序读写01 字符输出函数:fputs02 字符输入函数:fgetc03 文本行输出函数:fputs04 文本…...
二叉树的前 中 后序的非递归实现(图文详解)
🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻强烈推荐优质专栏: 🍔🍟🌯C的世界(持续更新中) 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔…...
.NET验收
验收通用模板: 1.该资料计划看几天? 实际看了几天? 计划7天,实际看了9天 2.多少天一篇总结?将总结列出来。 一周总结一篇。 博客地址:3.这个资料相较于之前资料共同的内容是什么? 不同的(需要强化学习)…...
C++11——lambda表达式
文章目录 1. C98对自定义类型的排序2. lambda表达式语法2.1 捕捉列表 3. lambda底层原理 1. C98对自定义类型的排序 在C98中,想要对自定义类型就行排序,我们得自己写仿函数来表明我们相对哪一项进行排序 struct Student {Student(string name, long id…...
美国加密货币交易和借贷平台Membrane Labs完成2000万美元融资
来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,总部位于美国纽约的加密货币交易和借贷平台Membrane Labs今日宣布已完成2000万美元A轮融资。 参与本轮融资的投资机构包括:Brevan Howard Digital、Point72 Ventures、Jane Street Cap…...
8-k8s-污点与容忍
文章目录 一、概念二、相关操作三、实操污点NoSchedule四、实操污点NoExecute五、实操容忍 一、概念 污点与容忍 污点taints定义在节点之上的键值型属性数据。当节点被标记为有污点,那么意味着不允许pod调度到该节点。 容忍tolerations是定义在 Pod对象上的键值型属…...
钢铁异常分类140篇Trans 学习笔记 小陈读paper
钢铁异常分类 对比学习 比较好用 1.首先,为每个实例生成一对样本, 来自同一实例的样本被认为是正例, 来自不同实例的样本被认为是负例。 2.其次,这些样本被馈送到编码器以获得嵌入。 3.在对比损失[16]的影响下, …...
YOLOv5-理论部分
YOLOv5 作者: Ultralytics 论文源码: https://github.com/ultralytics/yolov5 Ultralytics:“超视觉技术” / “超视觉系统” 0. 引言 “YOLOv5 🚀 是世界上备受喜爱的视觉人工智能,代表了 Ultralytics 对未来视觉人工智能方法的开源研究&a…...
蓝桥等考C++组别一级004
第一部分:选择题 1、C L1(15分) 下列是编程语言的一项是( )。 A. C B. Word C. Excel D. PowerPoint 正确答案: A 2、C L1(15分) 仔细阅读以下程序代码,其中有…...
分布式服务的链路跟踪 Sleuth Micrometer zipkin OpenTelemetry
由来 在分布式应用开发过程中,一个请求会调用多个应用,会有那种需要知道各个应用之间耗时的想法,这样可以知道一个调用的总时长以及各个组件之间的处理耗时,后面方便定位问题。 理论依据 起源于 google dapper 论文 https://re…...
CUDA学习笔记4——自定义设备函数
自定义设备函数 核函数:__global__修饰;在设备中执行;设备函数:__device__修饰;在设备中执行;只能被核函数或其他设备函数调用;主机函数:__host__修饰(可省略࿰…...
微前端四:qiankun在开发中遇到的问题
在qiankun开发中会遇到很多问题,上一篇微前端三:qiankun 协作开发和上线部署其实也是在解决一些经常遇到的问题,下面的两点也算是比较经典的了 1、子应用图片路径问题 2、基座是Vue2.0 element ui 配合 子应用 Vue3.0 element plus 导致的样…...
Android DisplayPolicy增加一些动作,打开后台接口
Android DisplayPolicy增加一些动作,打开后台接口 前言一、了解android全局滑动事件的拦截二、修改1.DisplayPolicy.java修改 前言 一些后台接口 界面之类的不方便打开,但是测试需要用到,这里就添加一个10秒内上拉6下,打开一个后…...
基于Linux安装Hive
Hive安装包下载地址 Index of /dist/hive 上传解压 [rootmaster opt]# cd /usr/local/ [rootmaster local]# tar -zxvf /opt/apache-hive-3.1.2-bin.tar.gz重命名及更改权限 mv apache-hive-3.1.2-bin hivechown -R hadoop:hadoop hive配置环境变量 #编辑配置 vi /etc/pro…...
FPGA 图像缩放 1G/2.5G Ethernet PCS/PMA or SGMII实现 UDP 网络视频传输,提供工程和QT上位机源码加技术支持
目录 1、前言版本更新说明免责声明 2、相关方案推荐UDP视频传输--无缩放FPGA图像缩放方案我这里已有的以太网方案 3、设计思路框架视频源选择ADV7611 解码芯片配置及采集动态彩条跨时钟FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择 UDP协议栈UDP视频数据组包U…...
重复控制逆变器的仿真分析研究
摘 要 本次设计主要以重复控制逆变器控制系统设计应用作为研究背景,运用MATLAB/Simulink仿真工具搭建相应的仿真模型。重复控制逆变器控制系统拥有很好的动态特性,运行稳定性高、调速的范围较大,性能可靠等,在实际生产制造中被广…...
WuThreat身份安全云-TVD每日漏洞情报-2023-10-18
漏洞名称:致远 OA XML 外部实体注入漏洞 漏洞级别:高危 漏洞编号:NULL 相关涉及:V5/G6 V6.0及以上全系列版本 漏洞状态:POC 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-26027 漏洞名称:XNSOFT NCONVERT 图像文件缓冲区溢出 漏洞级别:中危 漏洞编号:CVE-…...
开启机器人学新时代,《机器人学建模、规划与控制》完美诠释未来
机器人学是未来发展的热点领域之一,而在这个领域中,建模、规划与控制则是必不可少的基础技术。今天作者要向大家推荐一本机器人学领域的经典教材——《机器人学建模、规划与控制》。 这本书由西安交通大学出版社出版,作者是机器人学专业的鼎…...
C#根据ip获取地理位置信息的方法,史上最全
商业收费 百度地图高德地图腾讯地图纯真IP 开源免费 纯真ip免费版 以前可以直接下载,现在获取ip数据库的方式改变了,自行官网查看把,个人或者学术研究,商用追责,商业用途慎用 using System.Collections.Generic; us…...
Git问题汇总
1.取消全局代理 一般报错Failed to connect to github.com port 443 after 21089 ms: Couldn’t connect to server 取消全局代理: git config --global --unset http.proxygit config --global --unset https.proxy#或者 git config --global http.proxy http://…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...
Axure零基础跟我学:展开与收回
亲爱的小伙伴,如有帮助请订阅专栏!跟着老师每课一练,系统学习Axure交互设计课程! Axure产品经理精品视频课https://edu.csdn.net/course/detail/40420 课程主题:Axure菜单展开与收回 课程视频:...
智能体革命:企业如何构建自主决策的AI代理?
OpenAI智能代理构建实用指南详解 随着大型语言模型(LLM)在推理、多模态理解和工具调用能力上的进步,智能代理(Agents)成为自动化领域的新突破。与传统软件仅帮助用户自动化流程不同,智能代理能够自主执行工…...
华为云Flexus+DeepSeek征文 | MaaS平台避坑指南:DeepSeek商用服务开通与成本控制
作者简介 我是摘星,一名专注于云计算和AI技术的开发者。本次通过华为云MaaS平台体验DeepSeek系列模型,将实际使用经验分享给大家,希望能帮助开发者快速掌握华为云AI服务的核心能力。 目录 作者简介 前言 一、技术架构概览 1.1 整体架构设…...
