【C/C++】万字图文详解C语言文件操作 完美装饰课设大作业

news2025/7/11 18:32:54

目标导航

写在前面

为什么使用文件?

什么是文件?

程序文件

数据文件

认识文件名

文件的打开和关闭

文件指针

文件的打开和关闭

1.以"r"(只读)的方式打开文件

2.以"w"(只写)的方式打开文件

3.以"a"(追加)的方式打开文件

文件的顺序读写

输入流与输出流的概念

fputc & fgetc

fputs & fgets

fscanf & fprintf

文件的随机读写

fseek

ftell 

rewind

文本文件和二进制文件

文件读取结束的判定

被错误使用的feof

文件缓冲区


写在前面


在完成某项课设大作业时,我们的老师可能要求我们将内存中存储的数据保存到文件里,方便随用

随取。本章详细介绍了文件一系列操作:文件的打开与关闭、文件的读与写等,以及拓展知识:文

件缓冲区的介绍等。掌握了文件操作不仅能使我们的程序设计锦上添花,还能让我们对程序设计以

及计算机有更深层次的了解。

为什么使用文件?


当我们写了一个简单的小游戏或者是一个班级信息管理系统,又或是通信录等需要存储数据的程

序,在程序运行时,我们保存进去很多信息,例如游戏的对局记录、班级人员信息、联系人信息

等。我们对这些信息经过一系列增删查改操作后,此时信息被保存到了内存中。当关闭程序,再次

打开程序后,令人揪心的事发生了,我们上次保存的数据不见了,那就在录入一遍吧.......

首先我们得知道关闭程序后数据为什么会丢失。因为这些数据都保存在内存中,程序结束后这些内

存会被释放归还给操作系统

为了避免数据的丢失,我们在关闭程序前可以将内存中的数据保存磁盘上或者数据库中以使数据持

久化。而使用文件,我们就可以很好的将数据保存在磁盘中。

什么是文件?


 在磁盘中保存的就是文件,但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件

(从文件功能的角度来分类的)。

程序文件

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

(windows环境后缀为.exe)

数据文件

程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。在
 

以前各章所处理数据的输入输出都是以终端(例如printf、scanf)为对象的, 即从终端的键
 

盘输入数据,运行结果显示到显示器上。其实有时候我们会把信息输出到磁盘上,当需要的
 

时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上文件。

本章节讨论的就是数据文件。

认识文件名


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

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

文件的打开和关闭


文件指针

