确定不进来看看吗?详细讲解C语言文件操作(示例分析每个函数)

news2024/12/23 0:01:25

在这里插入图片描述

前言

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
🐻推荐专栏: 🍔🍟🌯 c语言初阶
🔑个人信条: 🌵知行合一
🍉本篇简介:>:讲解c语言中的文件操作,文件的读取,输入输出,流的概念?举例介绍输入输出函数,缓存区等.
金句分享:
✨我的肩上是风,风上是闪耀的星群!✨

目录

  • 前言
  • 一、学习文件操作的意义
  • 二、文件是什么?
    • 2.1 文件分类
    • 2.2 文件名的组成
  • 三、如何使用代码打开和关闭文件?
    • 3.1 文件"打开方式"表
    • 3.2 "流"是什么意思?(很重要)
  • 四、开启正式的读写文件操作
    • 4.1 文件的顺序读写
      • 对于输入\输出函数的简单示例:
        • 4,11 fputc函数
        • 'w',(只写)从内存写/输出数据到文件中
        • 4.12 fgetc函数
        • 'r',(只读),从文件中读数据到内存
        • 4.13 fputs函数
        • 'a',追加向文件末尾写数据.
        • 4.14 fgets函数
        • 4.15 fsacnf函数与fprintf函数
        • 4.16 fread函数和fwrite函数
    • 4.2 文件的随机读写
      • fseek函数:
      • ftell函数
      • rewind函数
    • 4.3 文本文件 与 二进制文件的区别
  • 五、文件结束的判定
    • feof函数
  • 六、文件缓冲区

一、学习文件操作的意义

C语言的文件操作其实很少用到,因为在后期工作中他们大多数都被封装好了,我们直接使用就行,但是对于一名修内功的程序员,了解更加底层的实现方式,还是很有价值的.

还记得之前实现的通讯录吗?
每次重新打开通讯录,里面的数据都是空的,即使上次有输入过数据,但是每次退出通讯录之后,数据都会被丢弃了.这就很不方便,如果我们想将之前通讯录的数据保留下来(即关闭程序后,下次打开,数据还在),数据如果保存在内存中,数据断电就会丢失,此时我们可以使用文件操作,将数据保存在硬盘中.这样就可以让数据持久化.

二、文件是什么?

2.1 文件分类

磁盘上的文件就是文件。(说了等于没说)😂😂😂

在程序设计中,我们所说的文件指按文件功能来分类,主要有两种:
1.程序文件:

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

2.数据文件

文件的内容不一定是程序,也可以是程序运行时读写的数据,向文件中写入数据,或者从数据文件中读取数据,这类文件被称为数据文件.

在这里插入图片描述

本篇文章主要讨论如何对文件进行读写操作(写:向文件写入数据,读:从文件中读取数据),所以重点是讲解数据文件.

2.2 文件名的组成

上面只谈到了后缀名,那文件名有哪些部分组成呢?
一个文件要有一个唯一的文件标识,一方面让电脑能够识别和查找,另一方面以便用户识别和引用。

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

E:\编程\代码库\c语言代码库\进阶\c-language---advanced\文件操作\test.c

文件路径:E:\编程\代码库\c语言代码库\进阶\c-language---advanced\文件操作
文件名主干:test
文件后缀名:.c

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

三、如何使用代码打开和关闭文件?



文件指针:

首先我们介绍一下文件指针,每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字文件状态文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名FILE,而文件指针是指向该结构体的指针.即指向某一文件的指针变量,
在这里插入图片描述

不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。不过这点我们并不关心,我们只需要会使用FILE就行.

如何使用FILE指针呢?
这就是我们下面要讲解的文件的打开和关闭内容.
我们在使用文件时,要先将这个文件打开,并且结束后将文件关闭.

在这里插入图片描述

在这里插入图片描述

//打开文件
FILE * fopen ( const char * filename, const char * mode );
//关闭文件
int fclose ( FILE * stream )

参数说明:

fopen:

