当前位置: 首页 > news >正文

【C语言】--- 文件操作

文件操作

    • 1. 为什么要使用文件
    • 2. 什么是文件
      • 2.1 程序文件
      • 2.2 数据文件
      • 2.3 文件名
    • 3. 二进程文件和文本文件
    • 4. 文件的打开和关闭
      • 4.1 流和标准流
        • 4.1.1流
        • 4.2.2标准流
      • 4.2 文件指针
      • 4.3 打开和关闭操作
    • 5. 文件的顺序读写
      • 5.1 文件顺序读写函数
        • 5.1.1 fgetc 和 fputc
        • 5.1.2 fgets 和 fgetc
        • 5.1.3 fscanf 和 fprintf
        • 5.1.4 fread 和 fwrite
        • 5.1.5 sscanf 和 sprintf
    • 6. 文件的随机读写
      • 6.1fseek
      • 6.2 ftell
      • 6.3 rwind
    • 7. 文件读取结束的判定
      • 7.1 feof
    • 8. 文件缓冲区

1. 为什么要使用文件

使用文件的核心目的就是为了持久化存储,如果没有文件,程序退出或者中途断电,数据就会丢失。当我们把数据放在文件(磁盘)中,就可以很好的做到持久化存储了。

内存(RAM)是易失性存储器,而磁盘是非易失性存储器

2. 什么是文件

文件是有名字的数据块磁盘(硬盘)上的数据是以“文件”的形式组织和存储的,文件就是操作系统用于管理和持久化保存数据的基本单位
从文件功能的角度分类,文件分为:程序文件数据文件

2.1 程序文件

程序文件包括源程序文件(后缀为.c),⽬标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。

2.2 数据文件

数据文件的内容不⼀定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。
本篇文章讨论的就是数据文件
如何理解数据文件呢?例如:C语言的printf函数其实是把内容写入到和终端对应的标准输出文件中了,这里提到一个观点,一切皆文件,本篇文章不深入讨论这个话题,这里主要是关于文件概念和文件操作的讨论。

2.3 文件名

⼀个文件要有⼀个唯⼀的文件标识,以便用户识别和引用。
文件名包含3部分:文件路径+文件名主干+文件后缀

例如: c:\code\test.txt
文件路径:C:\code
文件名主干:test
文件名后缀:.txt

为了方便起见,文件标识常被称为文件名,这是一个广义的文件名。

3. 二进程文件和文本文件

根据数据文件内容组织形式的不同,分为二进制文件文本文件
二进制文件:数据以二进制的形式存储的文件。
文本文件:数据以字符的形式存储的文件。
文本文件人类可以可读,二进制文件不直接可读,需要程序解析。
一个数据在文件中如何存储的呢?

字符以ASCII的形式存储,数字可以以二进制的形式存储,也可以以ASCII的形式存储。

例如整数10000,如果以ASCII形式存储的文件为文本文件,以二进制形式存储的文件就是二进制文件。
在这里插入图片描述使用程序说明一下二进制文件。

#include <stdio.h>
int main()
{int a = 10000;FILE* pf = fopen("test.txt", "wb");fwrite(&a, 4, 1, pf);fclose(pf);pf = NULL;return 0;
}

程序的功能就是,把10000以二进制的形式写入到当前的工作路径下的test.txt文件中。

运行程序,我们使用二进制编辑器查看一下
在这里插入图片描述
10 27 00 00 即为10000十六进制以小端存储的形式。

4. 文件的打开和关闭

4.1 流和标准流

4.1.1流

程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。
C程序针对文件、画面、键盘等的数据输⼊输出操作都是通过流操作的。⼀般情况下,我们要想向流里写数据,或者从流中读取数据,都是要打开流,然后操作。

4.2.2标准流

C语言程序启动的时候,默认打开了三个流。

  1. stdin - 标准输入流,大多从键盘输入,scanf就是从stdin中取出数据。
  2. stdout - 标准输出流,大多输出到显示器,printf函数就是把信息输出到标准输出流中。
  3. stderr - 标准错误流,大多输出到显示器

stdin、stdout、stderr三个流的类型是FILE *,通常称为文件指针。C语言中就是通过FILE *类型的文件指针来维护各种流的操作的。

4.2 文件指针

