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

【ONE·C || 文件操作】

总言

  C语言:文件操作。
  

文章目录

  • 总言
  • 1、文件是什么?为什么需要文件?
    • 1.1、为什么需要文件?
    • 1.2、文件是什么?
  • 2、文件的打开与关闭
    • 2.1、文件指针
    • 2.2、文件打开和关闭:fopen、fclose
    • 2.3、文件使用方式
  • 3、文件的顺序读写
    • 3.1、字符输入输出:fputc、fgetc
      • 3.1.1、fputc
      • 3.1.2、fgetc
    • 3.2、适用于所有流:stream的简单介绍
    • 3.3、文本输入输出:fputs、fgets
      • 3.3.1、fputs
      • 3.3.2、fgets
    • 3.4、格式化输入输出:fscanf、fprintf
      • 3.4.1、fprintf
      • 3.4.2、fscanf
    • 3.5、与字符串相关的输入输出:sscanf、sprintf
      • 3.5.1、对比说明
      • 3.5.2、使用介绍
    • 3.6、二进制输入输出:fread、fwrite
      • 3.6.1、fwrite
      • 3.6.2、fread
  • 4、文件的随机读写
    • 4.1、fseek
    • 4.2、ftell
    • 4.3、rewind
  • 5、其它相关内容
    • 5.1、文本文件和二进制文件
    • 5.2、文件读取结束判定
    • 5.3、文件缓冲区

  

1、文件是什么?为什么需要文件?

1.1、为什么需要文件?

  模拟实现通讯录时,会面临这样一个实际问题:在通讯录中把信息记录下来后,只有在我们自己选择删除数据的情况下,数据才不复存在,否则需要长久保留数据。
  这就涉及到了数据持久化的问题,一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据库等方式。使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。
  
  

1.2、文件是什么?

  1)、文件分类
  磁盘上的文件是文件。但在程序设计中,从文件功能的角度来看,一般文件有两种:程序文件、数据文件。
  程序文件:包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。
  数据文件: 文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。
  
  
  2)、文件名称
  一个文件要有一个唯一的文件标识,以便用户识别和引用。为了方便起见,文件标识常被称为文件名
  文件名包含3部分:文件路径+文件名主干+文件后缀

D:\日常\TIM\Tencent Files\All Users\test.txt
文件路径:D:\日常\TIM\Tencent Files\All Users\
文件名主干:test
文件后缀:.txt

  
  
  

2、文件的打开与关闭

2.1、文件指针

  1)、文件指针是什么?

  缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。
  每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名FILE
在这里插入图片描述

  不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。
  
  
  VS2019下FILE声明:

#ifndef _FILE_DEFINED#define _FILE_DEFINEDtypedef struct _iobuf{void* _Placeholder;} FILE;
#endif

  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结构的变量,这样使用起来更加方便。
在这里插入图片描述
  
  2)、文件指针的作用

  我们可以创建一个FILE*的指针变量,如下:

FILE* pf;

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

2.2、文件打开和关闭:fopen、fclose

  1)、fopen、fclose函数介绍
  相关函数链接:fopen
在这里插入图片描述

fopen
FILE * fopen ( const char * filename, const char * mode );

  const char * filename:所需要打开的文件名称。
  const char * mode:打开文件的方式,此处类型为字符指针,用于存放字符串首字符的地址。
  FILE *:在内存中创建一个与打开文件有关的文件信息区,同时返回一个文件指针,该指针指向文件信息区的起始地址(结构体)。
  NULL:如果文件打开失败,则返回空指针,同动态内存一致,需要进行判空操作,若错误则显示错误原因,并结束程序。
  
  
  相关链接:fclose
在这里插入图片描述

fclose
int fclose ( FILE * stream );

  FILE * stream:向指定要关闭的FILE指针
  
  
  2)、使用举例

int main()
{//打开文件FILE* pf = fopen("test.txt", "r");//“r”此处为字符串,用双引号,r是一种文件读取模式if (pf == NULL){perror("fopen");return 1;}//读文件//……//关闭文件fclose(pf);pf = NULL;return 0;
}

  情形一:
在这里插入图片描述

  情形二:
在这里插入图片描述
  
  情形三:绝对路径与相对路径说明
  假如要打开的文件不在当前路径下,需要使用对应路径打开:
在这里插入图片描述
  
  
  

2.3、文件使用方式

  以下mode会在后续学习中慢慢用到。
在这里插入图片描述
  
  
  

3、文件的顺序读写

