C的文件操作

news2024/11/26 4:29:44

🐖前言

🐕1.为什们我们要用文件

在我们之前写程序时,如果使用scanf函数用键盘输入数据,这些东西都放到内存当中,一旦退出程序,那么这些数据就会消失,比如就像我们写的通讯录,不管是静态的还是动态的,每次打开程序,都要重新开始录入人的信息。
⭐那有什么方法把通讯录的信息记录下来,只有我们自己选择删除数据的时候,数据才不复存在。
这就涉及到了数据持久化的问题,我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据库等方式。
使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。

🐕2 什么是文件

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

🐶2.1程序文件

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

🐶2.2数据文件

文件的内容不一定是程序,而是程序运行时读写的数据。
比如程序运行需要从中读取数据的文件,或者输出内容的文件。
像在使用通讯录的时候,我们可以将人的信息存放在文件中,通过程序的操作,能够将其读到内存,或者通过程序的操作,可以在文件中录入信息
本章重点就是讨论数据文件

🐶3 文件名

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

🐕3. 文件的打开和关闭

🐶3.1文件指针

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

不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。
每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。
⭐所以我们只需要了解,这是个什么东西,并且他能干什么就好了。
一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。
下面我们可以创建一个FILE*的指针变量:FILE* pf;//文件指针变量
定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。

🐶3.2 文件的打开和关闭

是一个文件,那么就涉及到文件的打开和文件的关闭,那么怎么打开或者关闭文件呢,这时就涉及到两个函数,文件打开函数fopen,文件关闭函数fclose,通过我们仅学的英语,我们就可以知道为什们这样写他的函数名。
⭐下面介绍一下这两个函数怎么用。

🦊3.2.1fopen的使用

如果同学们自学能力强,就可以自己在这个网站上自学这个函数。

在这里插入图片描述

fopen的参数
const char * filename, const char * mode 第一个参数打开的文件名,而第二个参数是文件的打开方式。
fopen的第二个参数的打开方式
对于文件来说,打开方式有很多种请看下图和下表,这些都是他的打开方式,每种方式打开的效果肯定都不相同,所以下面讲述文件的使用的时候会仔细讲解。现在只要知道大概是干什么就行了。

在这里插入图片描述

文件使用方式含义如果指定文件不存在
“r”(只读)为了输入数据,打开一个已经存在的文本文件出错
“w”(只写)为了输出数据,打开一个文本文件建立一个新的文件
“a”(追加)向文本文件尾添加数据建立一个新的文件
“rb”(只读)为了输入数据,打开一个二进制文件出错
“wb”(只写)为了输出数据,打开一个二进制文件建立一个新的文件
“ab”(追加)向一个二进制文件尾添加数据出错
“r+”(读写)为了读和写,打开一个文本文件出错
“w+”(读写)为了读和写,建议一个新的文件建立一个新的文件
“a+”(读写)打开一个文件,在文件尾进行读写建立一个新的文件
“rb+”(读写)为了读和写打开一个二进制文件出错
“wb+”(读写)为了读和写,新建一个新的二进制文件建立一个新的文件
“ab+”(读写)打开一个二进制文件,在文件尾进行读和写建立一个新的文件
fopen的返回值
FILE *,返回一个文件指针。
文件打开成功,指向所要打开的文件。文件打开失败,指向空指针。

🦊3.2.2fclose的使用

在这里插入图片描述

fclose的参数
FILE * stream ,他的参数就是所要关闭文件的文件指针。
fclose的返回值
int ,返回值是一个整型,如果文件成功关闭,则返回零值。失败时,将返回 EOF。
但是我们需要注意的一点是,为了避免生成野指针,再关闭完文件后,需要将指针设为空指针,可以类比一下动态内存函数 free,在释放完空间,需要将指针设为空指针。

🦊3.2.3代码实现