缓冲文件系统,关键的概念是“文件类型指针”,简称,“文件指针”。
每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名字,⽂件状态及⽂件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名 FILE.
每当打开⼀个文件的时候,系统会根据文件的情况自动创建⼀个FILE结构的变量,并填充其中的信息,使用者不必关心细节。
⼀般都是通过⼀个FILE的指针来维护这个FILE结构的变量,通过文件指针变量可以找到与之相关联的文件,这样使用起来更加方便。
在这里插入图片描述

4.3 打开和关闭操作

⽂件在读写之前应该先打开⽂件,在使⽤结束之后应该关闭⽂件
ANSI C 规定使用 fopen 函数来打开文件, fclose 来关闭文件

FILE * fopen(const char *filename ,const char *mode)
int flose(FILE * stream);

mode表示打开文件的模式,下面是打开文件的模式:
在这里插入图片描述
下面给了例子说明一下:

int main()
{FILE* pf = fopen("data.txt", "w"); if (pf == NULL){perror("fopen");return 1;}//打开成功,读/写文件//关闭文件fclose(pf);pf = NULL;return 0;
}

这里应该注意以下两点。

  1. fopen以“”w的形式打开文件的时候,就会清空文件的内容
  2. fopen函数如果打开成功,则返回文件信息区的起始地址,如果打开失败了,就返回NULL

5. 文件的顺序读写

在这里插入图片描述

5.1 文件顺序读写函数

5.1.1 fgetc 和 fputc
  1. fgetc 字符输入函数,适用于所有的输入流
  2. fputc 字符输出函数,适用于所有的输出流
    在这里插入图片描述
    写一个文件到流中,例如我们可以循环写26个字母到标准输出流中。
#include<stdio.h>
int main()
{char c = 0;for (c = 'a';c <= 'z'; c++){fputc(c, stdout);}return 0;
}

在这里插入图片描述
也可以写入到文件流

int main()
{FILE * pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}char c = 0;for (c = 'a';c <= 'z'; c++){fputc(c, pf);}fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
在这里插入图片描述

从输入流中读取一个字符,例如可以从一个标准输入流中读取一个字符。

int main()
{int ch = 0;ch = fgetc(stdin);return 0;
}

在这里插入图片描述
当然可以可以从文件流中读取字符。,当fgetc读取发生错误的时候就是返回EOF。

int main()
{FILE * pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}int ch = 0;while ((ch = fgetc(pf)) != EOF) {printf("%c ", ch);}fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
我们这里可以循环的把刚刚使用fputs到data.txt文件中的数据拿出来。

5.1.2 fgets 和 fgetc
  1. fgets 文本行输入函数,适用于所有的输入流。
  2. fputs 文本行输出函数,适用于所有的输出流。

先来看一下 fputs
在这里插入图片描述
写一个字符串到输出流中:

int main()
{fputs("hello world", stdout);return 0;
}

在这里插入图片描述
当然也可以输出到文件流

int main()
{FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}fputs("hello world", pf);fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
我们发现我们使用fputs函数输出到data.txt中的文件的数据没有了,这是因为"w"会覆盖上的的数据内容,如果需要可以使用"b",在原内容后追加。
在这里插入图片描述
最多从输入流中读取num-1个有效字符。

int main()
{FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}char arr[50];fgets(arr, 50, pf);printf("%s", arr);fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

5.1.3 fscanf 和 fprintf
  1. fscanf 格式化输入函数,适用于所有的输入流。
  2. fprintf 格式化输入函数,适用于所有的输出流。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
printf和fprintf的区别就是printf默认输出到标准输出流stdout、而fprintf可以输出到任意输出流。

int main()
{int num = 100;float score = 75.5;char arr[10]="如花";FILE * pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}fprintf(pf,"%d %f %s\n",num ,score,arr);fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
在这里插入图片描述
同理fscanf和scanf的区别就是,scanf只能从标准输入流stdin中获取格式化数据,而fscanf可以从任何输入流中获取格式化数据。

int main()
{int num = 0;float score = 0;char arr[10] = "";FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}fscanf(pf, "%d %f %s", &num, &score, arr);printf("%d %f %s", num, score, arr);fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

5.1.4 fread 和 fwrite
  1. fread 二进制输入函数,只适用于文件流输入。
  2. fwrite 二进制输出函数,只适用于文件流输出。

