【c语言进阶】文件操作知识大全上

news2024/9/28 9:26:50

在这里插入图片描述

🚀write in front🚀
📜所属专栏:> c语言学习
🛰️博客主页:睿睿的博客主页
🛰️代码仓库:🎉VS2022_C语言仓库
🎡您的点赞、关注、收藏、评论,是对我最大的激励和支持!!!
关注我,关注我,关注我你们将会看到更多的优质内容!!

在这里插入图片描述

文章目录

  • 👻前言👻:
  • 一、文件概述:
    • 1.什么是文件:
      • 1.1.程序文件
      • 1.2数据文件
      • 1.3文件名
        • 1.3.1绝对路径:
        • 1.3.2相对路径:
  • 二、文件的打开和关闭:
    • 1.文件指针
    • 2.文件的打开与关闭
    • 3.文件的打开方式
  • 三、文件的顺序读写:
    • 1.字符的读与写 fgetc 与 fputc:
      • 字符的读取函数 fputc :
      • 字符的读取函数 fgetc :
      • 组合应用:
    • 2.文本行的读与写 fgets 与 fputs
      • fputs读取字符串:
      • fgets读取字符串:
    • 3.格式化输出函数 fscanf和fprintf:
      • fprintf的格式化写入:
      • fscanf的格式化读取:
    • 4.二进制的输入与输出fwead和fwrite:
      • 二进制的输出fwrite:
      • 二进制的输入fread:
    • 5.流的概念:
    • 6.辨析输入与输出:
    • 7.辨析三组函数:
      • 7.1.scanf和printf:
      • 7.2.fscanf和fprintf:
      • 7.3.sscanf和sprintf
  • 👻总结👻:

👻前言👻:

  在前面的通讯录学习中,我们发现,当程序结束以后,内存空间就会被释放并回收,我们所存的通讯录人的消息就全部消失了。如此,我们无法将数据真正保留下来。
  所以,我们的目的便是希望将数据保留在本地,只有当我们进行删除操作时,才将对应的数据删除掉,即尝试实现数据的持久化。而我们实现数据持久化的方式一般有两种:使用 数据库 或将数据以 文件操作 存放至硬盘中。今天我们就来学习一下文件操作相关知识。

一、文件概述:

1.什么是文件:

  我们通常所说的文件,一般是指存放在我们计算机本地硬盘上的文件。但是在我们的程序设计中,则指的是 程序文件数据文件 两种文件(根据文件功能分类)。

1.1.程序文件

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

1.2数据文件

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

本章讨论的是数据文件。
  在以前各章所处理数据的输入输出都是以终端为对象的,即从终端加粗样式的键盘输入数据,运行结果显示到显示器上。而今天我们的目的则是将数据信息输入至我们的本地磁盘上,而当我们想要对数据进行操作时,再从本地硬盘进行读取

1.3文件名

1.3.1绝对路径:

  一个文件要有一个唯一的文件标识,以便用户识别和引用。绝对路径的文件名包含3部分:文件路径+文件名主干+文件后缀
例如: c:\code\test.txt
为了方便起见,文件标识常被称为文件名。

1.3.2相对路径:

  如果打开所在文件路径的文件,则不用前面的文件路径
例如: test.txt
  如果要打开所在文件的上一层文件,则在前面+一个 . ./ ;
例如: . ./test.txt
同理,如果是上上一层文件,则+ . ./. ./

二、文件的打开和关闭:

  我们在使用或操作我们的文件之前,首先需要在我们的程序中及将其打开,于是我们就来研究一下文件的打开和关闭方式。

1.文件指针

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

例如,VS2022编译环境提供的 stdio.h 头文件中有以下的文件类型申明
在这里插入图片描述
此时结构体内的指针指向保存文件信息的成员

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