参数含义
filename要打开的文件的文件名
mode打开方式

该函数,如果打开文件失败,返回NULL指针

fclose:

参数含义
stream指向要关闭的文件指针

打开方式详见如下表:

3.1 文件"打开方式"表

使用方式含义文件状态(不存在)
“r”(只读)为了输入数据,打开一个已经存在的文本文件出错
“w”(只写)为了输出数据,打开一个文本文件建立一个新的文件
“a”(追加)向文本文件尾添加数据建立一个新的文件
“rb”(只读)为了输入数据,打开一个二进制文件出错
“wb”(只写)为了输出数据,打开一个二进制文件建立一个新的文件
“ab”(追加)向一个二进制文件尾添加数据出错
“r+”(读写)为了读和写,打开一个文本文件出错
“w+”(读写)为了读和写,建议一个新的文件建立一个新的文件
“a+”(读写)打开一个文件,在文件尾进行读写建立一个新的文件
“rb+”(读写)为了读和写打开一个二进制文件出错
“wb+”(读写)为了读和写,新建一个新的二进制文件建立一个新的文件
“ab+”(读写)打开一个二进制文件,在文件尾进行读和写建立一个新的文件

这张表只是介绍了用何种方式打开文件进行读写,那具体怎样读写呢?↓

在这里插入图片描述

3.2 "流"是什么意思?(很重要)

如果我们需要进行数据交换的对象是显示器,文件,网络,打印机等输出设备时,我们需要了解每一个对象的读写方式吗?这未免也要麻烦了,对操作人员的要求是不是也很高?
那我们就引入了的概念,我们只需要通过流来进行输入输出操作就行了,对应的实现C语言帮我们搞定了.
在这里插入图片描述

一个C语言程序,打开后,默认会打开三个流(stream):

  1. stdin:标准输入流 --键盘
  2. stdout:标准输出流 --显示器
  3. stderr:标准错误流

要分清输入输出的概念:

常见的键盘读取和显示器输出:↓
在这里插入图片描述

文件输入输出:↓
在这里插入图片描述

总结:

对于freadfwrite函数,它们两个只针对文件流负责
scanfprintf标准的输入和输出流,他们也只针对键盘显示器(屏幕)负责.
而其他函数,他们既可以从键盘读取数据,也可以从文件或者其他流读取数据.

向内存存数据是输入操作,找内存要数据就是输出.
上面的一个是键盘往内存输入数据,一个是文件往内存中存.

四、开启正式的读写文件操作

有了上面的基础知识的学习,我们现在可以开始写文件了.

#include <stdio.h>
int main()
{
	FILE* pFile;
	//打开文件
	pFile = fopen("123.txt", "r");
	//文件名:123    --这里是相对路径
	//文件名后缀:.txt
	//打开方式:"r"  --为了输入数据,打开一个已经存在的文本文件 
	if (pFile != NULL)
	{
		fputs("Hello World !", pFile);
	}
	else
	{
		printf("打开失败");
		return 1;//返回非0
	}
	//关闭文件
	fclose(pFile);
	return 0;
}

运行结果:

打开失败

原因:
在相对路径下,没有"123.txt"文件.

补充知识:

1、相对路径:就是相对于自己的目标文件的位置。从当前文件所在文件夹开始(指以当前文件所处目录而言文件的位置)————以引用文件之间网页所在位置为参考基础,而建立出的目录路径。故称之为相对。
例如:123.txt(它的当前目录就是test.c所在的文件夹)

2、绝对路径:是指文件在硬盘上真正存在的路径。从根目录开始(指对站点的根目录而言某文件的位置)
例如:E:\编程\代码库\c语言代码库\进阶\c-language---advanced\文件操作\123.xt

我们新建一个"123.txt"文件,