在这里插入图片描述

  1. ptr 要写入元素的数组指针
  2. size 要写入每个元素的大小
  3. count 要写入每个元素的个数
  4. stream 输出流
int main()
{FILE* pf = fopen("data.txt", "wb");//二进制的写if (pf == NULL){perror("fopen");return 1;}int arr[] = { 1,2,3,4,5 };//二进制的形式写fwrite(arr, sizeof(arr[0]), 5, pf);fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
在这里插入图片描述
fread的参数和fwrite类似。

int main()
{FILE* pf = fopen("data.txt", "rb");//二进制的读if (pf == NULL){perror("fopen");return 1;}int arr[5] = { 0 };//二进制的形式读取int i = 0;for (i = 0; i < 5; i++){fread(&arr[i], sizeof(arr[0]), 1, pf);printf("%d ", arr[i]);}fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

5.1.5 sscanf 和 sprintf
  1. sscanf 从字符串中读取格式化数据
  2. sprintf 把格式化数据转换成字符串。
    )
int main()
{int num = 100;float score = 3.14f;char name[10] = "小强";char str[100] = {0};sprintf(str, "%d %f %s", num, score, name);printf("字符串的形式:%s\n", str);int num1 = 0;float score1 = 0;char name1[10] = {0};sscanf(str, "%d %f %s", &num1, &score1, name1);//从字符串中提取格式化的数据printf("格式化的形式:%d %f %s\n", num1, score1, name1);return 0;
}

在这里插入图片描述

6. 文件的随机读写

6.1fseek

fseek可以根据文件指针的位置和偏移量来定位文件指针(文件内容的光标)。
在这里插入图片描述

1.origin 有三个取值,SEEK_SET表示文件的起始位置,SEEK_CUR表示文件指针的当前位置,SEEK_END 表示文件的末尾。

下面给出代码

int main()
{FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}//读文件int ch = fgetc(pf);printf("%c", ch);//定位文件中光标位置//fseek(pf, 2, SEEK_CUR);fseek(pf, 3, SEEK_SET);//fseek(pf, -3, SEEK_END);ch = fgetc(pf);printf("%c", ch);fclose(pf);pf = NULL;return 0;
}

起始data.txt文件内容为abcdef,当读取一个字符后,文件指针指向b,当我们期望读取d的时候,有以上三种方式。
在这里插入图片描述

6.2 ftell

返回⽂件指针相对于起始位置的偏移量.

long int ftell ( FILE * stream );

在这里插入图片描述
当在上面的程序中加入以上两句。
在这里插入图片描述
这也验证了当前文件指针指向d字符的现象。

6.3 rwind

让文件指针的位置回到起始位置。

void rewind ( FILE * stream );

在这里插入图片描述
继续把以上写到6.1的程序中,结果如下。
在这里插入图片描述

7. 文件读取结束的判定

7.1 feof

牢记:在文件读取过程中,不能用feof函数的返回值直接来判断文件的是否结束
feof 的作用是:当文件读取结束的时候,判断是读取结束的原因是否是:遇到文件结束。
同理ferror的作用时:当文件读取结束对的时候,判断读取结束的原因是否是:读取时发生了错误。

  1. fgetc读取正常返回所读取字符的ASCII值,读取结束返回EOF
  2. fgets读取正常返回的是存储数据的数组的地址,读取结束返回NULL。
    3.fscanf 返回读取格式化数据的个数,当返回值小于实际要读的个数说明这是最后一次读取
    4.fread返回值小于要求读取的个数说明是最后一次读取。

这里给出一个fgetc的例子

int main()
{int c; // 注意:int,非char要求处理EOFFILE* fp = fopen("test.txt", "r");if (!fp) {perror("fopen");return 1;}//fgetc 当读取失败的时候或者遇到⽂件结束的时候,都会返回EOFwhile ((c = fgetc(fp)) != EOF) {putchar(c);}putchar(c);//判断是什么原因结束的if (ferror(fp))puts("I/O error when reading");else if (feof(fp))puts("End of file reached successfully");fclose(fp);return 0;
}

这里也给出一个文本文件的例子