缓冲文件系统中,关键的概念是 文件类型指针 ,简称 文件指针
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的
名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是
有系统声明的,取名 FILE
例如, 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;
不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。每当打开一个文件的时
候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必
关心细节。一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方
便。下面我们可以创建一个FILE*的指针变量:
FILE* pf;//文件指针变量
定义pf是一个指向FILE类型数据的指针变量。可以 使pf指向某个文件的文件信息区 (是一个
结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说 ,通过文件指针变
量能够找到与它关联的文件

文件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件

在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当

于建立了指针和文件的关系。ASCII 规定使用fopen函数来打开文件,fclose来关闭文件。

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

让我们创建一个项目实际操作一下吧。

写代码:

#include<stdio.h>
int main()
{
	//打开文件
	
	//相对路径
	//FILE* pf = fopen("test.txt", "w");

	//绝对路径
	FILE* pf = fopen("D:\\2022\\2022_c\\test_11_25\\test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		exit(-1);
	}
	//写文件
	//......

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

接下来对代码的每一步进行解释:

打开文件时有两种方式:相对路径和绝对路径

相对路径:在当前源程序(.c)文件所在的路径下的某个文件。

绝对路径:任意路径下的文件。

fopen并非每次都能成功地打开文件。打开成功则返回指向该文件的文件信息区的指针;打开失败

则返回NULL。 所以使用pf前必须加以判断。

free的原理相同,fclose关闭文件后,pf指向的地址不再有效,为了避免不小心再次使用,需将

其置为NULL

以上代码中的"w",指一种文件的打开方式,含义为“只写”的方式打开。除了"w"之外,还有许许多

多的打开方式,如下:

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

接下来我们就简单认识一下前三个打开方式。

1.以"r"(只读)的方式打开文件

FILE* pf = fopen("test.txt", "r");

以只读的方式打开文件,只能从文件里读取数据,而不能写如数据或者修改数

如果找到该文件,则返回指向该文件的文件信息区的FILE类型的指针;

如果未找到,则返回NULL。

2.以"w"(只写)的方式打开文件

FILE* pf = fopen("test.txt", "w");

以只写的方式打开文件,只能写入数据到文件中,而不能读取文件数据

如果未找到该文件,则在该路径下创建该文件并返回指向该文件的文件信息区的指针;

如果找到该文件,则丢弃该文件中的内容,视其为新的空文件,并返回指向该文件的

文件信息区的指针。

3.以"a"(追加)的方式打开文件

FILE* pf = fopen("test.txt", "a");

以追加的方式打开文件,含义为在该文件的末尾打开文件进行写入

如果未找到该文件,则在该路径下创建该文件并返回指向该文件的文件信息区的指针;

如果找到该文件返回指向该文件的文件信息区的指针。

学会了如何打开和关闭文件之后,我们来看看如何进行文件的读与写。

文件的顺序读写


文件顺序读写所涉及的函数有:

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

输入流与输出流的概念

C语言中,把不同类型的输入输出源称为流,根据其作用分为输入流和输出流。

例如我们的终端设备键盘与屏幕就是两种流;键盘称之为标准输入流,屏幕为标准输出流

与之类似,文件也是一种流。文件保存在磁盘中,因此我们也可以把文件看作一种外部设

备。所有输入/输出流指的是标准输入/输出流和其他输入/输出流。

输入输出是指:

从输入流中把数据读取到内存中,称为输入。(例如,scanf从键盘中读取数据到内存中)

把内存中的数据写入到输入流中,称为输出。(例如,printf把内存中的数据打印到屏幕上)

fputc & fgetc

fputc的作用是,将一个整型数据写入流中。整型数据将会被写入到文件指针所指向的位置。

文件指针默认指向文件起始位置偏移量为0的位置。并且每成功写入一个数据,该指针自动向

前移动一位。

返回值:

如果成功则返回该整型数据;

如果失败则返回EOF。

示例:

#include<stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "w");
	//判空
	if (pf == NULL)
	{
		perror("fopen");
		exit(-1);
	}

	fputc('a', pf);
	
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}


 fgetc的作用是,返回指定流中文件位置指针指向的字符,然后该指针后移一位。

返回值:

如果读取成功则返回读取字符的ASCII码值

如果读取失败则返回EOF;

如果文件位置指针指向文件末尾则返回EOF;

如果发生其他错误返回EOF;

示例:

读取文件中写好的26个英文字母。

#include<stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "r");
	//判空
	if (pf == NULL)
	{
		perror("fopen");
		exit(-1);
	}
	int ch = 0;
	while ((ch=fgetc(pf)) != EOF)
	{
		printf("%c ", ch);
	}
	
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

fputs & fgets

fputs的作用是,将字符串str写入流中。从str的起始位置开始写入,直至遇到'\0'结束,并

且'\0'不会写入到流中。

返回值:

写入成功则返回非负值;

写入失败则返回EOF。

示例:

#include<stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "w");
	//判空
	if (pf == NULL)
	{
		perror("fopen");
		exit(-1);
	}

	fputs("hello world", pf);

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


fgets的作用是,从流中读取字符串并保存到str中,直到读取 (num-1)个字符或者遇

到'\n',或者到达文件末尾。读取完成之后,会自动在str末尾添加'\0'

注意:'\n'会被认为是有效字符读取到str中

返回值:

读取成功则返回str;

读取失败则返回NULL;

读取到文件末尾而停止则返回EOF;

示例:

#include<stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "r");
	//判空
	if (pf == NULL)
	{
		perror("fopen");
		exit(-1);
	}
	
	char str[15];
	fgets(str, 15, pf);
	printf(str);
	
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}


