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

文件操作~

目录

1.为什么使用文件?

2.什么是文件?

2.1 程序文件

2.2 数据文件

2.3 文件名

3.⼆进制文件和文本文件?

4.文件的打开和关闭

4.1 流和标准流

4.1.1 流

4.1.2 标准流

4.2 文件指针

4.3 ⽂件的打开和关闭

5.文件的顺序读写

5.1 顺序读写函数介绍

5.1.1什么是EOF

5.1.2 fputc函数

5.1.3 fgetc函数

5.1.4 fputs函数

5.1.5 fgets

5.1.6 fprintf函数

5.1.7 fscanf函数

5.1.8 fwrite函数

5.1.9fread函数

5.2 对比⼀组函数:

6.文件的随机读写

6.1fseek

6.2ftell

6.3 rewind

7.文件读取结束的判定

7.1 被错误使用的 feof

8. ⽂件缓冲区


1.为什么使用文件?

如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件。

2.什么是文件?

磁盘(硬盘)上的文件是文件。

但是在程序设计中,我们⼀般谈的⽂件有两种:程序文件、数据文件(从文件功能的角度度来分类的)。

2.1 程序文件

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

2.2 数据文件

文件的内容不⼀定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。

本章讨论的是数据文件。

在以前各章所处理数据的输⼊输出都是以终端为对象的,即从终端的键盘输⼊数据,运行结果显示到显示器上。

其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上文件。

2.3 文件名

⼀个文件要有⼀个唯⼀的文件标识,以便用户识别和引用。

文件名包含3部分:文件路径+文件名主干+文件后缀

例如: c:\code\test.txt

为了方便起见,⽂件标识常被称为文件名。

3.⼆进制文件和文本文件?

根据数据的组织形式,数据文件被称为⼆进制文件和文本文件?

数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的文件中,就是⼆进制文件

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。

⼀个数据在文件中是怎么存储的呢?

字符⼀律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。

如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符⼀个字节),而⼆进制形式输出,则在磁盘上只占4个字节。

用二进制写入,用文本文件不能打开,只能使用二进制的形式打开

#include <stdio.h>
​
int main() {int a = 1000;FILE* pf = fdopen("test.txt", "wb");fwrite(&a, 4, 1, pf); //找到a的地址写入,写入四个字节,写入一次,找到关联的文件fclose(pf);pf = NULL;return 0;
}

4.文件的打开和关闭

4.1 流和标准流

4.1.1 流

流-->一个媒介,连接程序和外部设备

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。

C程序针对文件、画面、键盘等的数据输入输出操作都是通过流操作的。

⼀般情况下,我们要想向流里写数据,或者从流中读取数据,都是要打开流,然后操作,最后关闭流

4.1.2 标准流

那为什么我们从键盘输入数据(在C语言中),向屏幕上输出数据,并没有打开流呢?

那是因为C语⾔程序在启动的时候,默认打开了3个流:

  • stdin - 标准输⼊流,在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。

  • stdout - 标准输出流,⼤多数的环境中输出到显示器界面,printf函数就是将信息输出到标准输出流中。

  • stderr - 标准错误流,⼤多数环境中输出到显⽰器界⾯

这是默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进行输入输出操作的。

stdin、stdout、stderr 三个流的类型是: FILE * ,通常称为文件指针。

C语言中,就是通过 FILE* 的文件指针来维护流的各种操作的。

4.2 文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。

每个被使用的文件都在内存中开辟了⼀个相应的文件信息区,⽤来存放⽂件的相关信息(如⽂件的名字,⽂件状态及⽂件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名 FILE.

例如,VS2013 编译环境提供的 stdio.h 头文件中有以下的文件类型申明:

struct _iobuf {char *_ptr;int _cnt;char *_base;int _flag;int _file;int _charbuf;int _bufsiz;char *_tmpfname;
};
typedef struct _iobuf FILE;

每当打开⼀个文件的时候,系统会根据文件的情况自动创建⼀个FILE结构的变量,并填充其中的信息,使用者不必关心细节。⼀般都是通过⼀个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。

下⾯我们可以创建⼀个FILE*的指针变量:

FILE* pf;//⽂件指针变量

定义pf是⼀个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是⼀个结构体变量)。通过该⽂件信息区中的信息就能够访问该文件。也就是说,通过⽂件指针变量能够间接找到与它关联的⽂件

4.3 ⽂件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。

在编写程序的时候,在打开文件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建立了指针和文件的关系。

ANSI C 规定使用 fopen 函数来打开文件, fclose 来关闭文件。

文件操作,文件中有路径的话 最好加上两个斜杠

  • E:\C\Code\Cproject\practice6.17\practice6.17(绝对路径)

  • 如果用相对路径, " . " 表示当前路径 ". ."表示上一级路径

    • 那我们要访问该路径的上一级路径的文件时, " .\ \ ..\ \ test.txt "

int main() {//1.打开文件//打开成功返回一个有效的指针//打开失败,返回NULL(判断文件指针是否为空)FILE* pf = fopen("test.txt", "w"); //D:\\WeGameApps\\if (pf == NULL) {perror("fopen");return 1;}//2.写文件操作//...
​//关闭文件fclose(pf);
​
}

5.文件的顺序读写

5.1 顺序读写函数介绍

文件按照顺序去读写,光标