int main(void)
{double a[SIZE] = { 1.,2.,3.,4.,5. };FILE* fp = fopen("test.bin", "wb"); // 必须⽤⼆进制模式fwrite(a, sizeof * a, SIZE, fp); //写double的数组fclose(fp);double b[SIZE];fp = fopen("test.bin", "rb");size_t ret_code = fread(b, sizeof * b, SIZE, fp); // 读double的数组if (ret_code == SIZE) {puts("Array read successfully, contents: ");for (int n = 0; n < SIZE; ++n)printf("%f ", b[n]);putchar('\n');}else { if (feof(fp))printf("Error reading test.bin: unexpected end of file\n");else if (ferror(fp)) {perror("Error reading test.bin");}}fclose(fp);
}

8. 文件缓冲区

ANSIC标准采⽤“缓冲文件系统”处理的数据文件的,所谓缓冲⽂件系统是指系统自动地在内存中为程序中每⼀个正在使用的文件开辟⼀块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读⼊数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等),fflush函数会直接刷新缓冲区缓冲区的大小根据C编译系统决定的
在这里插入图片描述
下面给出代码证明缓冲区的存在。

int main()
{FILE* pf = fopen("test.txt", "w");fputs("abcdef", pf);//先将代码放在输出缓冲区printf("睡眠5秒已经写数据了,打开test.txt文件,发现文件没有内容\n");Sleep(5000);printf("刷新缓冲区\n");fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到⽂件(磁盘)//注:fflush在⾼版本的VS上不能使⽤了printf("再睡眠5秒此时,再次打开test.txt文件,文件有内容了\n");Sleep(5000);fclose(pf);//注:fclose在关闭⽂件的时候,也会刷新缓冲区pf = NULL; //即使没有fflush 没有fclose 在程序结束的时候,文件也会被关闭,缓冲区也会被刷新。return 0;
}

文件缓冲区的设立的意义如下:

在操作系统中,I/O 操作速度远低于 CPU 执行速度,若程序每次输入输出都直接访问外设,将频繁触发进程阻塞与上下文切换,严重影响系统效率。缓冲区的设立正是为了解决这一矛盾:通过在内存中设置中间缓存区域,程序可先与缓冲区交互,系统则在适当时机统一处理实际的 I/O 操作。这样既减少了进程因等待 I/O 而频繁切换的开销,也提高了 CPU 利用率和整体调度效率,是操作系统在进程调度与资源管理上的重要优化手段。

相关文章:

【C语言】--- 文件操作

文件操作 1. 为什么要使用文件2. 什么是文件2.1 程序文件2.2 数据文件2.3 文件名 3. 二进程文件和文本文件4. 文件的打开和关闭4.1 流和标准流4.1.1流4.2.2标准流 4.2 文件指针4.3 打开和关闭操作 5. 文件的顺序读写5.1 文件顺序读写函数5.1.1 fgetc 和 fputc5.1.2 fgets 和 fg…...

操作系统 4.4-从生磁盘到文件

文件介绍 操作系统中对磁盘使用的第三层抽象——文件。这一层抽象建立在盘块&#xff08;block&#xff09;和文件&#xff08;file&#xff09;之间&#xff0c;使得用户可以以更直观和易于理解的方式与磁盘交互&#xff0c;而无需直接处理磁盘的物理细节如扇区&#xff08;se…...

第六章 进阶03 外包测试亮相

因为有年度重点项目&#xff0c;团队缺少测试资源&#xff0c;所以临时招聘了一个外包测试&#xff08;后文用J代指&#xff09;&#xff0c;让产品经理亮亮来带她。 到今天J差不多入职有1个月时间了&#xff0c;亮亮组了个会&#xff0c;一起评审下J做的测试用例。 J展示了其…...

如何使用通义灵码完成PHP单元测试 - AI辅助开发教程

一、引言 在软件开发过程中&#xff0c;测试是至关重要的一环。然而&#xff0c;在传统开发中&#xff0c;测试常常被忽略或草草处理&#xff0c;很多时候并非开发人员故意为之&#xff0c;而是缺乏相应的测试思路和方法&#xff0c;不知道如何设计测试用例。随着 AI 技术的飞…...

使用 nano 文本编辑器修改 ~/.bashrc 文件与一些快捷键

目录 使用 nano 编辑器保存并关闭文件使用 sed 命令直接修改文件验证更改 如果你正在使用 nano 文本编辑器来修改 ~/.bashrc 文件&#xff0c;以下是保存并关闭文件的具体步骤&#xff1a; 使用 nano 编辑器保存并关闭文件 打开 ~/.bashrc 文件 在终端中运行以下命令&#xf…...