#include <stdio.h>
int main()
{
	FILE* pFile;
	//打开文件
	pFile = fopen("123.txt", "w");//这里改成"写"
	//文件名:123    --这里是相对路径
	//文件名后缀:.txt
	//打开方式:"w"  --为了输出数据,打开一个已经存在的文本文件 
	if (pFile != NULL)
	{
		//打开成功写文件
		fputs("Hello World !", pFile);
	}
	else
	{
		printf("打开失败");
		return 1;//返回非0
	}
	//关闭文件
	fclose(pFile);
	return 0;
}

运行结果:

找到123.txt文件,双击打开查看内容.
在这里插入图片描述

4.1 文件的顺序读写

对于输入\输出函数的简单示例:

4,11 fputc函数

函数功能: fputc函数,按单个字符输出到.

函数模型:
在这里插入图片描述
参数介绍:,

参数含义
character要输入的字符(整形是因为会转化为ASCII码值)
stream指向要输出到的流

‘w’,(只写)从内存写/输出数据到文件中

示例:
向文件写入26个小写英文字母,空格分隔

#include <stdio.h>
int main()
{
	FILE* pFile;
	//打开文件
	pFile = fopen("123.txt", "w");
	if (pFile != NULL)
	{
		for (char i = 'a'; i <= 'z'; i++)
		{
			fputc(i, pFile);//从内存中写到流
			fputc(' ', pFile);//写入空格字符
		}
	}
	else
	{
		printf("打开失败");
		return 1;//返回非0
	}
	//关闭文件
	fclose(pFile);
	return 0;
}
//123.txt
a b c d e f g h i j k l m n o p q r s t u v w x y z 

4.12 fgetc函数

函数功能: fgetc中读入数据到内存

函数模型
在这里插入图片描述

参数含义
stream指向标识输入流的 FILE 对象的指针。

‘r’,(只读),从文件中读数据到内存

示例:

#include <stdio.h>
int main()
{
	FILE* pFile;
	char c;
	pFile = fopen("123.txt", "r");//此时123.txt中已经有26个字母了
	if (pFile != NULL)
	{
		while ((c=fgetc(pFile))!=EOF)//从流中写读到内存,直到文件读取结束
		{
			printf("%c",c);
		}
	}
	else
	{
		printf("打开失败");
		return 1;//返回非0
	}
	//关闭文件
	fclose(pFile);
	return 0;
}

运行结果:
在这里插入图片描述

4.13 fputs函数

函数功能: fputs将 str 指向流的 C 字符串写入流。

函数模型:
在这里插入图片描述

函数参数:

参数含义
str要输入的字符串
stream指向标识输出流的 FILE 对象的指针。

注意:
该函数时按行进行写入字符串.可以在写数据时在后面增加一个换行符,会更加美观.

示例:

#include <stdio.h>
int main()
{
	FILE* pFile;
	char c;
	pFile = fopen("123.txt", "w");//此时123.txt中已经有26个字母了
	if (pFile != NULL)
	{
		fputs("Hello World !!!\n", pFile);
		fputs("Hello CSDN!!!\n", pFile);
		fputs("Hello 初阶牛!!!\n", pFile);
	}
	else
	{
		printf("打开失败");
		return 1;//返回非0
	}
	//关闭文件
	fclose(pFile);
	return 0;
}

运行结果:
虽然之前文本里面已经有了26个英文字母,但是再进行写入操作时,会清空之前的文件内容.
在这里插入图片描述

‘a’,追加向文件末尾写数据.

怎样可以保留原来的数据,在数据后面继续增加新数据呢?
只需要将w改成a追加就行了.

pFile = fopen("123.txt", "a");//此时123.txt中已经有24个字母了,a表示追加
	if (pFile != NULL)
	{
		fputs("\n", pFile);//添加换行
		fputs("Hello World !!!\n", pFile);
		fputs("Hello CSDN!!!\n", pFile);
		fputs("Hello 初阶牛!!!\n", pFile);
	}

原文件中的数据↓
在这里插入图片描述
指向追加代码后:↓
在这里插入图片描述

4.14 fgets函数