FILE* p;
//定义一个文件指针p

  像这样,我们就能创建出一个文件指针,而接下来就可以使这个文件指针 p 指向某个文件信息区(FILE 类型的结构体变量),并通过该文件信息区中所保存的信息来访问本地硬盘内的文件了。这样,我们通过使用文件指针就可以找到与其相关联的文件了

2.文件的打开与关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件
在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。
ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件.

fopen 函数的使用方式:

FILE* p = fopen(const char* filename, const char* mod);
  • 其中“ const char* filename ”指文件名(是字符串,文件名即文件标识符**)。

  • 其中“ const char* mod ”指文件打开模式(也是字符串,后面会为大家列出)。

  • 返回值:若成功,返回一个文件指针,若文件打开失败,则返回一个空指针

fclose 函数的使用方式为:

fopen(FILE* strname);
  • 参数 FILE *stream : 这是指向 FILE 对象的指针,该 FILE 对象指定了要被关闭的流;
  • 返回值:若文件关闭成功,则返回0;
        若文件关闭失败,则返回EOF;
    举个栗子🌰
int main()
{
	//D:\\code\\test.txt - 绝对路径
	//
	FILE* pf = fopen("test2.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	else
	{
		printf("打开文件成功\n");
	}
	//读文件
	//....

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

3.文件的打开方式

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

三、文件的顺序读写:

功能函数名适用于
字符输入函数fgetc所有输入流
字符输出函数fputc所有输出流
文本行输入函数fgets所有输入流
文本行输出函数fputs所有输出流
格式化输入函数fscanf所有输入流
格式化输出函数fprintf所有输出流
二进制输入fread文件
二进制输出fwrite文件

1.字符的读与写 fgetc 与 fputc:

字符的读取函数 fputc :

在这里插入图片描述

  • 描述 :把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动;
  • 参数 int char :这是要被写入的字符。该字符以其ASCII 值进行传递
  • 参数 FILE *stream : 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符的流;
  • 返回值:该函数以无符号 char 强制转换为 int 的形式(即字符的ASCII值)返回写入的字符,如果发生错误则返回 EOF.
int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	/*fputc('a', pf);
	fputc('b', pf);
	fputc('c', pf);
	fputc('d', pf);*/

	char ch = 0;
	for (ch = 'a'; ch <= 'z'; ch++)
	{
		fputc(ch, pf);
	}

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

运行结果:
在这里插入图片描述
  这就是字符的写入,大家会在该项目找到这个文件。

字符的读取函数 fgetc :

在这里插入图片描述

  • 参数 FILE *stream :这是指向 FILE 对象的指针,该 FILE 对象标识了要在上面执行操作的流;
  • 返回值:该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误则返回 EOF。

  我们在上面代码的基础下展示文件的读取。

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//读文件
	int ch = fgetc(pf);
	printf("%c\n", ch);

	ch = fgetc(pf);
	printf("%c\n", ch);

	ch = fgetc(pf);
	printf("%c\n", ch);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

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

  • getc函数对于字符的读取,每读取一个字符,该函数内的指针会自动将指向的位置向后移动,指向下一个字符;

组合应用:

int main()
{
	FILE* pf = fopen("test.txt", "w");  //以只写的方式打开文件
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	char ch = 0;
	for (ch = 'a'; ch <= 'z'; ch++)   //向文件写入26个小写英文字母
	{
		fputc(ch, pf);
	}
	fclose(pf);
	pf = NULL;
	pf= fopen("test.txt", "r");  //以只读的方式打开文件
	if (pf== NULL)
	{
		perror("fopen");
		return 0;
	}
	while (ch != EOF)   //判断是否读取到文件末尾
	{
		ch = fgetc(pf);   //从文件中读取字符
		printf("%c", ch);   //打印读取字符
	}
	fclose(pf);
	pf = NULL;
	return 0;
}

代码结果:
在这里插入图片描述

2.文本行的读与写 fgets 与 fputs

fputs读取字符串:

在这里插入图片描述

  • 参数 const char *str : 这是一个字符串,有’\0’结尾。
  • 参数 FILE *stream : 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符串的流;
  • 返回值:该函数返回一个非负值,如果发生错误则返回 EOF。
int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	//测试写一行数据
	fputs("hello world\n", pf);
	fputs("hello bit\n", pf);

	return 0;
}

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

fgets读取字符串:

在这里插入图片描述

  • 描述: 从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。
  • 参数 char *str :这是指向一个指针,该指针指向了要读取的字符串;
  • 参数 int n : 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度;
  • 参数 FILE *stream :这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流;
  • 返回值:如果成功,该函数返回相同的 str 参数;如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针;如果发生错误,返回一个空指针;

特殊情况:

  • 读取 (n-1) 个字符时,会自动在第n个位置补’\0’
  • 读取到换行符时,会把’\n’之前的字符读取出来然后补’\0’,但是不会读到’\n’,具体情况在后面的缓冲区部分知识里会提到。此时的’\n’会在保存在下一个fgets函数的第一个字符
  • 到达文件末尾时,它会停止,具体视情况而定.
int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//读文件
	//测试一行数据
	char buf[20] = {0};
	fgets(buf, 20, pf);
	printf("%s", buf);
	fgets(buf, 20, pf);
	printf("%s", buf);
 	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

代码结果:
在这里插入图片描述

3.格式化输出函数 fscanf和fprintf:

fprintf的格式化写入:

在这里插入图片描述
  其实该函数和printf函数一模一样,只是前面多了一个指向文件的指针! 这里的意思其实是将后面的数据以不同的格式写入指针指向的文件信息中。

struct S
{
	char name[20];
	int age;
	float score;
};

int main()
{
	struct S s = { "zhangsan", 20, 95.5 };
	FILE* pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//格式化的写入文件
	fprintf(pf, "%s %d %f\n", s.name, s.age, s.score);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

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

fscanf的格式化读取:

在这里插入图片描述
  一样的,都是多了一个文件指针而已,其他都是一模一样的!这里的意思是将文件指向的文件消息不同格式读出并且保存在不同类型的变量中。

int main()
{
	struct S s = { 0 };
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//格式化的读取文件
	fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));
	
	//打印看数据
	printf("%s %d %f\n", s.name, s.age, s.score);
	
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

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

4.二进制的输入与输出fwead和fwrite:

二进制的输出fwrite:

在这里插入图片描述

  • 描述:把 ptr 所指向的数组中的数据写入到给定流 stream 中;
  • 参数 void (*)ptr :这是指向带有最小尺寸 size*nmemb 字节的内存块的指针;
  • 参数 size_t size :这是要读取的每个元素的大小,以字节为单位;
  • 参数 size_t count :这是元素的个数;
  • 参数 FILE(*)stream : 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流;
  • 返回值:如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型。
int main()
{
	struct S s = { "张三", 20, 98.5};
	FILE* pf = fopen("test.txt", "wb");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	fwrite(&s, sizeof(struct S), 1, pf);

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述
文本形式是这样的:
在这里插入图片描述
但是我们转出2进制看就是这样的:
在这里插入图片描述
在这里插入图片描述

二进制的输入fread:

在这里插入图片描述

  • 描述:从给定流 stream 读取数据到 ptr 所指向的空间中;
  • 参数 void (*)ptr :这是指向带有最小尺寸 size*nmemb 字节的内存块的指针;
  • 参数 size_t size :这是要读取的每个元素的大小,以字节为单位;
  • 参数 size_t nmemb :这是元素的个数;
  • 参数 FILE(*)stream : 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流;
  • 返回值 :成功读取的元素总数会以 size_t 对象返回,size_t 对象是一个整型数据类型。如果返回值小于元素个数 ,则发生了错误或读到文件末尾。
int main()
{
	struct S s = { 0};
	FILE* pf = fopen("test.txt", "rb");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//读文件
	fread(&s, sizeof(struct S), 1, pf);
	printf("%s %d %f\n", s.name, s.age, s.score);

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

代码结果:
在这里插入图片描述

5.流的概念:

在这里插入图片描述

  小伙伴对于上面所提到的输入流输出流肯定非常迷惑。可以看到流其实流是一个极其抽象的概念,我们可以把它理解成C程序与外部设备进行交流的一个媒介,文件是一个流,我们的键盘屏幕也是一个流,并且他们有各自专门的文件指针的名称。
其实我们也可以用上面的fprintffscanf来实现printf和scanf

struct S
{
	char name[20];
	int age;
	float score;
};

int main()
{
	struct S s = { 0 };
	fscanf(stdin, "%s %d %f", s.name, &(s.age), &(s.score));
	fprintf(stdout, "%s %d %f\n", s.name, s.age, s.score);

	//int ch = fgetc(stdin);
	//fputc(ch, stdout);

	return 0;
}

6.辨析输入与输出:

  在这里,为了方便辨析是输入还是输出。我们可以把自己当作内存以内存为主体判断是输出还是输入。比如键盘上打字对于内存来说是输入/读取,在屏幕上打印是输出/写入。写文件是将内存的东西放入文件是输出/写入,从文件获取信息是输入/读取。
在这里插入图片描述

7.辨析三组函数:

7.1.scanf和printf:

  • scanf —从键盘上读取格式化的数据 stdin
  • printf —把数据写到(输出)屏幕上 stdout

7.2.fscanf和fprintf:

  • fscanf —针对所有输入流的格式化的输入函数:stdin,打开的文件
  • fsprintf —针对所有输出流的格式化的输出函数:stdout,打开的文件

7.3.sscanf和sprintf

  • sscanf —从一个字符串中,还原一个格式化的数据
  • sprintf —把格式化的数据,存放在(转化成)一个字符串

  相信大家看到前面的s就知道肯定是和字符串有关,其实这两个函数就是将格式化数据和字符串数据相互转化罢了,看一个栗子🌰就够了!

int main()
{
	struct S s = {"zhangsan", 20, 98.5};
	char buf[100] = { 0 };
	//转化成字符串形式
	sprintf(buf, "%s %d %f", s.name, s.age, s.score);
	//按照字符串打印的
	printf("%s\n", buf);

	struct S tmp = { 0 };
	//转化为格式化数据
	sscanf(buf, "%s %d %f", tmp.name, &(tmp.age), &(tmp.score));
	//打印结构体数据
	printf("%s %d %f\n", tmp.name, tmp.age, tmp.score);

	return 0;
}

👻总结👻:

  今天介绍了文件的一些基本知识,对于随机读取,缓冲区的相关知识我将会在下一篇文章讲解!
  更新不易,辛苦各位小伙伴们动动小手,👍三连走一走💕💕 ~ ~ ~ 你们真的对我很重要!最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!

专栏订阅:
每日一题
c语言学习
算法
智力题
更新不易,辛苦各位小伙伴们动动小手,👍三连走一走💕💕 ~ ~ ~ 你们真的对我很重要!最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!

在这里插入图片描述

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

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

相关文章

15. XML解析

1. 什么是 XML&#xff1f; XML 指可扩展标记语言&#xff08;EXtensible Markup Language&#xff09;。 a. XML 是一种很像HTML的标记语言。 b. XML 的设计宗旨是传输数据&#xff0c;而不是显示数据。 c. XML 标签没有被预定义。您需要自行定义标签。 d. XML 被设计为具有自…

Tomcat详解

Tomcat 是一个 HTTP 服务器. 前面我们已经学习了 HTTP 协议, 知道了 HTTP 协议就是 HTTP 客户端和 HTTP 服务器之间的交互数据的格式. 同时也通过 ajax 和 Java Socket 分别构造了 HTTP 客户端. HTTP 服务器我们也同样可以通过 Java Socket 来实现. 而 Tomcat 就是基于 Java 实…

星戈瑞--磺化CY7标记活性脂Sulfo CY7-NHS注意事项你知道那些?

Sulfo-Cy7 NHS酯是一种磺化、亲水性和高度水溶性染料。该试剂允许制备Cy7标记的生物分子&#xff0c;特别适用于标记脆弱的蛋白质和易变性的蛋白质。染料标记的分子可用于各种研究相关的实验。近红外荧光成像利用了生物组织在特定波长范围内的透明度。在活生物体中&#xff0c;…

2. Kimball的DW/BI架构解析

文章目录Kimball的DW/BI架构1. 业务系统&#xff08;数据源系统&#xff09;2. 获取-转换-加载&#xff08;ETL&#xff09;系统3. 用于支持BI&#xff08;商业智能&#xff09;决策的展现区4. 商业智能应用引言&#xff1a;DW&#xff0c;即Data Warehouse&#xff0c;数据仓库…

LLA: Loss-aware Label Assignment for Dense Pedestrian Detection 原理与代码解析

paper&#xff1a;LLA: Loss-aware Label Assignment for Dense Pedestrian Detectioncode&#xff1a;https://github.com/Megvii-BaseDetection/LLA背景标签分配由于对检测器的性能影响很大&#xff0c;在通用目标检测中得到了广泛的研究&#xff0c;但是密集行人检测中的标签…

【SpringCloud复习巩固】Gateway

目录 一.统一网关Gateway 1.1为什么需要网关 1.2网关的技术实现 1.3网关的作用 1.4搭建网关服务 1.5路由断言工厂Route Predicate Factory 1.6路由过滤器GatewayFilter 1.7全局过滤器GlobalFilter 1.8过滤器执行顺序 1.9跨域问题解决 一.统一网关Gateway 1.1为什么需…

《流浪地球2》里的硬核科技,IT人带入了

《流浪地球2》不负期待&#xff0c;上映后口碑和热度一路高歌猛进&#xff0c;霸坐春节档&#xff0c;稳居票房TOP2。硬核科技惊喜不断&#xff0c;如喷出冲天蓝光的行星发动机、洞悉一切的量子计算机、高耸入云的太空电梯…… 逼真的特效质感以及浓厚的重工业美学掀起科技新热…

UE4中修改模型的中心点

UE4系列文章目录 文章目录UE4系列文章目录前言一、增加scenen空组件前言 在UE4中的模型中心点一般都在模型的中点&#xff0c;如果是门这样的模型&#xff0c;我们就不能绕中心点旋转了&#xff0c;不然会觉得很奇怪。但是默认的静态网格体中心点都在物体中心&#xff0c;那我…

易观千帆 | 2022年12月银行APP月活跃用户规模盘点

易观千帆&#xff1a;12月手机银行服务应用活跃人数51688.69万&#xff0c;环比下降1.81%。结合历史数据&#xff0c;2022年9月达到全年高峰的54191.75万&#xff0c;总体来看保持波动增长。12月农商行手机银行服务应用活跃人数1580.59万&#xff0c;环比下降3.01%。农商行手机…

scrapy的概念作用和工作流程

scrapy的概念和流程 学习目标&#xff1a; 了解 scrapy的概念了解 scrapy框架的作用掌握 scrapy框架的运行流程掌握 scrapy中每个模块的作用 1. scrapy的概念 Scrapy是一个Python编写的开源网络爬虫框架。它是一个被设计用于爬取网络数据、提取结构性数据的框架。 Scrapy 使…

K8s简介之什么是K8s

1.概述 欢迎来到K8s入门课程。Kubernetes&#xff0c;也被称为K8s或Kube&#xff0c;是谷歌推出的业界最受欢迎的容器编排器。本K8s教程由一系列关于K8s的文章组成。在第一部分&#xff0c;我们将讨论什么是K8s和K8s的基本概念。 本课程是专为初学者开设的&#xff0c;你可以…

Java个人遇到问题汇总

问题汇总1. 虚拟机1.1 CentOS71) 连不上网络问题解决1.2 Docker1) 私服配置无法重启docker问题解决后续2. SSMP2.1 Spring1) 测试类一直空指针问题解决2.2 MyBatis MyBatis-Plus1) IDEA加入方言后SQL语句依然不提示解决2) MP更新数据,更新了其他列问题解决3.SpringBoot3.1 Thym…