计算机组成原理——CPU与存储器连接例题

计算机组成原理——CPU与存储器连接例题 设CPU共有16根地址线和8根数据线&#xff0c;并用(MREQ) ̅作为访存控制信号&#xff08;低电平有效&#xff09;&#xff0c;(WR) ̅作为读/写命令信号&#xff08;高电平读&#xff0c;低电平写&#xff09;。现有下列存储芯片&#…...

SQL 外键(Foreign Key)详细讲解

1. 什么是外键&#xff1f;​​ ​​定义​​&#xff1a;外键是数据库表中的一列&#xff08;或一组列&#xff09;&#xff0c;用于​​建立两个表之间的关联关系​​。外键的值必须匹配另一个表的主键&#xff08;Primary Key&#xff09;或唯一约束&#xff08;Unique Con…...

B3647 【模板】Floyd

题目链接&#xff1a;点击进入 题目 思路 代码 #include <bits/stdc.h> #define inf 0x3f3f3f3f using namespace std; const int maxn 1e6 10;int n,m,g[110][5000];int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n>>m;memse…...

配置镜像端口和观察接口

top&#xff1a; 在G0/0/2上抓包通过其他端口ping pc4 可以看到 Wireshark 抓包没有任何反应&#xff0c;做个镜像端口并配置&#xff08;观察接口和镜像接口&#xff09; observe-port interface g0/0/2 #命令配置观察端口mirror to observe-port both …...

爬虫解决debbugger之替换文件

鼠鼠上次做一个网站的时候&#xff0c;遇到的debbugger问题&#xff0c;是通过打断点然后编辑断点解决的&#xff0c;现在鼠鼠又学会了一个新的技能 首先需要大家下载一个reres的插件&#xff0c;这里最好用谷歌浏览器 先请大家看看案例国家水质自动综合监管平台 这里我们只…...

erlang的安装-linux

1&#xff1a;解压 tar -zxvf 安装包 2&#xff1a;进入解压的目录执行&#xff1a; ./configure --prefix/usr/local/erlang --with-ssl --enable-threads --enable-smp-support --enable-kernel-poll --enable-hipe --without-javac 3&#xff1a;编译安装&#xff1a; m…...

Android Coil 3默认P3色域图加载/显示不出来

Android Coil 3默认P3色域图加载/显示不出来 解决&#xff0c;需要在Androidmanifest.xml使用Coil 3的activity配置属性&#xff1a; <activityandroid:colorMode"wideColorGamut"...</activity>...

【LaTeX】安装

Register - Overleaf, 在线LaTeX编辑器 注册Overleaf 安装 Latex2022 安装教程&#xff08;附安装资源&#xff09;_tex2022安装教程-CSDN博客 注&#xff1a;先安装 texlive&#xff0c;再安装TexStudio \documentclass{article} % 这里是导言区 \begin{document}Hello, wor…...

【2025年认证杯数学中国数学建模网络挑战赛】A题 解题建模过程与模型代码(基于matlab)

目录 【2025年认证杯数学建模挑战赛】A题解题建模过程与模型代码&#xff08;基于matlab&#xff09;A题 小行星轨迹预测解题思路第一问模型与求解第二问模型与求解 【2025年认证杯数学建模挑战赛】A题 解题建模过程与模型代码&#xff08;基于matlab&#xff09; A题 小行星轨…...

【KWDB 创作者计划】KWDB 数据库全维度解析手册

——从原理到实践&#xff0c;构建下一代数据基础设施 ​第一章&#xff1a;KWDB 设计哲学与技术全景 1.1 为什么需要 KWDB&#xff1f; 在数据爆炸与业务场景碎片化的今天&#xff0c;传统数据库面临三大挑战&#xff1a;​扩展性瓶颈​&#xff08;单机性能天花板&#xff…...

低代码开发能否取代后端?深度剖析与展望-优雅草卓伊凡

低代码开发能否取代后端&#xff1f;深度剖析与展望-优雅草卓伊凡 在科技迅猛发展的当下&#xff0c;软件开发领域新思潮与新技术不断涌现&#xff0c;引发行业内外热烈探讨。近日&#xff0c;笔者收到这样一个颇具争议的问题&#xff1a;“低代码开发能取代后端吗&#xff1f…...