函数功能:
从流中读取字符并将其作为 C 字符串存储到 str 中,直到读取 (num-1) 个字符或到达换行符或文件末尾,以先发生者为准。num-1是因’\0’要占一个字节.
函数模型:
在这里插入图片描述

函数参数:

参数含义
str指向在其中复制字符串读取的字符数组的指针。
num要复制到 str 的最大字符数(包括终止空字符)。
stream指向标识输入流的 FILE 对象的指针。stdin 可以用作从标准输入读取的参数。

示例:

#include <stdio.h>
int main()
{
	FILE* pFile;
	char str[4][100];
	pFile = fopen("123.txt", "r");//此时123.txt中已经有24个字母和3行hello ...
	if (pFile != NULL)
	{
		fgets(str[0], 55, pFile);
		fgets(str[1], 10, pFile);
		fgets(str[2], 20, pFile);
		fgets(str[3], 30, pFile);
	}
	else
	{
		printf("打开失败");
		return 1;//返回非0
	}
	//关闭文件
	fclose(pFile);

	//打印
	for (int i=0; i < 4; i++)
	{
		printf("%s\n", str[i]);
	}
	return 0;
}

文件中的数据:
在这里插入图片描述

读到的数据:
在这里插入图片描述

解释:
fgets(str[0], 55, pFile);从文件第一行开始向后读取54个字符,但是还没有到54个字符时,先遇到了换行符,它使 fgets 停止读取,但它被函数视为有效字符,并包含在复制到 str 的字符串中。
并且,终止空字符会自动附加到复制到 str 的字符之后。
所以第一行打印:

a b c d e f g h i j k l m n o p q r s t u v w x y z
//这下面有两个换行,一个是printf(“%s\n”, str[i]);中的\n,还有一个是文件中的换行也被视作有效字符.
.

fgets(str[1], 10, pFile);第一行读取完毕之后,光标从下一行开始读取,读取10个字节,即10-1个有效数据(还有一个是’\0’).
运行结果:

Hello Wor
//一个换行,

fgets(str[2], 20, pFile);文件的第二行还未读取结束,则从r后面开始继续读取,20个字节,直到遇到换行.
同理,打印:

ld !!!
//这里两个换行,是printf(“%s\n”, str[i]);中的\n,

fgets(str[3], 30, pFile);这个从第三行开始,遇到换行结束
打印结果:

Hello CSDN!!!
//两个换行

4.15 fsacnf函数与fprintf函数

格式化输入输出函数是什么意思?
其实很简单,就是对于一些特殊格式的输入,比如输入一个保留两位小数的浮点型.

示例:从键盘得到数据,再将数据写入文件
输入:

初阶牛 20 1.755

typedef struct student
{
	char name[10];
	int age;
	float stature;
}student;
#include <stdio.h>
int main()
{
	FILE* pFile;
	student s1 ;
	fscanf(stdin, "%s%d%f",s1.name, &s1.age, &s1.stature);//从标准输入流(键盘)获取数据
	//打开文件
	pFile = fopen("123.txt", "w");
	if (pFile != NULL)
	{
		fprintf(pFile, "%s %d %.2f",s1.name, s1.age, s1.stature);//将数据输出到文件
	}
	else
	{
		printf("打开失败");
		return 1;//返回非0
	}
	//关闭文件
	fclose(pFile);


	return 0;
}

运行结果:

//123.txt
初阶牛 20 1.75

示例:从文件中读取数据输出到显示器(屏幕)


typedef struct student
{
	char name[10];
	int age;
	float stature;
}student;
#include <stdio.h>
int main()
{
	FILE* pFile;
	student s1;
	//打开文件
	pFile = fopen("123.txt", "r");//此时文件中有数据:初阶牛 20 1.75
	if (pFile != NULL)
	{
		fscanf(pFile, "%6s%2d%f", s1.name, &s1.age, &s1.stature);//从文件中读取数据
	}
	else
	{
		printf("打开失败");
		return 1;//返回非0
	}

	//关闭文件
	fclose(pFile);
	fprintf(stdout, "%6s %2d %.2f", s1.name, s1.age, s1.stature);//将数据输出到显示器
	return 0;
}