nginx学习笔记8(小滴课堂)

nginx第三方利器---OpenRestyLua介绍 OpenRestyLua的相关环境准备 我们先来去安装我们的OpenResty: 我们按照官网的要求去配置就可以了&#xff1a; 按照官网的步骤一步一步去走就可以了。 然后我们开始去安装我们的OpenResty: 这里有非常多的安装包吧&#xff0c;我们到时候需…

硬件---计算机概论

电脑硬件的五大单元 输入单元&#xff1a;包括键盘、鼠标、卡片阅读机、扫描仪、手写板、触控屏幕等等一堆&#xff1b;主机部分(控制单元、算数逻辑单元与主存储器)&#xff1a;这个就是系统单元&#xff0c;被主机机壳保护住了&#xff0c;里面含有一堆板子、CPU 与主存储器…

为什么u盘不显示数据?u盘不显示数据恢复的3种方法

虽然u盘在数据备份、重装系统或其他领域中都能发挥很大的作用&#xff0c;但是在使用过程中难免会遇到一些问题&#xff0c;比如u盘数据不显示&#xff01;那么&#xff0c;遇到u盘不显示数据怎么解决呢&#xff1f;阅读本文&#xff0c;您将知晓u盘不显示数据的常见原因和相应…

Deep Learning Tuning Playbook(中译版)