LeetCode hot 100—最长回文子串

题目 给你一个字符串 s&#xff0c;找到 s 中最长的 回文 子串。 示例 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 解释&#xff1a;"aba" 同样是符合题意的答案。示例 2&#xff1a; 输入&#xff1a;s "cb…...

蓝桥杯知识总结

文章目录 1.常用的数学方法2.大小写转换3.数组和集合排序数组排序集合排序 4.控制小数位数5.栈6.队列7.字符串相关方法8.十进制转n进制模板字符转为十进制某进制转化为十进制 9.前缀和10.差分11.离散化12.双指针13.二分14.枚举模板组合型枚举模板排列型枚举模板 15.搜索算法BFS…...

leetcode:2839. 判断通过操作能否让字符串相等 I(python3解法)

难度&#xff1a;简单 给你两个字符串 s1 和 s2 &#xff0c;两个字符串的长度都为 4 &#xff0c;且只包含 小写 英文字母。 你可以对两个字符串中的 任意一个 执行以下操作 任意 次&#xff1a; 选择两个下标 i 和 j 且满足 j - i 2 &#xff0c;然后 交换 这个字符串中两个…...

Python Lambda表达式详解

Python Lambda表达式详解 1. Lambda是什么&#xff1f; Lambda是Python中用于创建匿名函数&#xff08;没有名字的函数&#xff09;的关键字&#xff0c;核心特点是简洁。它适用于需要临时定义简单函数的场景&#xff0c;或直接作为参数传递给高阶函数&#xff08;如map()、f…...

Matlab 平衡车的建模与控制

1、内容简介 Matlab 189-平衡车的建模与控制 可以交流、咨询、答疑 2、内容说明 略 平衡车的建模与控制 选择一款平衡车&#xff08;如&#xff1a;小米九号平衡车等&#xff09;&#xff0c;并估计平衡车的关键参数。完成以下工作&#xff1a; 1. 建立平衡车模型&#xf…...

KWDB创作者计划—KWDB关系库与时序库混搭

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验 Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯…...

Android studio2024的第一个安卓项目

目录 一、创建项目 1、创建Empty Views Activity类型项目 2、Android项目结构解析 manifests 目录&#xff1a; Gradle Scripts目录 3、创建安卓应用 二、测试 1、模拟器测试效果 2、连接真机&#xff0c;然后直接选择真机运行即可&#xff08;点击Run或Shift F10运行…...

航电系统之障碍物监测技术篇

航电系统的障碍物监测技术是保障飞行安全、提升飞行效率的核心技术之一&#xff0c;尤其在复杂环境和低空飞行中发挥着关键作用。以下从技术原理、传感器类型、数据处理与应用等方面进行系统介绍&#xff1a; 一、技术原理 航电系统的障碍物监测技术通过多传感器融合和智能算法…...

网站DDoS防护方案——构建企业级安全屏障的关键路径

本文深度解析DDoS攻击最新演变趋势与防御技术体系&#xff0c;通过攻击特征图谱、云原生防护架构、混合防御模型等维度&#xff0c;揭示企业级网站防护方案的设计逻辑。结合2023年金融行业千万级QPS攻击事件&#xff0c;引用Gartner最新防御技术成熟度曲线&#xff0c;给出可落…...

Linux系统使用lshw生成硬件报告方法

使用 lshw 生成 HTML 硬件报告指南 一、工具简介 lshw(List Hardware)是 Linux 系统下用于检测并报告硬件详细信息的命令行工具,支持输出多种格式(文本、HTML、XML 等)。 核心功能: 显示 CPU、内存、磁盘、PCI/USB 设备等完整硬件信息生成结构化报告,便于存档或分析支…...

力扣 905 按奇偶排序数组:双指针法的优雅实现

目录 问题背景 题目解析 解题思路 暴力解法 双指针法 代码实现 代码解析 算法效率 实际应用场景 总结 问题背景 在编程的世界里&#xff0c;数组排序问题一直是经典中的经典。今天我们要解决的是一个有趣的变种&#xff1a;按奇偶排序数组。题目要求我们将一个整数数…...

LeetCode hot 100—子集