fscanf & fprintf

这次我们不用解读帮助文档,仅仅通过对比scanf和printf的函数构造就可以掌握fscanf和fprintf。

通过对比,二者相较于我们经常使用的scanf、printf仅仅多了一个流。其实它们不仅长相相似用法

也几乎完全相同。

示例:

将结构体类型的数据写到文件中:

#include<stdio.h>
struct S
{
	char name[20];
	int age;
	float score;
};

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

再将保存的数据读取出来:

#include<stdio.h>
struct S
{
	char name[20];
	int age;
	float score;
};

int main()
{
	struct S s = { "zhangsan", 20, 95.5f };
	//打开文件
	FILE*pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		exit(-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;
}

 

这里再补充说明一点 :

前面我们提到,键盘和屏幕是标准输入输出流,它俩的FILE指针分别写作:

stdin(标准输入流)    stdout(标准输出流)

那运用我们的奇思妙想,思考一下以下这两组的含义是否相同?

scanf(...)
fscanf(stdin,...)

printf(...)
fprintf(stdout, ...)

答案是肯定的。这两组是等价的。

那我们平时使用键盘和屏幕时,为什么不像文件那样先打开它们所对应的流呢?

原因在于,对任何一个C程序,只要运行起来就默认打开3个流

stdin------标准输入流------键盘

stdout------标准输出流------屏幕

stderr------标准错误流------屏幕

三者的类型都为FILE*

文件的随机读写


所谓随机读写,就是可以按照需求在文件的任意位置进行读写,而完成这个操作所需的两个重要参数就是偏移量和起始位置。

fseek

根据文件指针的位置和偏移量来定位指针。

int fseek ( FILE * stream, long int offset, int origin );

返回值:

如果成功则返回0;

失败返回一个非负值。

示例:

#include<stdio.h>
int main()
{
	//打开文件
	FILE*pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		exit(-1);
	}
	//写文件
	fputs("This is an apple", pf);
	fseek(pf, 9, SEEK_SET);
	fputs(" sum",pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

ftell 

返回当前位置相较于文件起始位置的偏移量。

long int ftell ( FILE * stream );

示例:

#include<stdio.h>
int main()
{
	//打开文件
	FILE*pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		exit(-1);
	}
	//打印偏移量
	fseek(pf, 9, SEEK_SET);
	printf("%d\n", ftell(pf));
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

rewind

让文件指针回到文件的起始位置。

void rewind ( FILE * stream );

文本文件和二进制文件


根据数据的组织形式,数据文件被称为文本文件或者二进制文件

数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的

文件就是文本文件。

一个数据在内存中是怎么存储的呢?

字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储也可以使用二进制形式存

储。如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符

一个字节),而二进制形式输出,则在磁盘上只占4个字节(VS2013测试)。

 示例:

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

结果:

文件读取结束的判定


被错误使用的feof

牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的读取是否结束。

而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束

1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )

例如:fgetc 判断是否为 EOF 。fgets 判断返回值是否为 NULL 。

2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。

例如:fread判断返回值是否小于实际要读的个数。

正确的使用:

文本文件的例子:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
	int c; // 注意:int,非char,要求处理EOF
	FILE* pf = fopen("test.txt", "r");
	if (pf==NULL)
	{
		perror("fopen");
		return 1;
	}
	//fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF
	while ((c = fgetc(pf)) != EOF) // 标准C I/O读取文件循环
	{
		putchar(c);
	}
	//判断是什么原因结束的
	if (ferror(pf))//pf==NULL
		puts("I/O error when reading");
	else if (feof(pf))//pf==EOF
		puts("End of file reached successfully");
	fclose(pf);
	pf = NULL;
}

文件缓冲区


ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内

存中为程序 中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送

到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从

磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到

程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

简单类比理解:邮局并不是只要有一位顾客要寄信件 ,就会立即发车前往目的地;而是有很

多封信件投递到达一定数量之后一次性发车。目的是为了高效率低成本。

这有一个简单的示例,可自行操作演示,感受文件缓冲区的存在:

#include <stdio.h>
#include <windows.h>
//VS2013 WIN10环境测试
int main()
{
 FILE*pf = fopen("test.txt", "w");
 fputs("abcdef", pf);//先将代码放在输出缓冲区
 printf("睡眠10秒-已经写数据了,打开test.txt文件,发现文件没有内容\n");
 Sleep(10000);
 printf("刷新缓冲区\n");
 fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到文件(磁盘)
 //注:fflush 在高版本的VS上不能使用了
 printf("再睡眠10秒-此时,再次打开test.txt文件,文件有内容了\n");
 Sleep(10000);
 fclose(pf);
 //注:fclose在关闭文件的时候,也会刷新缓冲区
 pf = NULL;
 return 0;
}
这里可以得出一个 结论
因为有缓冲区的存在,C语言在操作文件的时候, 需要做刷新缓冲区或者在文件操作结束的时候关
闭文件。 如果不做,可能导致读写文件的问题。
本章完!

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

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

相关文章

Java#24(常见API--2)

目录 一.Rantime Runtime表示当前虚拟机的运行环境 Runtime常用方法 扩展:对象克隆 二.Objects Objects是一个对象工具类,提供了一些操作对象的方法 一.Rantime Runtime表示当前虚拟机的运行环境 Runtime常用方法 方法名 作用 publi…

葡萄糖-聚乙二醇-链霉亲和素|Streptavidins-PEG-Glucose|链霉亲和素-PEG-葡萄糖

链霉亲和素(streptavidin下称SA)是与亲和素(avidin下称AV)是一种蛋白质&#xff0c;链霉亲和素是四聚体蛋白&#xff0c;大小为66KDa。一分子链霉亲和素可以高度特异性地与四分子生物素结合&#xff0c;两者之间的亲和力较为强烈。链霉亲和素分子由4条相同的肽链组成&#xff0…

delete-by-query和复合查询

根据term&#xff0c;match等查询方式去删除大量的文档 Ps&#xff1a;如果你需要删除的内容&#xff0c;是index下的大部分数据&#xff0c;推荐创建一个全新的index&#xff0c;将保留的文档内容&#xff0c;添加到全新的索引 # delete-by-query POST /sms-logs-index/sms-lo…

毕业设计-基于机器视觉的颜色目标识别

目录 前言 课题背景和意义 实现技术思路 什么是彩色空间 怎么利用彩色空间 颜色识别的过程 读取图片进行hsv色域转换 对图片特定颜色识别 本地摄像头对视频流进行颜色识别 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后…

Python基础-面向对象编程之特性(property)

Python面向对象编程之特性(property) 一、统一访问原则 通常&#xff0c;我们访问实例或类的属性时&#xff0c;将返回所存储的相关值。而特性&#xff08;property&#xff09;是一种特殊的属性&#xff0c;访问它时会计算它的值。 请看下面的例子&#xff1a; import mat…

基于android的个性闹铃的设计与开发(闹铃,日历,计时器,备忘录)

目 录 摘 要 2 Abstract 2 1 选题的背景和意义 5 1.1 选题的背景 5 1.2 国内外研究现状 5 1.2.1 国内外手机系统现状 5 1.2.2 国内外手机应用现状 7 1.2.3 发展趋势 7 2 需求分析 9 2.1 系统需求 9 2.2 需求分析 9 2.3 约束与限制 10 3 总体设计 11 3.1 系统结构图 11 3.2 总体…

【数论】约数

文章目录一、试除法求n的所有约数二、约数个数三、约数之和四、最大公约数&#xff08;欧几里得算法/辗转相除法&#xff09;一、试除法求n的所有约数 vector<int> getDivisors(int n) {vector<int> ans;for (int i 2; i < n / i; i) {if (n % i 0) {ans.pus…

深度学习Week8-咖啡豆识别(Pytorch)

目录 一、前期准备 1.设置GPU 2. 导入数据 3. 划分数据集 二、手动搭建VGG-16模型 1. 搭建模型​编辑 2. 查看模型详情 三、 训练模型 1. 编写训练函数 2. 编写测试函数 4. 正式训练 四、 结果可视化 1. Loss与Accuracy图 2. 指定图片进行预测 3. 模型评估 *五、优…