在这里插入图片描述

3.1、字符输入输出:fputc、fgetc

3.1.1、fputc

  相关函数链接:fputc
在这里插入图片描述

fputc
int fputc ( int character, FILE * stream );

  将字符character按顺序写入对应的文件流stream中,此处使用的是文件指针。如果失败则返回EOF。

  演示如下:

int main()
{//打开文件FILE* pf = fopen("D:\\Daily\\test.txt", "w");if (pf == NULL){perror("fopen");return 1;}//读写文件for (char ch = 'a'; ch <= 'z'; ch++){fputc(ch, pf);}//关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

  
  
  

3.1.2、fgetc

  相关函数链接:fgetc
在这里插入图片描述

fgetc
int fgetc ( FILE * stream );

  从对应的文件指针指向的文件中按顺序依次读取字符,若遇到文件结尾/错误则返回EOF,若成功则返回字符读取(提升为 int 值)。
  
  使用演示:

int main()
{//打开文件FILE* pf = fopen("D:\\Daily\\test.txt", "r");if (pf == NULL){perror("fopen");return 1;}//读写文件int ch;while ((ch = fgetc(pf)) != EOF){printf("%c ", ch);}//关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

  
  

3.2、适用于所有流:stream的简单介绍

  我们知道各种各样的外部设备,比如键盘、屏幕、U盘、硬盘、网卡等,数据信息的读写在它们之间进行交换,但不同的设备其读写方式可能存在差异,这样一来使用效率就会大幅降低,因为我们在做数据输入输出的前提是要学习了解它们的原理。因此,为了简化这一过程,我们在这些外设间引入一个中间商,即流,用于输入输出。这样一来,我们在各种数据交换时,就不必关心流与这些外设间是如何做到数据信息交换的,相当于一种封装。

在这里插入图片描述

  相关演示:

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

在这里插入图片描述
  
  
  

3.3、文本输入输出:fputs、fgets

3.3.1、fputs

  相关函数链接:fputs
在这里插入图片描述
  相关演示:

int main()
{//打开文件FILE* pf = fopen("D:\\Daily\\test.txt", "w");if (pf == NULL){perror("fopen");return 1;}//读写文件fputs("落霞与孤鹜齐飞,", pf);fputs("秋水共长天一色。\n", pf);fputs("渔舟唱晚,响穷彭蠡之滨;\n", pf);fputs("雁阵惊寒,声断衡阳之浦。\n", pf);//关闭文件fclose(pf);pf = NULL;return 0;
}

  可以看到,没加换行符,fputs会将当前内容放置于上此文尾,若加了换行符则另起一行。
在这里插入图片描述

  
  

3.3.2、fgets

  相关函数链接:fgets
在这里插入图片描述

  若成功,则返回str指针指向地址,若失败,则返回NULL;
  
  相关演示一:

int main()
{//打开文件FILE* pf = fopen("D:\\Daily\\test.txt", "r");if (pf == NULL){perror("fopen");return 1;}char arr[255];//读写文件fgets(arr, 254, pf);printf("%s\n", arr);while (fgets(arr, 254, pf)!=NULL)printf("%s", arr);//关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
  
  
  验证fgets会保留一位将\0放入:

int main()
{//打开文件FILE* pf = fopen("D:\\Daily\\test.txt", "r");if (pf == NULL){perror("fopen");return 1;}char arr[10]="XXXXXXXXXX";//读写文件fgets(arr, 5, pf);printf("%s\n", arr);//关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
  
  
  
  

3.4、格式化输入输出:fscanf、fprintf

3.4.1、fprintf

  相关函数链接:printf
在这里插入图片描述
  printf是将相关内容打印到标准输出,即屏幕上;
  fprintf适用于任意流,可将相关内容打印到指定的stream中。
  
  相关演示:

struct st
{char name[20];int age;double score;
};int main()
{//创建一个学生数据,要求:将该学生数据的内容存入指定文件中struct st s1 = { "张三",25,98.00 };//打开文件FILE* pf = fopen("D:\\Daily\\test.txt", "w");if (pf == NULL){perror("fopen");return 1;}//读写文件fprintf(pf,"%s %d %lf", s1.name, s1.age, s1.score);//关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

  
  

3.4.2、fscanf

  相关函数链接:fscanf
在这里插入图片描述

  scanf是从标准输入流中读取数据,一般是键盘;
  fscanf适用于任意流,可从指定的流stream中读取数据。
  
  相关演示:

struct st
{char name[20];int age;double score;
};int main()
{//创建一个学生数据,要求:从指定文件中读取相关数据信息填入该结构体中struct st s1 = {0};//打开文件FILE* pf = fopen("D:\\Daily\\test.txt", "r");if (pf == NULL){perror("fopen");return 1;}//读写文件fscanf(pf, "%s %d %lf", s1.name, &(s1.age), &(s1.score));//注意,name为数组名,本身就是地址,故无需取地址操作符,其它二者读取时与scanf别无差异fprintf(stdout, "%s %d %lf", s1.name, s1.age, s1.score);//关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

  
  
  

3.5、与字符串相关的输入输出:sscanf、sprintf

3.5.1、对比说明

  1)、scanf/printf、fscanf/fprintf、sscanf、sprintf对比说明

  scanf:针对标准输入输出流的格式化输入函数,Read formatted data from stdin
  printf:针对标准化输入输出流的格式化输出函数,Print formatted data to stdout

scanf
int scanf ( const char * format, ... );
printf
int printf ( const char * format, ... );

  
  fscanf:针对所有输入流的格式化输入函数,Read formatted data from stream
  fprintf:针对所有输出流的格式化输出函数,Write formatted data to stream

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

  
  sscanf:把一个字符串数据转换为格式化数据,Read formatted data from string
  sprintf:把一个格式化的数据转换为字符串数据,Write formatted data to string

sscanf
int sscanf ( const char * s, const char * format, ...);
sprintf
int sprintf ( char * str, const char * format, ... );

  
  

3.5.2、使用介绍

  相关函数链接:sprintf
在这里插入图片描述
  
  相关函数链接:sscanf
在这里插入图片描述

  
  使用举例:

struct st
{char name[20];int age;double score;
};int main()
{//打开文件FILE* pf = fopen("D:\\Daily\\test.txt", "r");if (pf == NULL){perror("fopen");return 1;}//读写操作struct st s1 = { "李四",23,94.5 };//原数据struct st stof = { 0 };//未赋有效值的结构体:用于存放从字符串中转换过来的格式化数据char ftos[255];//字符数组:用于存放从格式化数据中转换得到的字符串//使用sprintf,将格式化数据转换成字符串sprintf(ftos, "%s %d %lf", s1.name, s1.age, s1.score);printf("ftos数组中:%s\n", ftos);//使用sscanf,将字符串转换为格式化数据sscanf(ftos, "%s %d %lf", stof.name, &(stof.age), &(stof.score));printf("stof结构体中:%s %d %lf\n", stof.name, stof.age, stof.score);//关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
  
  
  

3.6、二进制输入输出:fread、fwrite

3.6.1、fwrite

  相关函数链接:fwrite
在这里插入图片描述
  注意理解该函数各参数含义,ptr是要写入的元素数组的指针,size是单个此类数据的大小(每个元素的大小),count是要写入这类数据的数目(元素个数),stream为指定输出的流。

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

  相关演示:

struct st
{char name[20];int age;double score;
};int main()
{//打开文件FILE* pf = fopen("D:\\Daily\\test.txt", "wb");if (pf == NULL){perror("fopen");return 1;}//读写操作struct st s1 = { "李四",23,94.5 };fwrite(&s1, sizeof(struct st), 1, pf);//含义:将s1中的数据输出至pf中,个数为1个,每个大小为sizeof(struct st)//关闭文件fclose(pf);pf = NULL;return 0;
}

  
在这里插入图片描述

  
  

3.6.2、fread

  相关函数链接:fread
在这里插入图片描述

  
  相关演示:

struct st
{char name[20];int age;double score;
};int main()
{//打开文件FILE* pf = fopen("D:\\Daily\\test.txt", "rb");if (pf == NULL){perror("fopen");return 1;}//读写操作struct st s1 = { 0 };fread(&s1, sizeof(struct st), 1, pf);printf("%s %d %lf\n", s1.name, s1.age, s1.score);//关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
  
  
  

4、文件的随机读写

4.1、fseek

  相关函数链接:fseek
  根据文件指针的位置和偏移量,重新定位文件指针。
在这里插入图片描述

SEEK_SET	Beginning of file
SEEK_CUR	Current position of the file pointer
SEEK_END	End of file *

  
  1)、关于随机位置读取


int main()
{//打开文件FILE* pf = fopen("D:\\Daily\\test.txt", "r");if (pf == NULL){perror("fopen");return 1;}//文件读写////文件中存储的例句:turn lemon into lemonade.for (int i = 0; i < 4; i++){printf("%c", fgetc(pf));//turn}printf("\n");//至此,文件指针指向trun lemon中的空白字符//演示一:以当前文件指针作为参考点fseek(pf, -1, SEEK_CUR);//当前指向turn中的nprintf("文件向左偏移一位后:%c\n", fgetc(pf));//fgetc读取后后挪一位,到空白字符fseek(pf, 1, SEEK_CUR);//当前指向为lemon中的lprintf("文件向右偏移一位后:%c\n", fgetc(pf));//fgetc读取后后挪一位,到eprintf("\n");//演示二:以文件头作为参考点,此时偏移量不能为负数fseek(pf, 3, SEEK_SET);//当前指向trun中的nprintf("文件向右偏移三位后:%c\n", fgetc(pf));printf("再次读取一位:%c\n", fgetc(pf));printf("\n");//演示三:以文件尾作为参考点,此时偏移量不能为正数fseek(pf, -3, SEEK_END);//当前指向为lemonade.中的dprintf("文件向左偏移三位后:%c\n", fgetc(pf));printf("再次读取一位:%c\n", fgetc(pf));printf("\n");////关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

  
  
  2)、关于随机位置写入

int main()
{//打开文件FILE* pf = fopen("D:\\Daily\\test.txt", "w");if (pf == NULL){perror("fopen");return 1;}//文件读写//for (char ch = 'a'; ch <='z'; ch++){fputc(ch,pf);}//演示一:以当前文件指针作为参考点fseek(pf, -22, SEEK_CUR);fputc('S', pf);//演示二:以文件头作为参考点,此时偏移量不能为负数fseek(pf, 6, SEEK_SET);fputc('O', pf);//演示三:以文件尾作为参考点,此时偏移量不能为正数fseek(pf, -3, SEEK_END);fputc('S', pf);////关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

  
  
  

4.2、ftell

  返回文件指针相对于起始位置的偏移量
  相关函数链接:ftell
  
  代码演示如下:

int main()
{//打开文件FILE* pf = fopen("D:\\Daily\\test.txt", "w");if (pf == NULL){perror("fopen");return 1;}//文件读写//for (char ch = 'a'; ch <='z'; ch++){fputc(ch,pf);}fseek(pf, -22, SEEK_CUR);fputc('S', pf);long int pos = ftell(pf);printf("%ld\n", pos);////关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

  
  

4.3、rewind

  相关函数链接:rewind
  让文件指针的位置回到文件的起始位置
在这里插入图片描述

  相关演示:

int main()
{//打开文件FILE* pf = fopen("D:\\Daily\\test.txt", "w");if (pf == NULL){perror("fopen");return 1;}//文件读写//for (char ch = 'a'; ch <='z'; ch++){fputc(ch,pf);}fseek(pf, -22, SEEK_CUR);fputc('S', pf);long int pos = ftell(pf);printf("%ld\n", pos);rewind(pf);printf("%ld\n", ftell(pf));////关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
  
  
  
  

5、其它相关内容

5.1、文本文件和二进制文件

  1)、数据文件分类
  根据数据的组织形式,数据文件被称为文本文件或者二进制文件
  数据在内存中以二进制的形式存储,如果不加转换直接输出到外存,就是二进制文件。
  如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。
在这里插入图片描述

  
  
  2)、数据在内存中的存储方式
  字符型数据一律以ASCII形式存储;
  数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。
  
  

  3)、举例演示
  以整数10000为例子:
在这里插入图片描述
  
  一个测试代码:
  我们以二进制的形式将正数10000写入文件中

#include <stdio.h>
int main()
{int a = 10000;FILE* pf = fopen("D:\\Daily\\test.txt", "wb");fwrite(&a, 4, 1, pf);//二进制的形式写到文件中fclose(pf);pf = NULL;return 0;
}

  假如用文本文件的形式打开,可以看到是乱码
在这里插入图片描述
  现在我们在VS中以二进制的形式打开,需要做一点设置,操作如下:
在这里插入图片描述
在这里插入图片描述

  
  
  
  

5.2、文件读取结束判定

  1)、关于feof函数说明
  在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。feof是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。
在这里插入图片描述
  
  
  2)、关于文件读取结束说明
  根据文件类型的区别,判断文件读取结束具有一定区别:

  对文本文件读取是否结束,有两种判断方法:1、判断返回值是否为 EOF;2、判断返回值是否为 NULL 。
  例如:fgetc 函数中,判断文件读取结束是看是否返回 EOF,而fgets判断文件读取结束是看返回值是否为 NULL

  对二进制文件读取是否结束,可通过返回值是否小于实际要读的个数来判断。
  例如:fread判断返回值是否小于实际要读的个数。
  
  
  

5.3、文件缓冲区

  1)、什么是文件缓冲区
  ANSIC 标准采用“缓冲文件系统”处理的数据文件。所谓缓冲文件系统,是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。

  2)、为什么需要文件缓冲区
  文件缓冲区是一个链接内存与硬盘的过渡段,从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。之所以要这样做,是因为内存和硬盘处理数据的速度不一,若直接从磁盘中读取数据输送到内存, 会面临频繁访问、占用内存资源的现象。故而在二者之间搭建出一个中间商。
  需要注意的是,缓冲区的大小是根据C编译的系统来决定。
  
  
  
  
  

相关文章:

【ONE·C || 文件操作】

总言 C语言&#xff1a;文件操作。    文章目录总言1、文件是什么&#xff1f;为什么需要文件&#xff1f;1.1、为什么需要文件&#xff1f;1.2、文件是什么&#xff1f;2、文件的打开与关闭2.1、文件指针2.2、文件打开和关闭&#xff1a;fopen、fclose2.3、文件使用方式3、文…...

cmd窗口中java命令报错。错误:找不到或无法加载主类 java的jdk安装过程中踩过的坑

错误: 找不到或无法加载主类 HelloWorld 遇到这个问题时&#xff0c;我尝试过网上其他人的做法。有试过添加classpath&#xff0c;也有试过删除classpath。但是依然报错&#xff0c;这里javac可以编译通过&#xff0c;说明代码应该是没有问题的。只是在运行是出现了错误。我安装…...

Breathwork(呼吸练习)

查了下呼吸练习相关内容&#xff0c;做个记录。我又在油管学习啦。 喜欢在you. tube看一些self-help相关的内容。比如学习方法、拉伸、跑步、力量举、自重锻炼等等。 总是听Obi Vicent说起Breathwork&#xff0c;比如&#xff1a; My 6am Morning Routine | New Healthy Habit…...

taobao.itemprops.get( 获取标准商品类目属性 )

&#xffe5;开放平台基础API不需用户授权 通过设置必要的参数&#xff0c;来获取商品后台标准类目属性&#xff0c;以及这些属性里面详细的属性值prop_values。 公共参数 请求地址: HTTP地址 http://gw.api.taobao.com/router/rest 公共请求参数: 公共响应参数: 请求参数 点…...

QT配置安卓环境(保姆级教程)

目录 下载环境资源 JDK1.8 NDK SDK ​安装QT 配置环境 下载环境资源 JDK1.8 介绍JDK是Java开发的核心工具&#xff0c;为Java开发者提供了一套完整的开发环境&#xff0c;包括开发工具、类库和API等&#xff0c;使得开发者可以高效地编写、测试和运行Java应用程序。 下载…...

【uni-app教程】八、UniAPP Vuex 状态管理

八、UniAPP Vuex 状态管理 概念 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 应用场景 Vue多个组件之间需要共享数据或状态。 关键规则 State&#xff1a…...

同花顺测试面经(30min)

大概三十分钟&#xff0c;面试官人还挺好的 1.自我介绍 2.详细问你了自我介绍中的一个实习经历 3.对我们公司有什么了解 &#xff01;&#xff01;&#xff08;高频&#xff09; 4.对测试有什么看法&#xff0c;为什么选测试 5.黑盒白盒分别是什么 6.对测试左移有什么看法…...

C++-简述#ifdef、#else、#endif和#ifndef的作用

回答如下&#xff1a; #ifdef&#xff0c;#else&#xff0c;#endif和#ifndef都是预处理指令&#xff0c;用于条件编译。#ifdef&#xff1a;这个指令用来判断一个宏是否已经被定义过&#xff0c;如果已经定义过&#xff0c;则执行后面的代码块。#else&#xff1a;这个指令一般与…...

VictoriaMetrics 集群部署

官网 ## 官网 https://github.com/VictoriaMetrics/VictoriaMetrics 集群角色详解 VictoriaMetrics 集群模式。主要由 vmstorage ,vminsert,vmselect 三部分组成&#xff0c;这三个组件每个组件都可以单独进行扩展。其中: vmstorage 负责提供数据存储服务vminsert 是数据存…...

【基于感知损失的无监督泛锐化】

PercepPan: Towards Unsupervised Pan-Sharpening Based on Perceptual Loss &#xff08;PercepPan&#xff1a;基于感知损失的无监督泛锐化&#xff09; 在基于神经网络的全色锐化文献中&#xff0c;作为地面实况标签的高分辨率多光谱图像通常是不可用的。为了解决这个问题…...

在vercel上用streamlit部署网站

Verce和Streamlit都是非常流行的Web应用程序部署平台。以下是从零开始在Vercel上部署Streamlit应用程序的一些基本步骤。 安装 Streamlit 在本地计算机上安装Streamlit。可以轻松地通过在命令行中运行以下命令来安装&#xff1a; pip install streamlit为 Streamlit 应用程序…...

华为OD机试题 - 斗地主(JavaScript)| 含思路

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜索引擎搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:斗地主题目输入输出描述示例一输入输出示例二输…...

i.MX8MP平台开发分享(clock篇)-计算clock速度相关的内核API

专栏目录:专栏目录传送门 平台内核i.MX8MP5.15.71文章目录 clk消费者clk生产者clk_set_rateclk_round_rateclk_pll1443x_recalc_rate这一篇我们具体来看看其他驱动如何使用clock,这里以lcdif驱动为例。 IMX8MP_CLK_MEDIA_BLK_CTRL_LCDIF_PIXEL是门控时钟,名为pix,这个门控时…...

实验4 设计模式实验3

实验内容: 1. 某软件公司为新开发的智能手机控制与管理软件提供了一键备份功能,通 过该功能可以将原本存储在手机中的通信录、短信、照片、歌曲等资料一次性全 部拷贝到移动存储介质(例如MMC 卡或SD 卡)中。在实现过程中需要与多个 已有的类进行交互,例如通讯录管理类、短信…...

CNN基础

Tip&#xff1a;仅供自己学习记录&#xff0c;酌情参考 1. 前馈与反馈神经网络 神经网络有前馈神经网络和反馈神经网络&#xff0c;前向神经网络也就是前馈神经网络。 前馈型神经网络各神经元接收前一层的输入&#xff0c;并输出给下一层&#xff0c;没有反馈。节点分为两类…...

【UEFI基础】UEFI事件介绍

简述 在【UEFI基础】System Table和Architecture Protocols介绍Boot Service时提到有一部分与事件相关的接口&#xff0c;它们创建、触发、等待和关闭事件&#xff0c;来完成某些功能&#xff0c;本文将进一步介绍事件。 需要注意&#xff0c;因为Boot Service需要在DXE阶段才…...

Markdown 语法速查表

Markdown 速查表提供了所有 Markdown 语法元素的基本解释。如果你想了解某些语法元素的更多信息&#xff0c;请参阅更详细的基本语法和拓展语法。 #基本语法 这些是 John Gruber 的原始设计文档中列出的元素。所有 Markdown 应用程序都支持这些元素。 元素Markdown 语法标题…...

【C++】-- 类型转换

目录 前言 C语言中的类型转换 C强制类型转换 static_cast&#xff08;static静止的&#xff09; reinterpret_cast&#xff08;reinterpret重新解释&#xff09; const_cast&#xff08;const常量&#xff09; 总结 dynamic_cast&#xff08;dynamic动态&#xff09; …...

汇编基础语法和指令总结+案例(用32位汇编实现插入排序)

目录 前提知识 案例 c的插入排序 32位汇编代码 代码分析 效果展示 前提知识 常用指令add指令 sub指令 mul乘法指令 div除法指令 inc&#xff08;自增&#xff09;&#xff08;即&#xff09; dec&#xff08;自减&#xff09;&#xff08;即--&#xff09; cmp&#xf…...

C++多线程--线程安全的单例模式

0 引言 由于最近事情比较多,所以很久没有更新相应的专栏了。目前事情基本告一段落,重新恢复相应专栏的更新。 本文主要讲解在C++并发编程中如何实现线程安全的单例模式。本文主要由如下几部分构成 臭名昭著的double-check单例实现四种线程安全的单例模式单例模式使用中所带…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

SpringAI实战:ChatModel智能对话全解

一、引言&#xff1a;Spring AI 与 Chat Model 的核心价值 &#x1f680; 在 Java 生态中集成大模型能力&#xff0c;Spring AI 提供了高效的解决方案 &#x1f916;。其中 Chat Model 作为核心交互组件&#xff0c;通过标准化接口简化了与大语言模型&#xff08;LLM&#xff0…...