4.16 fread函数和fwrite函数

函数原型:

在这里插入图片描述
参数说明:

参数含义
ptr指向要写入的元素数组的指针
size要写入的每个元素的大小(以字节为单位)
count元素个数
stream指向指定输出流的 FILE 对象的指针

图解:

在这里插入图片描述
示例:
将内存中的数据以二进制的方式输出到文件

typedef struct student
{
	char name[10];
	int age;
	float stature;
}student;
#include <stdio.h>
int main()
{
	FILE* pFile;
	student s1 = { "初阶牛",20,1.755 };
	pFile = fopen("123.txt", "wb");
	if (pFile != NULL)
	{
		fwrite(&s1, sizeof(s1), 1, pFile);
	}
	else
	{
		printf("打开失败");
		return 1;//返回非0
	}
	//关闭文件
	fclose(pFile);
	return 0;
}

运行结果:

在这里插入图片描述
由于"初阶牛"是字符型,二进制显示也是这样,而其他的数据就显示出来我们就看不懂了.

函数模型:
在这里插入图片描述

参数说明:

参数含义
ptr指向大小至少为 (size*count) 字节的内存块的指针,用于存放待会要从读取到的数据
size要读取的每个元素的大小(以字节为单位)。
count元素个数
stream指向指定输入流的 FILE 对象的指针。

图解:

在这里插入图片描述

示例:
将文件中的数据以二进制的方式读取到内存

typedef struct student
{
	char name[10];
	int age;
	float stature;
}student;
#include <stdio.h>
int main()
{
	FILE* pFile;
	student s1 ;
	pFile = fopen("123.txt", "rb");//此时里面已经有了二进制数据
	if (pFile != NULL)
	{
		fread(&s1, sizeof(s1), 1, pFile);
	}
	else
	{
		printf("打开失败");
		return 1;//返回非0
	}
	//关闭文件
	fclose(pFile);

	printf("%s %d %.2f", s1.name, s1.age, s1.stature);
	return 0;
}

4.2 文件的随机读写

fseek函数:

函数模型:
在这里插入图片描述
参数介绍:

参数含义
stream指向标识流的 FILE 对象的指针。
offset二进制文件:要从源偏移的字节数。文本文件:零或 ftell 返回的值。
origin用作偏移参考的位置。

origin :参考位置表
在这里插入图片描述
示例:文件中已经有了,数据:Hello CSDN!!!

#include <stdio.h>
int main()
{
	FILE* pFile;
	pFile = fopen("test6.txt", "r");//文件中已经 有了数据:Helllo CSDN!!!
	if (pFile == NULL)
	{
		perror(fopen);
	}
	else
	{
		char tmp= fgetc(pFile);
		printf("%c", tmp);
		tmp = fgetc(pFile);
		printf("%c", tmp);
		tmp = fgetc(pFile);
		printf("%c", tmp);
		tmp = fgetc(pFile);
		printf("%c", tmp);
		tmp = fgetc(pFile);
		printf("%c", tmp);
		printf("\n");
		
		//调整偏移量
		fseek(pFile,-3, SEEK_CUR);//将光标从文件当前处,往前偏移3个位
		tmp = fgetc(pFile);
		printf("%c", tmp);
		tmp = fgetc(pFile);
		printf("%c", tmp);
		printf("\n");

		fseek(pFile, 1, SEEK_SET);//将光标从文件开头处,往后偏移一个位
		tmp = fgetc(pFile);
		printf("%c", tmp);
		tmp = fgetc(pFile);
		printf("%c", tmp);
		printf("\n");

		fseek(pFile, -8, SEEK_END);//将光标从文件结尾处,往前偏移8个位
		tmp = fgetc(pFile);
		printf("%c", tmp);
		tmp = fgetc(pFile);
		printf("%c", tmp);
		tmp = fgetc(pFile);
		printf("%c", tmp);
		tmp = fgetc(pFile);
		printf("%c", tmp);
		tmp = fgetc(pFile);
		printf("%c", tmp);
		tmp = fgetc(pFile);
		printf("%c", tmp);
	}
	
	fclose(pFile);
	return 0;
}