[附源码]java毕业设计中达小区物业管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

学生家乡网页设计作品静态HTML网页模板源码 广西旅游景点网页设计 大学生家乡主题网站制作 简单家乡介绍网页设计成品

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

Packet Tracer - 配置 IPv4 和 IPv6 接口

地址分配表 设备 接口 IPv4 地址 子网掩码 默认网关 IPv6 地址/前缀 R1 G0/0 172.16.20.1 255.255.255.128 不适用 G0/1 172.16.20.129 255.255.255.128 不适用 S0/0/0 209.165.200.225 255.255.255.252 不适用 PC1 NIC 172.16.20.10 255.255.255.128 1…

微服务架构的环境搭建及简单测试

目录 一、系统架构的演变过程 1.0 前言 1.1 单体应用架构 1.2 垂直应用架构 1.3 分布式架构 1.4 SOA架构 1.5 微服务架构 二、微服务架构搭建 2.1 微服务架构简介 2.2 微服务案例准备 2.3 创建父工程、基础模块 2.4 创建微服务 一、系统架构的演变过程 1.0 前言 随着互联网的…

【Queue】- 从源码分析PriorityQueue及其常用方法

文章目录PriorityQueue基础知识概述PriorityQueue内部结构PriorityQueue扩容操作PriorityQueue队列的构造方法PriorityQueue队列的常用方法public boolean offer(E e)public E peek()public boolean remove(Object o)public boolean contains(Object o)public Object[] toArray…

【SU-03T离线语音模块】:学习配置使用

前言 时不可以苟遇&#xff0c;道不可以虚行。 一、介绍 1、什么是语音识别模块 语音识别模块是在一种基于嵌入式的语音识别技术的模块&#xff0c;主要包括语音识别芯片和一些其他的附属电路&#xff0c;能够方便的与主控芯片进行通讯&#xff0c;开发者可以方便的将该模块嵌…

Node.js 入门教程 3 如何安装 Node.js

Node.js 入门教程 Node.js官方入门教程 Node.js中文网 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录Node.js 入门教程3 如何安装 Node.js3 如何安装 Node.js Node.js 可以通过多种方式安装。 所有主流平台的官方软件包都可以在 http://node…

终于见识到了微服务的天花板:阿里内部SpringCloud全线手册,太强了

后台都是在问微服务架构的面试题怎么答&#xff0c;想聊聊微服务架构了。微服务架构一跃成为 IT 领域炙手可热的话题也就这两年的事&#xff0c;大量一线互联网公司因为庞大的业务体量和业务需求&#xff0c;纷纷投入了微服务架构的建设中&#xff0c;像阿里巴巴、百度、美团等…

226. 翻转二叉树

文章目录1.题目2.示例3.答案①递归②迭代1.题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 2.示例 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xf…

智慧应急解决方案-最新全套文件

智慧应急解决方案-最新全套文件一、建设背景二、建设思路应急管理信息化发展“四纵四横”总体架构1、两网络2、四体系3、两机制三、建设方案四、获取 - 智慧应急全套最新解决方案合集一、建设背景 建立应急大数据管理体系是应急管理信息化建设中的重要环节&#xff0c;决定了应…

将数组沿指定轴划分为子数组numpy.split()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 将数组沿指定轴划分为子数组 numpy.split() [太阳]选择题 以下python代码输出错误的一项是? import numpy as np xnp.array([1,2,3,4,5,6,7,8,9,10,11,12]) print(【显示】x&#x…

数据库安装记录——Mysql8.0.23 msi 保姆级安装教程

今天遇到现场服务器安装数据库&#xff0c;特意记录安装过程。 本篇记录的服务器系统为&#xff1a;Windows Server 2012 R2 Standard 数据库版本为&#xff1a;Mysql8.0.23 msi 1、官网下载相应版本 2、安装过程 开端不顺&#xff0c;开始就出弹窗&#xff1a; 先插入一…