5.1.1什么是EOF

在C语言中,EOF(End of File)是一个特殊的标记,用于表示文件的结尾。当我们读取文件或者输入数据时,EOF可以帮助我们确定何时到达了文件的末尾。本文将详细介绍EOF的意义和用法,并提供一些示例代码以帮助理解。

  1. EOF的意义 EOF在C语言中用于标识文件的结尾。当我们从文件中读取数据时,EOF可以告诉我们何时已经读取完了文件中的所有内容。这对于文件的处理非常重要,因为它允许我们在读取文件时判断何时停止读取并继续执行其他操作。

  2. EOF的用法 在C语言中,我们可以使用EOF常量来表示文件的结尾。EOF的值是一个特殊的整数常量,通常被定义为-1。当我们从文件中读取数据时,EOF常量可以与读取的字符进行比较,以确定是否已经到达了文件的结尾。

如下代码从文件中读取所有字符 等于EOF就是到了文件结尾,结束循环

while((ch = fgetc(pf)) != EOF)

5.1.2 fputc函数

写字符操作,一个个字符写入 该函数有两个参数 ---> fputc(i,pf); // i表示要写入的内容 pf 文件指针流

int main() {//1.打开文件//打开成功返回一个有效的指针//打开失败,返回NULL(判断文件指针是否为空)FILE* pf = fopen("test.txt", "w");if (pf == NULL) {perror("fopen");return 1;}//2.写文件操作int i = 0;for (int i = 'a'; i <= 'z'; i++) {fputc(i,pf); // i表示要写入的内容 pf 文件指针流}
​//关闭文件fclose(pf);
​
}

5.1.3 fgetc函数

读字符函数, fgetc(pf), 只有一个参数(文件指针流)

int main() {//1.打开文件//打开成功返回一个有效的指针//打开失败,返回NULL(判断文件指针是否为空)FILE* pf = fopen("test.txt", "r");if (pf == NULL) {perror("fopen");return 1;}//2.读文件操作int ch = fgetc(pf); //读取到一个字符赋值给ch 然后光标就往下printf("%c\n", ch);ch = fgetc(pf);    //再读取一个 赋值给ch 光标再往下printf("%c\n", ch);ch = fgetc(pf);printf("%c\n", ch);
​//关闭文件fclose(pf);pf = NULL;
}

另外一种读 操作 使用EOF

int main() {//1.打开文件//打开成功返回一个有效的指针//打开失败,返回NULL(判断文件指针是否为空)FILE* pf = fopen("test.txt", "r");if (pf == NULL) {perror("fopen");return 1;}//2.读文件操作int ch = 0;while ((ch = fgetc(pf)) != EOF){printf("%c", ch);}
​//关闭文件fclose(pf);
​
}
  • 在上面我们所提到的标准流 stdin和stdout也可以用上面的读写函数,他们适合所有的输入输出流

  • 实现在屏幕输入一个字符,在屏幕输出一个字符

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

5.1.4 fputs函数

int fputs ( const char * str, FILE * stream ); 

文本输入函数, 第一个参数是输入一个字符串,第二个参数是文件指针流

int main() {//1.打开文件FILE* pf = fopen("test.txt", "w");if (pf == NULL) {perror("fopen");return 1;}//2.操作文件fputs("i am a man", pf);//3.关闭文件fclose(pf);pf = NULL;return 0;
}

5.1.5 fgets

char * fgets ( char * str, int num, FILE * stream );

第一个参数用一个字符数组存储读到的字符串,第二个参数,最多读到多少个字符,第三个参数文件指针流

注意:在读字符的时候,实际读到的只是(num-1)个字符因为包含了一个\0,或者遇到换行的时候也会终止读取

int main() {//1.打开文件FILE* pf = fopen("test.txt", "r");if (pf == NULL) {perror("fopen");return 1;}//2.操作文件char arr[20] = { 0 };fgets(arr, 5, pf);printf("%s", arr);//3.关闭文件fclose(pf);pf = NULL;return 0;
}

同样以上两个函数同样适合所有的输入输出流,以下实现在屏幕输入和输出字符串

int main() {char arr[20] = {0};fgets(arr, 10, stdin);fputs(arr, stdout);
}

5.1.6 fprintf函数

int fprintf ( FILE * stream, const char * format, ... )

格式化输出函数(所有类型都可以) ,适合所有输出流,该函数和printf函数多了个文件指针流,

int main() {char name[20] = "aaa";int age = 20;float score = 95.7f;//1.打开文件FILE* pf = fopen("test.txt", "w");if (pf == NULL) {perror("fopen");return 1;}//2.操作文件fprintf(pf, "%s %d %.1f", name, age, score);//3.关闭文件fclose(pf);pf = NULL;return 0;
}

我们也可以把数据放到结构体里

struct S
{char name[20];int age;float score;
};
​
​
int main() {struct  S s = { "lisi",18,96.2f };//1.打开文件FILE* pf = fopen("test.txt", "w");if (pf == NULL) {perror("fopen");return 1;}//2.操作文件fprintf(pf, "%s %d %.1f", s.name, s.age, s.score);//3.关闭文件fclose(pf);pf = NULL;return 0;
}

5.1.7 fscanf函数

int fscanf ( FILE * stream, const char * format, ... );