题目 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[1],[2…...

BERT - BertTokenizer, BertModel API模型微调

本节代码将展示如何在预训练的BERT模型基础上进行微调&#xff0c;以适应特定的下游任务。 ⭐学习建议直接看文章最后的需复现代码&#xff0c;不懂得地方再回看 微调是自然语言处理中常见的方法&#xff0c;通过在预训练模型的基础上添加额外的层&#xff0c;并在特定任务的…...

通过代码获取接口文档工具

通过代码获取接口文档工具 介绍使用到的技术使用说明核心源码演示截图工具源码 介绍 1.通过前后端代码来生成规格化的接口文档 2.支持拖拽上传或点击选择文件&#xff0c;可以一次选择多个文件或选择文件夹 3.用户选择前后端代码&#xff0c;工具调用GPT解析&#xff0c;得到规…...

不再卡顿!如何根据使用需求挑选合适的电脑内存?

电脑运行内存多大合适&#xff1f;在选购或升级电脑时&#xff0c;除了关注处理器的速度、硬盘的容量之外&#xff0c;内存&#xff08;RAM&#xff09;的大小也是决定电脑性能的一个重要因素。但究竟电脑运行内存多大才合适呢&#xff1f;这篇文章将帮助你理解不同使用场景下适…...

leetcode589 N叉树的前序遍历

前序遍历的顺序是&#xff1a;根节点 -> 子节点1 -> 子节点2 -> ... -> 子节点N 递归&#xff1a; class Solution { private:void traverse(Node* cur, vector<int>& res){if(cur NULL) return;res.push_back(cur->val);for(Node* child: cur->…...

游戏引擎学习第216天

回顾并为当天做准备 你可以看到&#xff0c;游戏现在正在运行。如果我没记错的话&#xff0c;我们之前把调试系统关闭了&#xff0c;留下一个状态&#xff0c;让任何想要在这段时间内进行实验的人可以自由操作&#xff0c;因为我们还没有完全完成这个系统。所以这样做是为了确…...

JavaSE反射机制干货

1.反射(Relection) 理解 定义&#xff1a;程序运行状态,动态地获取程序信息及调用程序功能即为java反射机制 2.获取class对象 掌握 2.1 Java代码的3个阶段 Java代码在计算机中经历的三个阶段:Source源代码阶段-Class类对象阶段-Runt…...

[特殊字符] 第十一讲 | 空间回归模型实战:SAR / SEM / GWR逐个击破

&#x1f4d8; 专栏&#xff1a;科研统计方法实战分享 | 地学/农学人的数据分析工具箱 ✍️ 作者&#xff1a;平常心0715 &#x1f511; 本讲关键词&#xff1a;空间滞后模型&#xff08;SAR&#xff09;、空间误差模型&#xff08;SEM&#xff09;、地理加权回归&#xff08;G…...

AI前沿周报:2025年3月技术深度解析

以下是基于2024-2025年AI技术前沿动态的深度技术周报示例&#xff0c;结合行业最新突破与研究进展&#xff0c;突出技术原理与应用场景分析&#xff1a; AI前沿周报&#xff1a;2025年3月技术深度解析 时间范围&#xff1a;2025年3月1日-3月31日 本期焦点&#xff1a;模型透明…...

aidigu开源微博项目程序,PHP开发的开源微博系统,自媒体个人创业、网盘推广首先

一、软件介绍 文末提供程序和源码下载学习 PHP开发的开源微博系统&#xff0c;采用PHP MySQL开发&#xff0c;框架采用ThinkPHP5.1&#xff0c;用户登录后拥有专属ID&#xff0c;支持表情、关注用户&#xff0c;网盘分享等功能&#xff0c;支持图片上传,视频上传,网盘存储分享…...

Tabnet介绍(Decision Manifolds)和PyTorch TabNet之TabNetRegressor

Tabnet介绍(Decision Manifolds)和PyTorch TabNet之TabNetRegressor Decision ManifoldsTabNet1.核心思想2. 架构组成3. 工作流程4. 优点PyTorch TabNetTabNetRegressor参数1. 模型相关参数`n_d``n_a``n_steps``gamma``cat_idxs``cat_dims``cat_emb_dim`2. 训练相关参数`opti…...

格瑞普Tattu正式成为2025年中国无人机竞速联赛官方赞助商!

格瑞普Tattu正式成为2025年中国无人机竞速联赛官方赞助商! 为飞手赋能&#xff0c;为赛事护航! Tattu是深圳市格瑞普电池有限公司(Grepow)旗下的子品牌之一&#xff0c;专注为无人机、FPV和模型爱好者提供专业可靠的电池和充电器等一站式电源解决方案。凭借卓越的放电性能、稳…...

PySide6 监测设备变更事件

在PySide6中监听系统事件&#xff0c;判断是否有串口设备插拔&#xff0c;进而当串口状态变更时&#xff0c;实现列表数据实时更新。 在Qt中&#xff0c;可以使用 nativeEvent 接口来完成这一操作&#xff1a; [virtual protected] bool QWidget::nativeEvent(const QByteArray…...

嵌入式系统的历史与发展​

目录 引言​ 一、嵌入式系统的早期萌芽​ 1、首个现代嵌入式系统 2、早期未成形嵌入式系统的应用 二、以单片机为主的初级阶段​ 1、工业领域应用 2、大型家电领域应用 三、处理器升级与多样化应用阶段​ 1、数字化电子化设备涌现 &#xff08;1&#xff09;智能仪表…...

mysql调试记录

ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY password; 该命令在调试python使用pymysql连接数据库出现错误时&#xff0c; 报错为pymysql.err.OperationalError: (1045, "Access denied for user rootlocalhost (using password: NO)") m…...

【后端开发】Spring MVC阶段总结

文章目录 快捷引入依赖lombok的使用Lombok依赖Lombok使用Lombok注解 三层架构分层的目的MVC与分层的区别三层架构分层的好处 企业命名规范常见命名命名风格介绍大驼峰风格小驼峰风格包名 常见注解Cookie与Session 快捷引入依赖 这个方法可以快捷引入依赖&#xff0c;但是引入依…...

netty-socketio + springboot 消息推送服务

netty-socketio springboot 消息推送服务 后端1. 目录结构&#xff1a;代码pom文件&#xff1a;application.yml&#xff1a;SocketIOConfig&#xff1a;PushMessage&#xff1a;ISocketIOServiceSocketIOServiceImpl&#xff1a;pushMessageController&#xff1a;启动类&…...

基于 JavaWeb 的 SSM 在线视频教育系统设计和实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...

同时打开多个Microchip MPLAB X IDE

0.引用 Microchip 32位MCU CAN驱动图文教程-附源码 - 哔哩哔哩 https://bbs.21ic.com/icview-3391426-1-1.html https://bbs.21ic.com/icview-3393632-1-1.html 1.前言 工作中接触到使用Microchip 的 MPLAB X IDE 开发工具&#xff0c;使用的MCU是Microchip SAMD21J18A MCU…...

dify 500错误

问题 升级到1.2.0 后所有页面接口均报错500, 环境&#xff1a; docker 本地部署 version:1.2.0 解决办法 1.首先关闭服务 docker compose down2.找到docker-compose.yaml里的plugin_daemon&#xff0c;参照下面修改参数 plugin_daemon:environment:PLUGIN_MAX_EXECUTION…...

WPF设计标准学习记录26

画刷名称功能说明SolidColorBrush使用单一的连续颜色填充区域LinearGradientBrush使用线性渐变绘制区域。RadialGradientBrush使用径向渐变绘制区域。 焦点定义渐变的开始,而圆定义渐变的终点。ImageBrush使用图像绘制区域。VisualBrush使用一个视图绘制区域。BitmapCacheBrus…...

cin,cin.get(),getchar(),getline(),cin.get line()异同点

文章目录 1.cin2.cin.get()3.getchar()4.cin.getline()5.getline() 1.cin &#xff08;1&#xff09;cin>>等价于cin.operator>>()&#xff0c;即调用成员函数operator>>()进行读取数据。 &#xff08;2&#xff09;当cin>>从缓冲区中读取数据时&…...

7# 5多线-7 不会停

7# 5多线-7 不会停 分析&#xff0c;明显线接错了&#xff0c;打自动时也能手动启停&#xff0c;打手动无法启停&#xff0c;这时远程只能启ka3,无法启ka4。排查手自转换2上没接线&#xff0c;接到8上了&#xff08;13和12接错了&#xff0c;也就是sac的5和6接错了&#xff09;…...