int main()
{
	//打开文件
	FILE* pf = fopen("text.txt", "w");
	//防止打不开文件返回空指针
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//这时就可以写文件了

	//关闭文件
	fclose(pf);
	pf = NULL;
	//防止空指针,生成野指针
	return 0;
}

这是有同学有疑问了,文件名不是文件路径吗,怎么上面没有文件路径呢,只有文件名主干+文件后缀 呢,其实这是相对路径,他在写这个代码文件下创建文件。
那么有相对路径,就会有绝对路径,对于绝对路径,就是将文件路径也写出来,最后就在你写的那个文件路径下创建,这就是他的区别。

🐕4文件的读写

对于文件的读写来说,文件的读写分为顺序读写和随机读写,这两块都是很重要的,下面就一一讲解。

🐶4.1文件的顺序读写

首先,对于文件的读写,里面有一些函数,先看下表在作解释。

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

看玩这个表,大家可能感觉还是有点懵,不要怕,先用我们会的知识类比一下我们就知道了,我们常用的scanfprintf函数,他们是怎么用的呢。
scanfprintf函数都是通过外部工具来改变内存,
scanf是通过键盘将数据输入内存。(读操作)
printf是内存通过屏幕将数据输出。(写操作)
所谓的键盘和屏幕就是外部设备,而我们现在要了解的就是通过文件来该改变内存。

首先我们先了解一下什么是文件的输入和输出函数,
⭐所谓文件输入函数,就是通过文件将数据入内存。(读操作)
⭐文件输出函数,就是内存将数据在文件中。(写操作)

好了我们现在了解了这些东西,我们就可以看着表格
🍔文件输入函数,内存读文件,
如果一个字符一个字符的读,就可以用fgetc函数
如果是一行一行的读,就可以用fgets函数
如果格式化的数据输入,就用fscanf函数
如果是二进制的数据输入,就用fread函数
🍔文件输出函数,内存写在文件上
如果一个字符一个字符的写,就可以用fputc函数
如果是一行一行的写,就可以用fputs函数
如果格式化的数据输出,就用fprintf函数
如果是二进制的数据输出,就用fwrite函数

🦊4.1.1输出字符函数fputc

fputc的作用
字符输出函数,可以将所要的字符打印到想要的文件中。但是注意的一点就是他适用于所有输出流,具体下面解释
在这里插入图片描述
fputc的参数
int character, FILE * stream 第一个参数就是所要写的字符,而第二个参数就是所要输出的文件指针。
fputc的返回值
int如果输出成功,返回该字符,输出失败就返回 EOF
fputc怎么代码实现
代码如下
#include<stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "w");
	//防止是空指针
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//使用fputc写文件	
	fputc('a', pf);
	fputc('b', pf);
	fputc('c', pf);
	
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

🦊4.1.2读取字符函数fgetc

很容易看出来,这个跟上面这个函数是个对立面。

在这里插入图片描述

fgetc的参数
FILE * stream参数是文件指针,就是要从那个文件获取字符。
fgetc的返回值
int输入成功,就返回该字符,返回失败,就返回EOF
fgetc怎么用呢
代码如下
int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "r");
	//防止是空指针
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//使用fgetc读文件	
	int ret = fgetc(pf);
	printf("%c ", ret);

	ret = fgetc(pf);
	printf("%c ", ret);

	ret = fgetc(pf);
	printf("%c ", ret);
	
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述
我们是将fputc的内容用fgetc打印出来,ret变量我们并没有改变他,但是我们三次打印的结果都不一样,说明什么,说明在用输入函数后文件指针会自己加1,跳到下一个字符。
⭐但是大家发现一个问题没有,我们在打印的时候我们是知道他里面有三个字符我们才用的3,但是在我们平常使用的时候我们并不知道文件里有多少个字符,这时我们就要用到他的返回值,当他返回失败的时候就会返回EOF,我们可以利用这个特点使用这个函数。那就看下面这个代码。

int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "r");
	//防止是空指针
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//使用fgetc读文件	
	int ret = 0;
	while ((ret = fgetc(pf)) != EOF)
	{
		printf("%c ", ret);
	}
	
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