要先把数据读出放到一个结构体中,再输出到屏幕

struct S
{char name[20];int age;float score;
};
​
​
int main() {struct  S s = { 0 };//1.打开文件FILE* pf = fopen("test.txt", "r"); //读文件if (pf == NULL) {perror("fopen");return 1;}//2.操作文件//name不用加&符号,因为本来name就是数组首元素地址//把文件中的数据读出来后放到结构体中fscanf(pf, "%s %d %.1f", s.name, &(s.age), &(s.score)); //再把结构体的数据读出printf(" %s %d %.1f", s.name, s.age, s.score);//3.关闭文件fclose(pf);pf = NULL;return 0;
}

5.1.8 fwrite函数

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

第一个参数,取需要写入文件的数据的地址,第二个参数该数据的大小,第三个参数该数据的个数,

以二进制的形式输出到文件中

struct S
{char name[20];int age;float score;
};
int main() {struct  S s = { "lisi",18,96.2f };//1.打开文件 二进制形式写入FILE* pf = fopen("test.txt", "wb");if (pf == NULL) {perror("fopen");return 1;}//2.操作文件fwrite(&s, sizeof(struct S), 1, pf);//3.关闭文件fclose(pf);pf = NULL;return 0;
}
​

5.1.9fread函数

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

将文件中以二进制的形式读出放到ptr指向的空间里

struct S
{char name[20];int age;float score;
};
int main() {struct  S s = { "lisi",18,96.2f };//1.打开文件 二进制形式写入FILE* pf = fopen("test.txt", "rb");if (pf == NULL) {perror("fopen");return 1;}//2.操作文件fread(&s, sizeof(struct S), 1, pf);printf("%s %d %f", s.name, s.age, s.score);//3.关闭文件fclose(pf);pf = NULL;return 0;
}
​

5.2 对比⼀组函数:

  • scanf/fscanf/sscanf

  • printf/fprintf/sprintf

  • 这里重点介绍sscanf函数和sprintf函数

    1.sprintf函数,将其他类型的数据转化成字符串

    struct S
    {char name[20];int age;float score;
    };
    ​
    int main() {char arr[100] = {0};struct  S s = { "aa",17,96.2f};sprintf(arr, "%s %d %f", s.name, s.age, s.score);printf("%s\n", arr);return 0;
    }

    2.sscanf函数 将字符串转化成其他类型的数据

    struct S
    {char name[20];int age;float score;
    };
    ​
    int main() {char arr[100] = {0};struct  S s = { "aa",17,96.2f};//临时变量struct S tmp = { 0 };
    ​sprintf(arr, "%s %d %f", s.name, s.age, s.score);/*printf("%s\n", arr);*/sscanf(arr, "%s %d %f", tmp.name, &(tmp.age), &(tmp.score));printf("%s %d %f", tmp.name, tmp.age, tmp.score);return 0;
    }

6.文件的随机读写

6.1fseek

根据⽂件指针的位置和偏移量来定位⽂件指针(⽂件内容的光标)。

 int fseek ( FILE * stream, long int offset, int origin );

offsetof --- 计算结构体成员相比于起始位置的偏移量

我们看下面代码 如果想单独读字符e就会比较麻烦,我们可以用fseek函数

int main() {FILE* pf = fopen("test.txt", "rb");if (pf == NULL) {perror("fopen");return 1;}//2.读文件int ch = fgetc(pf); //读取到一个字符赋值给ch 然后光标就往下printf("%c\n", ch);ch = fgetc(pf);    //再读取一个 赋值给ch 光标再往下printf("%c\n", ch);ch = fgetc(pf);printf("%c\n", ch);
​fclose(pf);pf = NULL;return 0;
}

fseek函数,第三个参数可以有三种选项

SEEK_SET文件开头位置
SEEK_CUR文件指针指向的当前位置
SEEK_END文件末尾
int main() {FILE* pf = fopen("test.txt", "rb");if (pf == NULL) {perror("fopen");return 1;}//2.读文件int ch = fgetc(pf); //读取到一个字符赋值给ch 然后光标就往下printf("%c\n", ch);ch = fgetc(pf);    //再读取一个 赋值给ch 光标再往下printf("%c\n", ch);fseek(pf, 2, SEEK_CUR);//在当前位置偏移两个位置找到ech = fgetc(pf);    printf("%c\n", ch);fclose(pf);pf = NULL;return 0;
}

6.2ftell

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

我们看下面代码,读完e之后往下一光标,输出偏移量为5

int main() {FILE* pf = fopen("test.txt", "rb");if (pf == NULL) {perror("fopen");return 1;}//2.读文件int ch = fgetc(pf); //读取到一个字符赋值给ch 然后光标就往下printf("%c\n", ch);ch = fgetc(pf);    //再读取一个 赋值给ch 光标再往下printf("%c\n", ch);fseek(pf, 2, SEEK_CUR);ch = fgetc(pf);    printf("%c\n", ch);//输出文件指针相比于文件的起始位置的偏移量printf("%d", ftell(pf));fclose(pf);pf = NULL;return 0;
}

6.3 rewind

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

void rewind ( FILE * stream );

7.文件读取结束的判定

7.1 被错误使用的 feof

牢记:在文件读取过程中,不能用feof函数的返回值直接来判断文件的是否结束。