前言 由五名研究人员和工程师组成的团队发布了《Deep Learning Tuning Playbook》&#xff0c;来自他们自己训练神经网络的实验结果以及工程师的一些实践建议&#xff0c;目前在Github上已有1.5k星。原项目地址本文为《Deep Learning Tuning Playbook》中文翻译版本&#xff0…

Vuex状态管理器

目录 1、什么是vuex 2、vuex的使用场景&#xff1a; 3、vuex的工作方式&#xff1a; 4、vuex的核心API ​ &#xff08;1&#xff09;state&#xff1a; &#xff08;2&#xff09;mutations &#xff08;3&#xff09;actions&#xff1a;通过actions去触发mutations中…

2023.1.30 作业

一、TF-A的初步移植1、对tf-a源码进行解压tar -xvf tf-a-stm32mp-2.2.r2-r0.tar.gz2、进入tf-a源码顶层目录cd tf-a-stm32mp-2.2.r23、对tf-a源码进行打补丁操作for p in ls -1 ../*.patch; do patch -p1 < $p; done4、配置交叉编译工具链&#xff0c;打开../Makefile.sdk&a…

2023牛客寒假算法基础集训营4(7/13)

清楚姐姐学信息论数学&#xff0c;只需要求x的y次方和y的x次方那个大选哪个&#xff0c;除了2和3时是3多&#xff0c;其他情况都是数越小能代表的数越多AC代码&#xff1a;#include <bits/stdc.h> using namespace std; using LL long long; int main() {ios::sync_with…

ESP32 Arduino学习篇 (三) 蓝牙

简介&#xff1a;1.1蓝牙分类经典蓝牙我们一般说的是BT&#xff0c;低功耗蓝牙我们一般说成BLE。当设备支持蓝牙4.0时&#xff0c;还得进一步确认设备是支持BT单模、BLE单模还是BT和BLE都支持的双模。低功耗蓝牙 (BLE)&#xff1a; 支持蓝牙协议4.0或更高的模块。主打低功耗&am…