🦊4.1.3输出行函数fputs

可以类比一下,fputs是输出字符,而fputs则是输出一行。

在这里插入图片描述

fputs的参数
const char * str, FILE * stream ,第一个参数所要传的字符串地址,第二个参数就是文件指针。
fputs的返回值
int,输出成功,返回非负值,输出失败,返回EOF。
fouts的实现代码
代码如下
int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "w");
	//防止是空指针
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//使用fputs写文件	
	fputs("hello", pf);
	//我们知道hello字符串就表示首元素地址
	fputs("1024 Happy", pf); 
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在文件中就有这样想要达到换行的效果,在代码末尾加入\n.效果图就是第二张图片,我们下面的读取文本行就用这个文件。
在这里插入图片描述在这里插入图片描述

🦊4.1.4读取文本行函数fgets

在这里插入图片描述

fgets函数的参数
char * str, int num, FILE * stream
⭐第一个参数是读取完字符串要拷贝到的字符串指针,
⭐第二个参数就是拷贝的最大字符数,包括空字符( \0),这个有点说法,一会看代码,代码解释。
⭐第三个参数要读取文件的文件指针。
fgets函数的返回值
char*,读取成功后,该函数返回 str。失败返回 EOF
fgets函数的代码实现
代码如下
int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "r");
	//防止是空指针
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//使用fgets读文件	
	char str[] = "##########";
	fgets(str, 5, pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

我们这个图是调试后,str的内容,我们要读取的是5个字符,比实际的字符少一个字符,因为其中包括\0,所以要读取"hello"字符串,就要读取6个字符
但是我们第一行只有"hello"这个字符串,只能读取这个字符,就算多读取字符,那也不能读取,他读到\n就停下来了。具体效果图看下图。如果想读下一行就再引用一次就好了。
在这里插入图片描述

🦊4.15格式化输出函数fprintf

我们上面将字符,文本行的读写都介绍了一遍怎么使用,但是当我们使用结构体到文件中我们怎么用呢
这时我们就需要用到我们的格式化输出函数
⭐ 那么这个函数怎么用呢,我们认识printf,那我们就将他们对比一下,发现好像很相似。

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

fprintf的参数
FILE * stream, const char * format, ... ,第一个参数文件指针,就是输出到那个文件中,第二个参数发现和 printf一样,其实就和他是相同的。
fprintf的返回值
int,输出成功后,将返回写入的字符总数。如果发生写入错误,则设置错误指示器(ferror)并返回负数。
struct stu
{
	char name[20];
	int age;
	float score;
};
int main()
{
	//创建一个结构体变量
	struct stu s = { "tongtong",20,100.0 };
	//打开文件
	FILE* pf = fopen("test.txt", "w");
	//判断是否为空指针
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//输入格式化结构体
	fprintf(pf, "%s %d %.1f ", s.name, s.age, s.score);
	
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

我们看一看文件里有什么,大家就知道他怎么用了
在这里插入图片描述

🦊4.1.6格式化输入函数fscanf

一个输入,一个输出,大同小异,就不多赘述了

在这里插入图片描述

fscanf的参数
FILE * stream, const char * format, ...第一个参数文件指针,就是输出到那个文件中,第二个参数发现和 scanf一样,其实就和他是相同的。
fscanf的返回值
int,成功后,该函数返回成功填充的参数列表的项数。此计数可以匹配预期的项目数,也可以由于匹配失败、读取错误或文件末尾的范围而减少(甚至为零)。
如果在读取时发生读取错误或到达文件末尾,则会设置正确的指示器(feof 或 ferror)。而且,如果在成功读取任何数据之前发生任何一种情况,则返回 EOF。
struct stu
{
	char name[20];
	int age;
	float score;
};
int main()
{
	//创建一个结构体变量
	struct stu s = { 0 };
	//打开文件
	FILE* pf = fopen("test.txt", "r");
	//判断是否为空指针
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//输入格式化结构体
	fscanf(pf, "%s %d %.1f ", s.name, &(s.age), &(s.score));
	printf("%s %d %.1f ", s.name, s.age, s.score);

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

输入了一个结构体
在这里插入图片描述

🦊4.1.7二进制输出函数fwrite

在这里插入图片描述

fwrite的参数
const void * ptr, size_t size, size_t count, FILE * stream,第一个参数是指向要写入的元素数组的指针,转换为常量 void*。第二个参数要写入的每个元素的大小(以字节为单位)。size_t是无符号整数类型。第三个参数元素数。第四个参数指向指定输出流的 FILE 对象的指针。
fwrite的返回值
返回成功写入的元素总数。如果此数字与 count 参数不同,则写入错误会阻止函数完成。在这种情况下,将为流设置误差指示器(ferror)。如果大小或计数为零,则该函数返回零,并且错误指示器保持不变。
struct stu
{
	char name[20];
	int age;
	float score;
};
int main()
{
	//创建一个结构体变量
	struct stu s = { "tongtong",20,100.0 };
	//打开文件
	FILE* pf = fopen("test.txt", "w");
	//判断是否为空指针
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//输入格式化结构体
	fwrite(&s,sizeof(struct stu),1,pf);
	
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

我们这时看一眼文件,发现我们看不懂,这只有计算机能够看懂,他是二进制在这里插入图片描述

🦊4.1.8二进制输入函数fread

在这里插入图片描述

fread的参数
void * ptr, size_t size, size_t count, FILE * stream,这个跟写函数的参数一样。就是读,变成了写
fread的返回值
返回成功读取的元素总数。
如果此数字与 count 参数不同,则表示读取时发生读取错误或到达文件末尾。在这两种情况下,都设置了正确的指示器,可以分别使用铁道和feof进行检查。
如果大小或计数为零,则该函数返回零,并且 ptr 所指向的流状态和内容保持不变。
struct stu
{
	char name[20];
	int age;
	float score;
};
int main()
{
	//创建一个结构体变量
	struct stu s = { 0 };
	//打开文件
	FILE* pf = fopen("test.txt", "rb");
	//判断是否为空指针
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//输入格式化结构体
	fread(&s, sizeof(struct stu), 1, pf);
	printf("%s %d %.1f ", s.name, s.age, s.score);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

最后将文件中的内容也打印出来了,文件中的内容是用fwrite写的
在这里插入图片描述

🐖小总结

对于printf,scanf他们所作用的外部设备分别是屏幕和键盘,而这个就是标准输出输入流,
而在上面那个表格我们可以看到fputc,fgetc,fputs,fgets,fprintf,fscanf,这些适用于所有输出输入流,二进制的输入输出函数这些只能作用于文件。
什么是所有输出输入流?难道这些也能作用到键盘和屏幕吗,答案是可以的,这时就跟printf,scanf相同了,而这些标准输出输入流,不像文件需要自己打开,自己关闭,都是系统默认打开的。

⭐对于任何一个C程序,只要运行起来
就默认打开3个流
stdin-----标准输入流—键盘
stdout—标准输出流—屏幕
stderr—标准错误流—屏幕
⭐他们三个的类型都是FILE*

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

这里是引用
输入一个q,在输出一个q,其实可以这样比较一下
scanf= return 0; printf=fputc(ch, stdout);

🐶5.文件的随机读写

上面我们介绍了文件顺序读写所要用到的函数,还有用文件操作的知识写的通讯录,我们就可以模仿学习上面的函数学习随机读写的函数。

🦊5.1.1fseek

在这里插入图片描述

fseek的参数
FILE * stream, long int offset, int origin
第一个参数:文件指针,指向所要读写的文件
第二个参数:偏移量,所指向的字符的偏移量。
第三个参数:从那里开始,对于偏移量的参考,有三种方式,请看下表
fseek的返回值
int,如果成功,该函数将返回零。否则,它将返回非零值。
如果发生读取或写入错误,则设置错误指示器(ferror)。
第三个参数参考位置
SEEK_SET文件开头
SEEK_CUR文件指针的当前位置
SEEK_END文件结尾 *

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

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

相关文章

Shiro相关知识

1、Shiro功能概述 Apache Shiro是一个功能强大且易于使用的 Java 安全框架&#xff0c;可执行身份验证、授权、加密和会话管理。 主要功能&#xff1a; Authentication&#xff1a;身份认证。登录时验证身份信息。 Authorization&#xff1a;授权操作。访问控制的过程&…

CSS布局基础(标签类型,盒子模型)

布局基础 元素显示类型&#xff0c;盒子模型 标签类型块元素常见块元素 行内元素常见行内元素 行内块元素常见行内块 模式转换显示类型显著区别 盒子模型盒子组成布局描述边框圆角 内边距外边距块元素居中盒子内行内&#xff08;块&#xff09;元素居中 外边距使用陷阱两盒子外…

【进阶C语言】动态版通讯录的实现(详细讲解+全部码源)

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于C语言进阶系列&#xff0c;本专栏主要内容为数据的存储、指针的进阶、字符串和内存函数…

Linux基础IO【重定向及缓冲区理解】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f307;前言&#x1f3d9;️正文1、文件描述符1.1、先描述&#xff0c;再组织1.2、files_struct1.3、分配规则…

Java数组的学习(基础)

目录 第一章&#xff1a;数组的概念介绍 1.数组的概念 2.数组的初始化/数组的创建/数组的定义 第二章&#xff1a;数组的使用 数组添加元素的方法/数组的赋值 数组的遍历 数组之选择排序的升序 数组之冒泡排序的升序 数组的最小值 数组的反转 数组中常见的异常 第三…

Python程序员想要转行,可以从这几个方面着手

最近有很多朋友问我一个问题&#xff0c;不论是我们做程序员还是做产品经理或者其他行业&#xff0c;到了30岁或35岁之后&#xff0c;都会面临各种各样的问题&#xff0c;比如达到职业天花板。有没有一种方法能够解决这种问题呢&#xff1f;我想分享一下我的观点和身边的案例。…

《Netty》从零开始学netty源码(四十七)之PooledByteBuf的方法

setBytes() 从channel中读取数据并写到PooledByteBuf中&#xff0c;分配缓存的过程与getBytes一样&#xff0c;只是duplicate为false。 capacity() 动态更新容量&#xff0c;根据新传入的容量值更改length。 如果新容量值与旧值相同则无需扩容如果为非池化内存则根据新容量值…

Zabbix部署详解

文章目录 Zabbix安装部署一、zabbix-server端部署二、zabbix-agent端部署 Zabbix安装部署 环境准备 VMware Workstation Pro 15.0 版本 系统 Centos7 内存 4G 处理器 2G 硬盘 50G 网络适配器 NAT 两台服务器&#xff0c;一台做zabbix-server、一台做zabbix-agent 关闭防火墙、…

【华为OD机试真题】信号发射和接收(javaC++python)100%通过率 超详细代码注释

信号发射和接收 知识点数组栈 单调栈时间限制: 1s 空间限制: 256MB 限定语言:不限 题目描述: 有一个二维的天线矩阵,每根天线可以向其他天线发射信号也能接收其他天线的信号,为了简化起见,我们约定每根天线只能向东和向南发射信号,换言之,每根天线只能接收东向或南向发…

unity-VRTK-simulator开发学习日记2(抛物线 导包|使用|调用方法)

导包 使用抛物线 1.层级目录下添加抛物线曲线 2.将跟踪控制器 给到抛物线的“跟随资源” &#xff08;选择哪只手射出射线&#xff09; 3.激活按键 找到模拟手柄按键 找到simulator的交互的几个按键&#xff08;ButtonOne为例&#xff09; value&#xff0c;默认值为false&a…

Doris(20):Doris的函数—数学函数

1 查看函数名 show builtin functions in test_db; 2 abs(double a) 功能: 返回参数的绝对值 返回类型:double类型 使用说明:使用该函数需要确保函数的返回值是整数。 3 acos(double a) 功能: 返回参数的反余弦值 返回类型:double类型 MySQL 中反余弦函数 ACOS(…

【五一创作】使用Scala二次开发Spark3.3.0实现对MySQL的upsert操作

使用Scala二次开发Spark实现对MySQL的upsert操作 背景 在我们的数仓升级项目中&#xff0c;遇到了这样的场景&#xff1a;古人开发的任务是使用DataStage运算后&#xff0c;按照主键【或者多个字段拼接的唯一键】来做insert then update&#xff0c;顾名思义&#xff0c;也就…

能上网的ChatGPT,会带来什么改变

最近关注AI的人&#xff0c;应该会注意到这条新闻。 ChatGPT官方推出新模式—Default&#xff08;GPT-3.5&#xff09;with browsing 这个是之前ChatGPT没有的功能&#xff0c;ChatGPT以前的训练数据是在2021年左右&#xff0c;并不知道最近的新闻。 现在ChatGPT 能够联网以…

AIGC提词生成图片(人物照片)练习笔记

文生图, 图生图 等 AIGC 创作大火, 也来体验一下吧. 本文记录了环境搭建过程与使用心得. 如果动手能力弱或只想省心, 有 环境要求 列出来我的环境吧: CPU, AMD Ryzen 7 5800X 8-Core ProcessorRAM, 32GGPU, NVIDIA GeForce RTX 2070 SUPER (8G)OS, Windows 11 专业版开发环境…

Qt MSVC开发

环境搭建 安装Virsual Studio&#xff0c;版本可以选择最新版本&#xff0c;我安装的时vs2022&#xff0c;安装时需要勾选 C 桌面开发 安装QT, 下载地址&#xff1a;https://download.qt.io/official_releases/online_installers/&#xff0c;安装时需要选择MSVC 2019 64-bit。…

Packet Tracer - 配置 RIPv2

Packet Tracer - 配置 RIPv2 目标 第 1 部分&#xff1a;配置 RIPv2 第 2 部分&#xff1a;验证配置 拓扑图 背景信息 尽管在现代网络中极少使用 RIP&#xff0c;但是作为了解基本网络路由的基础则十分有用。 在本活动中&#xff0c;您将使用适当的网络语句和被动接口配置…

【LeetCood206】反转链表

题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 答案1&#xff1a; 新建链表&#xff0c;遍历原链表&#xff0c;一个一个头插到新建的链表.直到结点为null public ListNode reverseList(ListNode head) {ListNode secondListHead n…

【细读Spring Boot源码】监听器合集-持续更新中

前言 监听器汇总 归属监听器名称作用cloudBootstrapApplicationListenercloudLoggingSystemShutdownListenercloudRestartListenercloudLoggingSystemShutdownListenerspringbootEnvironmentPostProcessorApplicationListener用于触发在spring.factories文件中注册的Environm…

osg操控器之动画路径操控器osgGA::AnimationPathManipulator分析

目录 1. 前言 2. 示例代码 3. 动画路径操控器源码分析 3.1. 构造函数 3.2. home函数 3.3. handle函数 3.3.1 帧事件处理 3.3.2. 按键事件处理 4. 主要接口说明 1. 前言 osg官方提供了很多操控器&#xff0c;在源码目录下的src\osgGA目录下&#xff0c;cpp文件名含有Ma…

初识AUTOSAR

目录 应用层 Runnable Port 运行时环境 基础软件层 总结 AUTOSAR&#xff0c;全称为Automotive Open System Architecture&#xff0c;即汽车开放系统架构。它最初于2003年由当时全球各家顶级汽车制造商&#xff08;奔驰、宝马、大众等&#xff09;、零部件供应商&#x…