因为文件结束有两种,1.遇到文件结尾,2.遇到错误

feof 的作用是:当文件读取结束的时候,再判断是读取结束的原因是否是:遇到文件尾结束。

feof的返回值,如果没有设置就默认返回0(还没到文件末尾),返回1的话代表已经到达文件末尾

1.文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )

例如:

  • fgetc 判断是否为 EOF .

  • fgets 判断返回值是否为 NULL .

2.二进制文件的读取结束判断,判断返回值是否小于实际要读的个数

例如:fread判断返回值是否小于实际要读的个数。

文本文件例子:

include <stdio.h>
#include <stdlib.h>
int main(void)
{int c; // 注意:int,⾮char,要求处理EOFFILE* fp = fopen("test.txt", "r");if(!fp) {perror("File opening failed");return EXIT_FAILURE;}//fgetc 当读取失败的时候或者遇到⽂件结束的时候,都会返回EOFwhile ((c = fgetc(fp)) != EOF) // 标准C I/O读取⽂件循环{ putchar(c);}//判断是什么原因结束的if (ferror(fp))puts("I/O error when reading");else if (feof(fp))puts("End of file reached successfully");fclose(fp);
}

二进制的例子

#include <stdio.h>
enum { SIZE = 5 };
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 { // error handlingif (feof(fp))printf("Error reading test.bin: unexpected end of file\n");else if (ferror(fp)) {perror("Error reading test.bin");}}fclose(fp);
}
  • ferro函数,如果返回一个非零的整数值,说明读取出问题;返回一个0则表示没有问题

小练习:写一个程序将一个txt文件的内容复制到另外一个txt文件

int main() {//打开文件FILE* pfread = fopen("test.txt", "r");if (pfread == NULL) {perror("fopen\n");return 1;}FILE* pfwrite = fopen("test2.txt","w");if (pfwrite == NULL) {perror("fopen\n");fclose(pfread); //如果打开文件操作出错,则关闭pfread流return 1;}//读或写文件int ch = 0; //返回值要为int类型while ((ch = fgetc(pfread)) != EOF) {fputc(ch, pfwrite); //ch表示要写入的字符}//关闭文件fclose(pfread);pfread = NULL;fclose(pfwrite);pfwrite = NULL;
}

8. ⽂件缓冲区

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

简单来说,就是不能一直让操作系统处理数据,先把数据存起来,再一次过处理,而不是每发一次就处理一次