运行结果:

Hello
ll
el
CSDN!

解释:
在这里插入图片描述

在这里插入图片描述

ftell函数

函数模型:
在这里插入图片描述
参数介绍:

参数含义
stream指向标识流的 FILE 对象的指针。

函数功能,获取流中的当前位置的偏移量.

示例:

#include <stdio.h>
int main()
{
	FILE* pFile;
	pFile = fopen("test6.txt", "r");//文件中已经 有了数据:Helllo CSDN!!!
	if (pFile == NULL)
	{
		perror(fopen);
	}
	else
	{
		char tmp = fgetc(pFile);
		printf("%c", tmp);
		tmp = fgetc(pFile);
		printf("%c", tmp);
		tmp = fgetc(pFile);
		printf("%c", tmp);
		tmp = fgetc(pFile);
		printf("%c", tmp);
		tmp = fgetc(pFile);
		printf("%c", tmp);
		printf("\n");
		printf("%d", ftell(pFile));
	}

	fclose(pFile);
	return 0;
}

结果:

Hello
5

rewind函数

函数模型:

在这里插入图片描述
函数功能:
将流的位置设置为开头.
fseek(pFile, 0, SEEK_SET)功能一样,就不过多介绍了.

4.3 文本文件 与 二进制文件的区别

数据存储的形式有多种,数据文件被称为文本文件或者二进制文件
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。

那么一个数据在内存中是怎么存储的呢?
字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。

示例:
以整形数字:520为例

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

结果:

在这里插入图片描述
我们可以用vs,右击添"现有项",将文件添加进来,然后打开方式选择二进制编译器
在这里插入图片描述

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

这是小端存储模式,所以16进制应该为00 00 02 08,这便是520转化为16进制的值.

用文本文件的方式去写

