当前位置: 首页 > 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单例实现四种线程安全的单例模式单例模式使用中所带…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

GraphRAG优化新思路-开源的ROGRAG框架

目前的如微软开源的GraphRAG的工作流程都较为复杂&#xff0c;难以孤立地评估各个组件的贡献&#xff0c;传统的检索方法在处理复杂推理任务时可能不够有效&#xff0c;特别是在需要理解实体间关系或多跳知识的情况下。先说结论&#xff0c;看完后感觉这个框架性能上不会比Grap…...

内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献

Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译&#xff1a; ### 胃肠道癌症的发病率呈上升趋势&#xff0c;且有年轻化倾向&#xff08;Bray等人&#xff0c;2018&#x…...

CTF show 数学不及格

拿到题目先查一下壳&#xff0c;看一下信息 发现是一个ELF文件&#xff0c;64位的 ​ 用IDA Pro 64 打开这个文件 ​ 然后点击F5进行伪代码转换 可以看到有五个if判断&#xff0c;第一个argc ! 5这个判断并没有起太大作用&#xff0c;主要是下面四个if判断 ​ 根据题目…...