#include <stdio.h>
#include <windows.h>
//VS2022 WIN11环境测试
int main()
{FILE*pf = fopen("test.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语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。如果不做,可能导致读写文件的问题,防止信息丢失

相关文章:

文件操作~

目录 1.为什么使用文件&#xff1f; 2.什么是文件&#xff1f; 2.1 程序文件 2.2 数据文件 2.3 文件名 3.⼆进制文件和文本文件&#xff1f; 4.文件的打开和关闭 4.1 流和标准流 4.1.1 流 4.1.2 标准流 4.2 文件指针 4.3 ⽂件的打开和关闭 5.文件的顺序读写 5.1 …...

身边的故事(十二):阿文的故事:消失

那以后就再也没有任何阿文的消息。刚开始还打过几次电话&#xff0c;他都没接。后来也就慢慢的淡忘了&#xff0c;为自己的工作生活而奔波&#xff0c;时间冲淡一切。在那几年里&#xff0c;阿文就像消失了一样。直到2021的某一天&#xff0c;电话那端传来了熟悉但是有点陌生的…...

智能扫地机器人程序中出现的问题可以参考的解决方案

在解决智能扫地机器人程序中可能遇到的问题时&#xff0c;可以参考以下分点表示和归纳的解决方案&#xff1a; 环境感知与地图构建 ① 使用先进的传感器技术&#xff1a;如激光雷达、超声波和红外传感器&#xff0c;以提高环境感知的准确性和可靠性。 ② 优化地图构建算法&a…...

如何借用物联网快速实现高标准农田信息化

如何借用物联网快速实现高标准农田信息化 高标准农田信息化&#xff0c;作为现代农业发展的重要基石&#xff0c;是指在建设高产、稳产、节水、环保的农田基础上&#xff0c;深度融合现代信息技术&#xff0c;实现农田管理的精准化、智能化和高效化。物联网&#xff08;Intern…...

计算机网络基础入门

计算机网络基础入门 目录&#xff1a; 简介网络分层模型数据封装与解封装IP地址与子网掩码网络协议示例代码 1. 简介 计算机网络是指将地理位置不同的多台计算机及外部设备通过通信线路连接起来&#xff0c;实现信息资源共享和信息传递的系统。计算机网络是现代信息社会的基…...

uniApp vue2 vue3配置代理

vue2配置代理 在manifest.json中增加如下配置 "h5" : {"router" : {"mode" : "history"},"devServer" : {"disableHostCheck" : true,"proxy" : {"/api" : {"target" : "请…...

运维锅总详解RocketMQ

本文尝试从Apache RocketMQ的简介、主要组件及其作用、3种部署模式、Controller集群模式工作流程、最佳实践等方面对其进行详细分析。希望对您有所帮助&#xff01; 一、Apache RocketMQ 简介 Apache RocketMQ 是一个开源的分布式消息中间件&#xff0c;由阿里巴巴集团开发并…...

【Linux】使用ntp同步时间

ntp介绍 NTP&#xff08;Network Time Protocol&#xff0c;网络时间协议&#xff09;是一种用于同步计算机时间的协议&#xff0c;工作在UDP的123端口上。它是一种客户端-服务器协议&#xff0c;用于同步计算机的时钟。通过连接到网络上的时间服务器&#xff0c;计算机可以获…...

【FedMut】Generalized Federated Learning via Stochastic Mutation

基于随机变异的泛化联邦学习 来源&#xff1a;AAAI2024 Abstract 问题&#xff1a; FedAvg 将相同的全局模型派发给客户端进行本地训练&#xff0c;容易陷入尖锐解&#xff0c;导致训练出性能低下的全局模型 提出 FedMut&#xff1a; 本文提出了一种名为 FedMut 的新型FL方法…...

在线教育项目(一):如何防止一个账号多个地方登陆

使用jwt做验证&#xff0c;使用账号作为redis中的key,登录的时候生成token放到redis中&#xff0c;每次申请资源的时候去看token 有没有变&#xff0c;因为token每次登录都会去覆盖&#xff0c;只要第二次登录token就不一样了...

旋转变压器软件解码simulink仿真

1.介绍 旋转变压器是一种精密的位置、速度检测装置&#xff0c;尤其适用于高温、严寒、潮湿、高速、振动等环境恶劣、旋转编码器无法正常工作的场合。旋转变压器在使用时并不能直接提供角度或位置信息&#xff0c;需要特殊的激励信号和解调、计算措施&#xff0c;才能将旋转变压…...

LeetCode 1321, 209, 102

目录 1321. 餐馆营业额变化增长题目链接表要求知识点思路代码 209. 长度最小的子数组题目链接标签暴力法思路代码 滑动窗口思路代码 102. 二叉树的层序遍历题目链接标签思路代码 1321. 餐馆营业额变化增长 题目链接 1321. 餐馆营业额变化增长 表 表Customer的字段为custome…...

vant ( weapp ) - - - - - van-tabs组件选中下划线初始位置异常

这里写自定义目录标题 1. 当前效果展示2. 官方解释 & 方案 1. 当前效果展示 明显可以看到框内的光标位置偏移了&#xff0c;但当切换一次之后就会显示正常。 只有初次打开的时候&#xff0c;才会出现上述问题。 代码如下&#xff1a; <van-popup show"{{ makeSho…...

007 栈(lua)

文章目录 Lua本身支持动态数组&#xff0c;通过表&#xff08;table&#xff09;实现&#xff0c;它类似于Java中的ArrayList。Lua的表是灵活的数组和字典的混合体。对于栈的实现&#xff0c;我们可以简单地使用一个表来模拟。 这里是一个简单的Lua栈实现&#xff0c;它包含了p…...

SQL中Order by详解

在 MySQL 中&#xff0c;ORDER BY 语句用于对查询结果进行排序。 语法&#xff1a; SELECT column1, column2,... FROM table_name ORDER BY column_name [ASC | DESC];以下是对其主要部分的详细解释&#xff1a; column_name &#xff1a;指定要依据其进行排序的列名。 ASC…...

【git】存在git LFS文件时如何处理

目录 1. 安装 Git LFS2. 初始化 Git LFS3. 跟踪大文件4. 添加和提交文件5. 克隆和拉取包含 LFS 文件的仓库 1. 安装 Git LFS 首先&#xff0c;你需要在你的系统上安装 Git LFS。你可以使用以下命令来安装&#xff1a; 在 Linux 上 # 对于基于 Debian 的系统 (如 Ubuntu) sud…...

面向阿克曼移动机器人(自行车模型)的LQR(最优二次型调节器)路径跟踪方法

线性二次调节器&#xff08;Linear Quadratic Regulator&#xff0c;LQR&#xff09;是针对线性系统的最优控制方法。LQR 方法标准的求解体系是在考虑到损耗尽可能小的情况下, 以尽量小的代价平衡其他状态分量。一般情况下&#xff0c;线性系统在LQR 控制方法中用状态空间方程描…...

【运维】在 Docker 容器中指定 UTF-8 编码:方法与技巧

在 Docker 容器中指定 UTF-8 编码&#xff1a;方法与技巧 在日常开发中&#xff0c;我们常常需要确保应用程序能正确处理各种字符编码&#xff0c;尤其是 UTF-8 编码。在 Docker 容器中运行应用程序时&#xff0c;正确设置字符编码尤为重要&#xff0c;因为容器通常是跨平台、…...

primetime中cell和net的OCV

文章目录 前言一、Cell OCV1. POCV coefficient file2. POCV Slew-Load Table in Liberty Variation Format&#xff08;LVF lib&#xff09; 二、Net OCV三、如何check OCV是否已加上&#xff1f;总结 前言 在生产中&#xff0c;外界环境的各种变化&#xff0c;比如PVT&#…...

FlinkX学习

FlinkX学习 FlinkX安装 由于flinkx已经改名chunjun 官网已不存在 (https://gitee.com/lugela/flinkx#flinkx)这里可以看到flinkx的操作文档 1、上传并解压 unzip flinkx-1.10.zip -d /usr/local/soft/2、配置环境变量 FLINKX_HOME/usr/local/soft/flinkx-1.10 export PATH$F…...

新书速览|解密AI绘画与修图: Stable Diffusion+Photoshop

《解密AI绘画与修图&#xff1a; Stable DiffusionPhotoshop》 本书内容 《解密AI绘画与修图&#xff1a;Stable DiffusionPhotoshop》全面介绍了Photoshop和Stable Diffusion的交互方式&#xff0c;以及各自的AI功能和具体使用方法。除了讲解功能&#xff0c;还通过实际案例加…...

1111111111111

计算机视觉技术在医疗领域的应用正迅速成为推动医疗进步的关键力量。通过高级图像处理和分析&#xff0c;这项技术在医学影像分析&#xff08;包括CT、MRI和X光图像&#xff09;、实时手术辅助、患者监测和护理、以及疾病早期诊断等方面展现出巨大的潜力。然而&#xff0c;随着…...

云原生概念

云原生是一种新型的技术体系和方法论&#xff0c;旨在充分利用云计算环境的优势&#xff0c;使应用程序更具有弹性、可伸缩性、可靠性和效率。以下是云原生的详细解释&#xff1a; 定义&#xff1a; 云原生是一种基于分布部署和统一运管的分布式云&#xff0c;以容器、微服务、…...

NoSQL之Redis高可用与优化

一、Redis高可用 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务&#xff08;99.9%、99.99%、99.999%等等&#xff09;。 但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#xff0c;除了保证…...

MySQL 常见存储引擎详解(一)

本篇主要介绍MySQL中常见的存储引擎。 目录 一、InnoDB引擎 简介 特性 最佳实践 创建InnoDB 存储文件 二、MyISAM存储引擎 简介 特性 创建MyISAM表 存储文件 存储格式 静态格式 动态格式 压缩格式 三、MEMORY存储引擎 简介 特点 创建MEMORY表 存储文件 内…...

Leetcode 股票买卖

买卖股票最佳时机 I II 不限制交易次数 prices [7,1,5,3,6,4] 启发思路&#xff1a;最后一天发生了什么&#xff1f; 从第0天到第5天结束时的利润 从第0天到第4天结束时的利润 第5天的利润 &#xff08;第5天的利润&#xff1a;0/-4/4&#xff09; 关键词&#xff1a;天…...

小白学习手册:轻松理解MQ消息队列

目录 # 开篇 RabbitMQ介绍 通讯概念 1. 初始MQ及类型 2. MQ的架构 2.1 RabbitMQ的结构和概念 2.2 RabbitMQ消息流示意图 3. MQ下载使用 3.1 Docker下载MQ参考 3.2 进入RabbitMQ # 开篇 MessagesQueue 是一个抽象概念&#xff0c;用于描述消息队列系统的一般特性和功能…...

electron线上更新

一、安装electron-updater npm install --save electron-updater二、在main.js中引入使用 import { autoUpdater } from electron; if (!isDev) {const serverUrl https://your-update-server.com; // 自定义更新服务器地址或GitHub Releases地址autoUpdater.setFeedURL(${…...

谈谈检测浏览器类型

前几天被问到如何检测浏览器类型&#xff0c;我突然发现我对此并不了解&#xff0c;之前的项目中也没有使用到过&#xff0c;只隐约记得通过一个自带的方法即可获取。所以今天特意来仔细补习一下。 核心&#xff1a;navigator.userAgent 1.正则表达式 2.引用外部库 3.判断浏…...

Django 和 Django REST framework 创建对外 API

1. 环境准备 确保你已经安装了 Python 和 Django。如果尚未安装 Django REST framework&#xff0c;通过 pip 安装它&#xff1a; pip install djangorestframework 2. 创建 Django 项目 如果你还没有 Django 项目&#xff0c;可以通过以下命令创建&#xff1a; django-ad…...

数据结构之“刷链表题”

&#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;数据结构 目录 前言 一、相交链表 题目链接 大致思路 代码实现 二、环形链表1 题目链接 大致思路 代码实现 三、环形链表2 题目链接 大致思路 代码实…...

复分析——第9章——椭圆函数导论(E.M. Stein R. Shakarchi)

第 9 章 椭圆函数导论 (An Introduction to Elliptic Functions) The form that Jacobi had given to the theory of elliptic functions was far from perfection; its flaws are obvious. At the base we find three fundamental functions sn, cn and dn. These functio…...

使用kubeadm安装k8s并部署应用

安装k8s 1. 准备机器 准备三台机器 192.168.136.104 master节点 192.168.136.105 worker节点 192.168.136.106 worker节点2. 安装前配置 1.基础环境 ######################################################################### #关闭防火墙&#xff1a; 如果是云服务器&…...

springMVC学习

概述 Spring MVC&#xff08;Model-View-Controller&#xff0c;模型-视图-控制器&#xff09;是Spring框架的一部分&#xff0c;用于构建基于Java的Web应用程序。它遵循MVC设计模式&#xff0c;分离了应用程序的不同方面&#xff08;输入逻辑、业务逻辑和UI逻辑&#xff09;&…...

深入探讨光刻技术:半导体制造的关键工艺

前言 光刻&#xff08;Photolithography&#xff09;是现代半导体制造过程中不可或缺的一环&#xff0c;它的精度和能力直接决定了芯片的性能和密度。本文将详细介绍光刻技术的基本原理、过程、关键技术及其在半导体制造中的重要性。 光刻技术的基本原理 光刻是一种利用光化…...

CesiumJS【Basic】- #042 绘制纹理线(Primitive方式)

文章目录 绘制纹理线(Primitive方式)1 目标2 代码2.1 main.ts3 资源文件绘制纹理线(Primitive方式) 1 目标 使用Primitive方式绘制纹理线 2 代码 2.1 main.ts var start = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883);var...

代码随想录第38天|动态规划

1049. 最后一块石头的重量 II 参考 备注: 当物体容量也等同于价值时, 01背包问题的含义则是利用好最大的背包容量sum/2, 使得结果尽可能的接近或者小于 sum/2 等价: 尽可能的平分成相同的两堆, 其差则为结果, 比如 (abc)-d, (ac)-(bd) , 最终的结果是一堆减去另外一堆的和, 问…...

java生成excel,uniapp微信小程序接收excel并打开

java引包&#xff0c;引的是apache.poi <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency> 写一个测试类&#xff0c;把excel输出到指定路径 public s…...

sam_out 目标检测的应用

缺点参考地址训练验证模型解析 缺点 词表太大量化才可 参考地址 https://aistudio.baidu.com/projectdetail/8103098 训练验证 import os from glob import glob import cv2 import paddle import faiss from out_yolo_model import GPT as GPT13 import pandas as pd imp…...

VLAN原理与配置

AUTHOR &#xff1a;闫小雨 DATE&#xff1a;2024-04-28 目录 VLAN的三种端口类型 VLAN原理 什么是VLAN 为什么使用VLAN VLAN的基本原理 VLAN标签 VLAN标签各字段含义如下&#xff1a; VLAN的划分方式 VLAN的划分包括如下5种方法&#xff1a; VLAN的接口链路类型 创建V…...

使用Spring Boot实现RESTful API

使用Spring Boot实现RESTful API 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨如何利用Spring Boot框架实现RESTful API&#xff0c;这是现…...

中英双语介绍美国常春藤联盟( Ivy League):八所高校

中文版 常春藤联盟简介 常春藤联盟&#xff08;Ivy League&#xff09;是美国东北部八所私立大学组成的高校联盟。虽然最初是因体育联盟而得名&#xff0c;但这些学校以其学术卓越、历史悠久、校友杰出而闻名于世。以下是对常春藤联盟的详细介绍&#xff0c;包括其由来、成员…...

【计算机网络】常见的网络通信协议

目录 1. TCP/IP协议 2. HTTP协议 3. FTP协议 4. SMTP协议 5. POP3协议 6. IMAP协议 7. DNS协议 8. DHCP协议 9. SSH协议 10. SSL/TLS协议 11. SNMP协议 12. NTP协议 13. VoIP协议 14. WebSocket协议 15. BGP协议 16. OSPF协议 17. RIP协议 18. ICMP协议 1…...

java实现http/https请求

在Java中&#xff0c;有多种方式可以实现HTTP或HTTPS请求。以下是使用第三方库Apache HttpClient来实现HTTP/HTTPS请求的工具类。 优势和特点 URIBuilder的优势在于它提供了一种简单而灵活的方式来构造URI&#xff0c;帮助开发人员避免手动拼接URI字符串&#xff0c;并处理参…...

NC204871 求和

链接 思路&#xff1a; 对于一个子树来说&#xff0c;子树的节点就包括在整颗树的dfs序中子树根节点出现的前后之间&#xff0c;所以我们先进行一次dfs&#xff0c;用b数组的0表示区间左端点&#xff0c;1表示区间右端点&#xff0c;同时用a数组来标记dfs序中的值。处理完dfs序…...

git克隆代码warning: could not find UI helper ‘git-credential-manager-ui‘

git克隆代码warning: could not find UI helper ‘git-credential-manager-ui’ 方案 git config --global --unset credential.helpergit-credential-manager configure...

Generator 是怎么样使用的以及各个阶段的变化如何

Generators 是 JavaScript 中一种特殊类型的函数&#xff0c;可以在执行过程中暂停&#xff0c;并且在需要时恢复执行。它们是通过 function* 关键字来定义的。Generator 函数返回的是一个迭代器对象&#xff0c;通过调用该迭代器对象的 next() 方法来控制函数的执行。在调用 n…...

一文了解Java中 Vector、ArrayList、LinkedList 之间的区别

目录 1. 数据结构 Vector 和 ArrayList LinkedList 2. 线程安全 Vector ArrayList 和 LinkedList 3. 性能 插入和删除操作 随机访问 4. 内存使用 ArrayList 和 Vector LinkedList 5. 迭代器行为 ArrayList 和 Vector LinkedList 6. 扩展策略 ArrayList Vecto…...

【论文复现|智能算法改进】基于自适应动态鲸鱼优化算法的路径规划研究

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 SCI二区|鲸鱼优化算法&#xff08;WOA&#xff09;原理及实现【附完整Matlab代码】 2.改进点 非线性收敛因子 WOA 主要通过控制系数向量 A 来决定鲸鱼是搜索猎物还是捕获猎物&#xff0c;即系数向量 A 可…...

【Win测试】窗口捕获的学习笔记

2 辨析笔记 2.1 mss&#xff1a;捕获屏幕可见区域&#xff0c;不适合捕获后台应用 Claude-3.5-Sonnet: MSS库可以用来捕获屏幕上可见的内容&#xff1b;然而&#xff0c;如果游戏窗口被其他窗口完全遮挡或最小化&#xff0c;MSS将无法捕获到被遮挡的游戏窗口内容&#xff0c;而…...

使用mq向队列发送消息流程

新建队列q1和q2绑定交换机和队列之间的消息路由向默认的交换机发送消息查看两个队列中的交换机消息&#xff08;get messages&#xff09;&#xff0c;也可以在overview选项卡页面查看实时流量图 这里注意&#xff1a; 1.交换机是转发消息用的&#xff0c;他并没有存储消息的…...

大模型 - 知识蒸馏原理解析

知识蒸馏的详细过程和原理解析 知识蒸馏是一种通过将大型预训练模型&#xff08;教师模型&#xff09;的知识传递给较小模型&#xff08;学生模型&#xff09;的方法。这样可以在减少模型的复杂度和计算资源需求的同时&#xff0c;尽量保留模型的性能。以下是知识蒸馏的详细过…...

HarmonyOS Next系列之Echarts图表组件(折线图、柱状图、饼图等)实现(八)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现&#xff08;一&#xff09; HarmonyOS Next 系列之验证码输入组件实现&#xff08;二&#xff09; HarmonyOS Next 系列之底部标签栏TabBar实现&#xff08;三&#xff09; HarmonyOS Next 系列之HTTP请求封装和Token…...

Postman编写测试脚本

在 Postman 中&#xff0c;编写测试脚本通常使用 JavaScript&#xff0c;这些脚本可以在请求发送前后执行。以下是一些示例代码&#xff0c;展示了如何在 Postman 中使用测试脚本。 1. 测试脚本示例&#xff1a;检查响应状态码 // 测试脚本在请求发送后执行 pm.test("Re…...

深入理解 CSS 选择器:全面指南

简述&#xff1a;CSS&#xff08;层叠样式表&#xff09;选择器是网页设计和开发中至关重要的工具。它们用于选择 HTML 元素并应用样式&#xff0c;使得网页变得美观和具有交互性。这里来记录一下&#xff0c;各种 CSS 选择器及其使用方法。 一. Css各种选择器的权重 !importa…...

CorelDRAW2024设计师的神器,一试就爱上!

&#x1f3a8; CorelDRAW 2024&#xff1a;设计界的瑞士军刀&#xff0c;让创意不再受限&#xff01;&#x1f31f; 嗨&#xff0c;各位朋友们&#xff01;&#x1f44b;&#x1f3fb; 今天我要跟大家分享一个神奇的设计神器——CorelDRAW 2024。作为设计师的你&#xff0c;是否…...

售24.69万元,智己L6新车型上市!产品力如何?

近日,智己旗下新车——2024款智己L6 Max 长续航欧版正式上市!定位为纯电中大型轿车。新车为新增车型,共推出了1款车型,售价为24.69万元,产品力如何呢?具体来了解一下!首先来看外观方面,新车采用了纯电车型惯用的封闭式格栅设计,搭配两侧个性犀利的大灯组,内部结构清晰…...

2种动力配置,标配48英寸大屏,全新雷克萨斯LM马来西亚上市

近日,从海外媒体报道获悉,雷克萨斯正式宣布在马来西亚市场上市全新雷克萨斯LM。据悉,新车推出LM350h 和LM500h两款车型,售价分别为1,228,000 马来西亚林吉特 与1,468,000 马来西亚林吉特 (折合人民币约226.80万元)。外观上,全新雷克萨斯LM依旧承袭雷克萨斯最新一代家族设计…...

非量表题如何进行信效度分析

效度是指设计的题确实在测量某个东西&#xff0c;一般问卷中使用到。如果是量表类的数据&#xff0c;其一般是用因子分析这种方法去验证效度水平&#xff0c;其可通过因子分析探究各测量量表的内部结构情况&#xff0c;分析因子分析得到的内部结构与自己预期的内部结构进行对比…...

15、Spring系统-AOP

ProxyFactory选择cglib或jdk动态代理原理 ProxyFactory在生成代理对象之前需要决定到底是使用JDK动态代理还是CGLIB技术&#xff1a; 代理对象创建过程 JdkDynamicAopProxy 在构造JdkDynamicAopProxy对象时&#xff0c;会先拿到被代理对象自己所实现的接口&#xff0c;并且…...

【15年成为通用MCU第一,STM32凭什么?】

微控制器&#xff08;MCU&#xff09;是这个快速变化世界的重要助推器和核心组成部分&#xff0c;也是整个数字世界应用最普遍的数字芯片之一。通用MCU市场竞争情况复杂且多样&#xff0c;开发者需要选择最适合的MCU产品完成创新设计。而MCU市场竞争发展的重点一定是以开发者为…...

Google Benchmark库 简介

在C中&#xff0c;进行性能测试&#xff08;Benchmarking&#xff09;是一个常见的需求&#xff0c;用以测量代码块的执行时间&#xff0c;从而对代码进行优化。Google Benchmark库是一个广泛使用的C库&#xff0c;专门用于编写稳健的基准测试。以下是如何使用Google Benchmark…...