#include <stdio.h>
int main()
{
	int a = 520;
	FILE* pf = fopen("test.txt", "wb");
	fprintf(pf,"%d",a);//文本的形式写到文件中
	fclose(pf);
	pf = NULL;
	return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述

一般以文本文件的方式去写,会占用更多的字节空间,因为对于每一位数字都要单独转化为ASCII码值.
例如:
文本520,用ASCII码值(16进制)表示为35 32 30,占3个字节
二进制520,用ASCII码值(16进制)表示为00 00 02 08,占四个字节.

啊哦,这里的例子不大合适,如果数字是一个大于4位的数字,比如5201314,那么

文本文件:占8个字节
二进制文件:占4个字节.

五、文件结束的判定

feof函数

注意:
feof函数经常被错用为是判断文件是否结束.而在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。
而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。

  1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
    例如:
    fgetc 判断是否为 EOF .
    fgets 判断返回值是否为 NULL .
  1. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
    例如:
    fread判断返回值是否小于实际要读的个数。

六、文件缓冲区

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

在这里插入图片描述

因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区(flush函数)或者在文件操作结束的时候关闭文件。
如果不刷新,可能导致读写文件的问题

如果文章对大家有用的话记得一键三连哦!💗💗💗
如果文章中有部分错误之处,可以私信牛牛,互相讨论哦!!!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/484251.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【分布式搜索引擎03】

分布式搜索引擎03 11.9.数据聚合11.9.1.聚合的种类11.9.2.DSL实现聚合11.9.2.1.Bucket聚合语法11.9.2.2.聚合结果排序11.9.2.3.限定聚合范围11.9.2.4.Metric聚合语法11.9.2.5.小结 11.9.3.RestAPI实现聚合11.9.3.1.API语法11.9.3.2.业务需求11.9.3.3.业务实现 11.10.自动补全&a…

AMBA协议-AXI协议详解(读写时序、Outstanding、乱序传输、原子操作)

目录 1. AXI 写通道信号 1.1. 写地址通道信号 1.2. 写数据通道信号 1.3. 写response通道信号 1.5. 握手规则 1.4. AXI 写通道之间关系 2. AXI 读通道信号 2.1. 读地址通道信号 2.2. 读数据通道信号 2.3. AXI 读通道之间关系 3. AXI传输 3.1. AXI突发读传输 3.2. …

EventBus(事件总线)的使用和源码的简单解析

Google Guava EventBus(事件总线)的使用和源码的简单解析 什么是EventBus&#xff1f; 事件总线&#xff08;EventBus&#xff09;是一种广泛用于软件架构中的设计模式&#xff0c;用于实现解耦和松散耦合的通信机制。它可以帮助组织和管理应用程序中不同组件之间的通信&…

【SQL篇】面试之高级查询和连接

603 连续空余座位 select distinct c1.seat_id from Cinema c1 join Cinema c2 on abs(c2.seat_id-c1.seat_id) 1 where c1.free1 and c2.free1 order by c1.seat_id;总结 思路&#xff1a;为什么我们这里需要abs和distinct&#xff0c;如果是如下代码&#xff0c;为什么不可…

[架构之路-178]-《软考-系统分析师》-17-嵌入式系统分析与设计- 3- 分区操作系统(Partition Operating System)概述

目录&#xff1a; 本文概述&#xff1a; 1.1 什么是分区操作系统 1.2 分区操作系统出现背景 1. 前后台系统(Foreground/Background System) 2. 实时操作系统(RTOS) 本文概述&#xff1a; 随着嵌入式系统日趋复杂化以及对安全性要求的不断提高&#xff0c;采用空间隔离、时…

[计算机图形学]光场,颜色与感知(前瞻预习/复习回顾)

一、Light Field / Lumigraph—光场 1.我们看到的是什么 我们的眼睛能够把3D世界转换为2D的成像信号被我们感知&#xff0c;如上面第一幅图&#xff0c;这就是我们看到整个世界的过程&#xff0c;那么如果我们把之前记录的光的信息都完美的放在一个幕布上&#xff0c;那么我们…

第15章 信息(文档)和配置管理

文章目录 软件文档的分类&#xff08;1&#xff09;开发文档&#xff1a;描述开发过程 本身&#xff08;2&#xff09;产品文档&#xff1a;描述开发过程的 产物&#xff08;3&#xff09;管理文档&#xff1a;记录项目管理的信息 文档的质量可以分为四级&#xff08;1&#xf…

第二十五章 刚体Rigidbody

在物理学中&#xff0c;静止和匀速直线运动是物体的平衡状态&#xff0c;如果给该物体施加某一个力的话&#xff0c;物体的平衡状态就会改变&#xff0c;当然这个真理的前提是理想状态。我们知道在现实世界中&#xff0c;由于重力和摩擦力的存在&#xff0c;任何一个物体都不可…

【SQL篇】窗口函数和公共表达式

1077 项目员工 III # Write your MySQL query statement below select project_id, employee_id from (select project_id, e.employee_id, rank() over(partition by project_id order by experience_years desc) as rkfrom Employee ejoin Project pon e.employee_id p.empl…

【Fluent】接着上一次计算的结果继续计算,利用计算过程中得到的物理场(温度、速度、压力等)插值Interpolate文件初始化模型的方法

一、问题背景 因为fluent中支持的初始化无非三种类型。 1、Standard initialization 标准初始化 2、Hybridinitialization 混合初始化 3、FMG initialization FMG初始化 另外&#xff0c;还可以用UDF通过坐标判断的方式予以初始化。 但是这些初始化方法都没办法利用以前计算过…

通关MyBatis(上)

作者&#xff1a;~小明学编程 文章专栏&#xff1a;spring框架 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 什么是MyBatis 如何使用Mybatis 添加依赖 创建数据库 配置数据库连接字符串 MyBatis的操作流程 数据持久层 配置mybatis的xml文件 mapp…

Windows自动虚拟机WSL和VMware虚拟机兼容问题(此平台不支持虚拟化的 Intel VT-x/EPT)

问题背景与原因分析 在安装了WSL2之后&#xff0c;忽然发现VMware Workstation无法正常启动了。就是在开启虚拟机时遇到了这种情况&#xff1a; “ 此平台不支持虚拟化的 Intel VT-x/EPT” 问题描述&#xff1a;出现以上问题&#xff0c;发现WSL2和 VMware Workstation 是不兼…

idea使用git遇到的小问题

idea使用git遇到的小问题 前置说明颜色含义中文插件修改提交的用户名 前置说明 idea版本为2022专业版 github需要自己会科学上网 颜色含义 在idea中使用github后&#xff0c;会发现项目中会有各种各样的颜色&#xff0c;如图所示文件全为绿色 这颜色含义分别为&#xff1a;…

函数-函数递归及练习

目录 1、什么是递归&#xff1f; 2、递归的两个必要条件 3、递归的练习 3.1 接受一个整型值&#xff08;无符号&#xff09;&#xff0c;按照顺序打印它的每一位 3.2 编写函数不允许创建临时变量&#xff0c;求字符串的长度 3.3 求第n个斐波那契数 3.4 字符串逆序&…

UG NX二次开发(C++)-建模-修改NXObject或者Feature的颜色(二)

文章目录 1、前言2、在UG NX中修改Body的颜色操作3、采用NXOpen(C)实现3.1 创建修改对象颜色的方法3.2 在do_it()中添加调用的代码3.3 测试效果 1、前言 在UG NX中&#xff0c;改变NXObject和Feature的操作是不相同的&#xff0c;所以其二次开发的代码也不一样&#xff0c;我们…

企业级信息系统开发讲课笔记4.1 Spring Boot入门程序

文章目录 零、学习目标一、Spring Boot框架概述&#xff08;一&#xff09;由Spring到Spring Boot&#xff08;二&#xff09;Spring Boot框架的核心功能&#xff08;三&#xff09;Spring Boot框架的应用 二、使用Maven方式构建Spring Boot项目&#xff08;一&#xff09;创建…

二维字符数组的三种输入方式浅析(scanf()、gets()和fgets())

二维字符数组的输入 目录 二维字符数组的输入1.scanf函数知识点scanf()关于回车的问题&#xff1a; 2.gets函数3.fgets函数参考链接 1.scanf函数 知识点 按照常规输入数组的办法&#xff0c;通过 for 循环实现 将整个字符串输入时&#xff0c;在数组名前不加&&#xff0…

Java 基础进阶篇(二)—— static 静态关键字与单例模式

文章目录 一、static 静态关键字1.1 静态成员变量与实例成员变量1.2 静态成员方法与实例成员方法1.3 static 访问注意事项1.4 内存使用情况 二、工具类三、代码块四、单例模式4.1 饿汉单例4.2 懒汉单例 一、static 静态关键字 static&#xff1a;代表静态的意思&#xff0c;可…

Java 基础进阶篇(六)—— 接口详解

文章目录 一、接口概述二、接口的基本使用三、接口从 JDK 8 开始新增的方法四、接口的注意事项&#xff08;了解&#xff09;补充&#xff1a;接口与接口的关系 一、接口概述 规范的基本特征是约束和公开。 接口就是一种规范&#xff0c;其约束别人必须干什么事情。 所以&…

【五一创作】Matlab 绘制风速、风向统计玫瑰花图【优化】

在之前&#xff0c;有个博客专门讲matlab 绘制风速、风向统计玫瑰花图&#xff1b;这里面存在不少细节问题&#xff0c;目前对该部分代码做了优化。以前的博客链接见下&#xff1a; Matlab 绘制风速、风向统计玫瑰花图 最近接了一个任务&#xff0c;需要绘制风速、风向的统计玫…