C——文件操作

news2024/11/24 14:10:16

1.前言

为什么要使用文件呢?

文件是储存在电脑的磁盘中的,如果没有文件,我们写程序的数据就会存储在电脑的内存中,程序退出,操作系统就会收回内存,数据就丢失了等再次运行程序的时候,是看不到上次的数据的,如果想要将数据持久化的保存,我们就可以使用文件。

2.什么是文件?

在磁盘上存储的文件就是文件。磁盘就是电脑上的硬盘存储,而文件就是电脑中的C盘、D盘等等上的文件。但是在程序操作中,我们一般谈的文件有两种:程序文件、数据文件(从文件的功能来分类的)。

2.1程序文件

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

2.2数据文件

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

我们在此讨论的是数据文件。

在以前的学习中所处理的数据的输入输出都是以终端为对象的,即从终端键盘上获取数据,将数据的运行结果打印到终端屏幕上。

而我们有时候需要将数据输出到磁盘中,或者从磁盘中得到我们需要的数据然后在内存上进行使用。这里我们就是对数据文件进行操作。

2.3文件名

文件要有一个唯一的标识符,以便用户识别和引用。

文件名包含三部分:文件路径+文件名主干+文件后缀。

 为了方便起见,文件标识常被称为文件名。我们将下面的就叫做文件名。

 3.二进制文件和文本文件

根据数据的组织形式,数据文件被分为二进制文件和文本文件。

数据在内存中以二进制的形式存储,如果不加任何转化直接存入文件中,就是二进制文件。

如果要求外存时以ASCII码值的形式存储,则需要在存储前进行转化。以ASCII字符的形式存储的文件就是文本文件。

如果用通俗的语言来说,文本文件是我们用眼睛能够看懂的,而二进制文件我们是看不懂的。

下面我来写段代码给大家看一下文本文件和二进制文件的区别。

 我利用该代码创建了一个test1.txt的文本文件和test2.txt的二进制文件。我给两个文件内存的东西是一样的数组,我们现在来看一下这两个文件的内容。

而当我们打开test2.txt时,系统就会提示该文件是二进制文件。

而当我们以记事本的形式打开的时候发现里面是一些我们看不懂的东西。这就是二进制文本与文本文件最明显的区别。 我们利用VS里面的二进制编辑器来打开该文件看看。

打开后为:

 我们刚才给该文件存的是1,2,3,4,5这5个整数,而在该文件中确实是以二进制的形式存储了这5个数。

4.文件的打开和关闭

4.1流和标准流

4.1.1流

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。C程序针对文件、画面、键盘等的数据输入输出操作都是通过流操作的。⼀般情况下,我们要想向流里写数据,或者从流中读取数据,都是要打开流,然后操作。

4.1.2标准流

那为什么我们从键盘输⼊数据,向屏幕上输出数据,并没有打开流呢? 那是因为C语言程序在启动的时候,默认打开了3个流:

  1. stdin-标准输入流,在大多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据。
  2. stdout-标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出流中。
  3. stderr-标准错误流,大多数环境中输出到显示器界面。 

 这是默认打开了这三个流,我们使用scanf、printf等函数就可以·1直接进行输入输出操作。stdin、stdou、stderr这三个流的类型是FILE*,通常被称为文件指针。在C语言中,就是通过FILE*的文件指针来维护流的各种操作的。

而在我个人看来,流其实就是C程序所面对的一个对象,window终端可以被看作一个流,对其操作就是利用键盘获取数据,利用屏幕打印数据。而对文件来说,我们可以将文件看作一个文件流,C程序通过各种函数对该文件进行写数据和读数据等操作。

4.2文件指针

我们对文件的各种操作都要依靠于文件指针。

当我们打开一个文件时,此时系统会内存生成内存空间作为文件信息区,用来存放文件的相关信息。这些信息是保存在一个结构体变量中的。该结构体变量由系统进行声明,取名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* pf;//文件指针

定义pf为一个指向FILE结构体变量的结构体指针变量。我们可以使pf指向某个文件的文件信息区的任何一个位置。通过该文件信息区就能访问到该文件。也就是说,利用文件指针可以间接找到我们需要的文件。

4.3文件的打开和关闭

文件在读写之前应该先打开文件,读写完毕后关闭文件。打开文件的时候会返回一个FILE*类型的指针。ANSI 规定使用fopen打开文件,使用fclose来关闭文件。

const char *filename:需要打开的文件的文件名

const char * mode:打开文件的方式

打开文件的方式有:

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

我们现在利用上面的知识来打开一个文件。

#include <stdio.h>

int main()
{
	//打开文件
	FILE* pf = fopen("demo.txt", "r");//我们要以读的形式打开demo.txt这个文件
	return 0;
}

 但是我们一定可以打开成功么?我们来看看fopen的返回值

 如果成功打开,则返回一个FILE*类型的指针,打开失败则返回空指针。为了避免对空指针的解引用操作,我们在使用该文件指针之前,最好对其进行判断,看其是否为空。如果打开失败,我们就没必要在运行该程序了,直接终止程序。

int main()
{
	//打开文件
	FILE* pf = fopen("demo.txt", "r");//我们要以读的形式打开demo.txt这个文件
	if (pf == NULL)
	{
		perror("fopen");
		return -1;
	}
	return 0;
}

 我们下来运行该程序看看结果如何?

打印了错误信息,说明打开失败了。这是为什么呢?我们以读的形式打开该文件,我们知道以读的形式打开文件时,如果文件不存在会报错。那么就说明我们当前目录下没有demo.txt这个文件。

我们打开该目录发现确实没有该文件,所以以读的形式打开时就会出错。

而我们先前已经知道以写的形式,如果文件存在则正常打开,如果文件不存在,则会创建一个该文件名的文件。

int main()
{
	//打开文件
	FILE* pf = fopen("demo.txt", "w");//我们要以写的形式打开demo.txt这个文件
	if (pf == NULL)
	{
		perror("fopen");
		return -1;
	}
	return 0;
}

 我们当前目录下并没有该文件,我们看是否可以生成一个以demo.txt为文件名的文件。

运行成功了,并没有报错。因为我们并没有任何打印语句,所以黑框框上面没有打印信息。我们再看下图,的确在当前路径下面生成了一个新的文件,文件名与我们写的相同。

 通过上述操作我们就成功打开了一个文件,然后我们就可以对文件进行操作。等我们操作完后,文件就这么放这么?当然不行。操作系统打开文件的数量是有上限的。我们在对文件完成操作后应该进行关闭文件的操作。这就要用到另一个函数——fclose。

我们就以上面打开的文件,再对其进行关闭操作。fclose的参数就是一个文件指针,打开文件会返回一个文件指针,我们只需把文件指针传给fclose即可。

int main()
{
	//打开文件
	FILE* pf = fopen("demo.txt", "w");//我们要以写的形式打开demo.txt这个文件
	if (pf == NULL)
	{
		perror("fopen");
		return -1;
	}

	//对文件进行操作
	//....

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

那这样就可以了嘛?我们只是关闭了文件,那就说明文件信息区就被关闭了,文件指针pf就没有指向的地址了,那它就有可能成为野指针。为了避免这种情况发生,我们在关闭文件后,最好将文件指针pf置为空,这样就规避了野指针的风险。

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

5.文件的顺序读写

5.1顺序读写函数介绍

函数名功能

适用于

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

我现在依次简单介绍这几个函数。

5.1.1字符输入函数

fputc

该函数的功能是写一个字符到流中。参数character就是我们要写进去的字符,stream就是我们要写进去的流,其实就是文件流,这里我们把对应文件的文件指针传过去即可。

该函数是给一个文件写字符,所以我们打开文件应该以读的形式。

//fputc
#include <stdio.h>

int main()
{
	//打开文件
	FILE* pf = fopen("demo.txt", "w");//我们要以写的形式打开demo.txt这个文件
	if (pf == NULL)
	{
		perror("fopen");
		return -1;
	}

	//将一个字符写入该文件中
	fputc('a', pf);
	
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

我们看到,确实将字符'a'写进了该文件。那现在,我们将26个字母全都写进该文件中。

	//将26个字母全都写入该文件中
	char ch = 'a';
	while (ch<='z')
	{
		fputc(ch, pf);
		ch++;
	}

我们也成功将26个字母写进了文件,我们看到,第一次写进去的a已经不见了,所以以写的形式打开文件,每次写之前都会将文件清空再往里面写。

fgetc

fgetc的功能是从文件流中读取一个字符,参数就是文件指针。 我们现在将上面给文件写进去的字符取出来,打印在屏幕上。我们现在是要从文件读取字符,所以我们要以读的形式打开文件。

//fgetc
#include <stdio.h>

int main()
{
	//打开文件
	FILE* pf = fopen("demo.txt", "r");//我们要以读的形式打开demo.txt这个文件
	if (pf == NULL)
	{
		perror("fopen");
		return -1;
	}

	//将文件中的26个字母取出来
	int ch = 0;
	while ((ch = fgetc(pf)) != EOF)
	{
		printf("%c", ch);
	}

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

注意fgetc函数一次只能读取一个字符,读到文件末尾或者读取失败会返回EOF。

fputs

该函数的功能是将一个字符串写入流中。const char* str:就是字符串的首地址,FILE* stream就是指向流的指针。

//fputs
#include <stdio.h>

int main()
{
	char arr[] = "abcdefg";

	//打开文件
	FILE * pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return -1;
	}

	//将字符串写入文件流中
	fputs(arr, pf);

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

运行程序,我们就可以将arr字符数组的内容写入文件中。 

fgets 

该函数的功能是从文件流中得到一个字符串。

char *str:用来存储从文件中获得的字符串

int num:复制到str的最大字符数

FILE *stream:文件指针 

我们事先在该文件下存放了这个字符串,我们利用fgets取出他,后将他打印在屏幕上。 

我们还需要注意的是,fgets会将\0也放入字符数组中。

我们看,它会将字符串复制过去后在追加一个\0在末尾。该函数会优先考虑\0,如果最大复制数为1,那么他就会把\0放到数组中。所以实际上你的最大复制数是num-1。

换行符会使fgets停止读取。 我们给该文件中放入三行信息,是否能一次性打印呢?

尽管我们的最大字符数已经大于文件所有的字符数,但是依旧不能全部打印出来。这是因为fgets遇到换行符会自动停止读取。所以为了将这三行信息打印出来,我们可以分三次打印。 

fprintf

fprintf与上面的区别在于,它可以将格式化的字符写入文件中。

//fprintf
#include <stdio.h>

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

int main()
{
	struct S s = { "zhangsan",18,65.5 };

	//打开文件
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return -1;
	}

	//将结构体中的格式化的数据写入文件中
	fprintf(pf, "%s %d %f", s.name, s.age, s.weight);

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

	return 0;
}

程序运行后,就将该格式化的字符写入文件中了

fscanf

 fscanf的用法刚好和fprintf相反,它是从文件中读取格式化的数据。

	//将文件中的格式化数据读取后存放在结构体变量中
	fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.weight));
	//读取后将内容打印在屏幕上
	printf("%s %d %f", s.name, s.age, s.weight);

因为我们要从文件中读取数据,所以我们要以读的形式打开文件。因为我们是要取出数据放入变量中,所以我们要用地址来接收。 

fread和fwrite 

这两个函数是以二进制的形式将数据写入文件流中或者从文件流中读取。

const void * ptr:存放数据的数组

size_t size:数组中每个数据的大小

size_t:数组中元素的个数

FILE * stream:文件流指针


//fwrite
#include <stdio.h>

int main()
{
	int arr[] = { 1,2,3,4,5 };
	//打开文件
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return -1;
	}

	//将数组arr的数据以二进制的形式写入文件中
	fwrite(arr,sizeof(int),5,pf);

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

	return 0;
}

 程序运行结束后,该数组中的内容就以二进制的形式存放进了该文件中。而数据以二进制的形式存放在文件中我们是看不懂的。

存放后,我们在利用fread函数,以二进制的形式将上述数据读取出来并打印在屏幕上。 我们这下利用fread函数来实现。

fread函数的功能就是从文件中读取数据块。

void * ptr:存放数据块的数组

size_t size:每个数据的大小

size_t count:有多少个数据

FILE * stream:文件流指针 

	//将文件中储存的5个整形读取出来存放在arr中,并打印在屏幕上
	fread(arr, sizeof(int), 5, pf);
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		printf("%d ", arr[i]);
	}

 存放数据的数据必须足够大。我们要从文件中读取数据,所以要采用读的形式打开文件。

5.2对比一组函数 

scanf/fscanf/sscanf

printf/fprintf/sprintf

 5.2.1scanf/fscanf/sscanf

scanf和fscanf我们已经了解,现在我们了解一下sscanf这个函数。

//sscanf
#include <stdio.h>

struct S
{
	char name[20];
	int age;
	float weight;
};
int main()
{
	struct S s = { 0 };
	char str[20] = "zhagnsan 18 65.5";

	//从字符串中读取格式化的数据放入结构体变量中
	sscanf(str, "%s %d %f", s.name, &(s.age), &(s.weight));
	//打印结构体变量
	printf("%s %d %f",s.name,s.age,s.weight);

	return 0;
}

我们使用该函数后,再利用printf格式化打印结构体变量可以成功打印。说明sscanf确实将字符串中的内容转化成了格式化的数据。

5.2.2printf/fprintf/sprintf

我们来看一下sprintf函数: 

//sprintf
#include <stdio.h>

struct S
{
	char name[20];
	int age;
	float weight;
};
int main()
{
	struct S s = { "zhagnsan", 18, 65.5 };
	char str[30] = { 0 };

	//从结构体变量中读取格式化数据转化成字符串存放在str中
	sprintf(str, "%s %d %f", s.name, s.age, s.weight);
	//打印字符串
	printf(str);

	return 0;
}

使用完该函数后,我们成功将格式化的数据存放进了字符串中,并通过打印字符串显示出了刚才的数据。 

6.文件的随机读写

我们利用上面的函数,只能按照顺序从前到后的读取数据或者写入数据。如果我们想指哪打哪可不可以呢?

当然是可以的。下面来介绍随机读写可能用到的几个函数。

6.1fseek

fseek的功能就是使文件指针指向以orign为参考位置偏移量为offset的位置处。 

FILE * stream:文件指针

long int offset:偏移量

int origin:参考位置

对于参考位置来说,有三种位置: 

第一个指的是文件起始位置,第二个指的是文件指针的当前位置,第三个指的是文件末尾。

 如果我们直接使用fgetc读取的话,只会按照顺序一个一个读取,如果我们想取出a后,然后直接取出f呢?我们就可以利用fseek函数实现。

//fseek
#include <stdio.h>

int main()
{
	//以读的形式打开文件
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return -1;
	}

	//文件中已经存放了abcdefghi这个字符串,如果我们直接使用fgetc就会拿到a
	int ch = fgetc(pf);
	printf("%c\n", ch);

	//我们以起始位置为参考,只需偏移5个位置,就可以拿到f
	fseek(pf, 5, SEEK_SET);
	//此时,pf已经指向f了,我们现在在利用fgetc读取一个字符,读到的就是f
	ch = fgetc(pf);
	printf("%c\n", ch);

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

6.2ftell 

ftell的功能是返回当前文件指针的当前位置。

6.3rewind

该函数的功能就是使文件指针重新指向文件的起始位置。

//rewind
#include <stdio.h>

int main()
{
	//以读的形式打开文件
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return -1;
	}
	//文件事先已经写入了abcdefghi
	//我们以起始位置为参考,只需偏移5个位置,就可以拿到f
	fseek(pf, 5, SEEK_SET);
	int ch = fgetc(pf);
	printf("%c\n", ch);

	//我们在使用rewind函数,使文件指针重新指向起始位置
	rewind(pf);
	printf("%c\n", fgetc(pf));//现在在取出一个字符的话,就是a

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

7.文件读取结束的判定 

7.1文本结束判定

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

例如:

1.fgetc判断是否为EOF

2.fgets判断返回值是否为NULL

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

例如:

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

 7.2feof的使用

该函数的作用使判断文件结束是否是因为遇到了文件末尾。如果确实是遇到文件末尾而停止,则返回非0数,如果是遇到错误而停止,则返回0。

7.3ferror的使用

该函数的作用是文件读取结束后,判断是否是因为遇到错误而停止的。 如果确实是因为遇到错误而停止,则返回非0数,如果是正常结束的,则返回0。

8.文件缓冲区

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

 这⾥可以得出⼀个结论:

因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。

如果不做,可能导致读写文件的问题。

完!

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

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

相关文章

财务管理驾驶舱就该按这个模板做!

今天我们来看一张财务管理驾驶舱&#xff0c;体验一下BI数据可视化分析报表的灵活自助分析效果&#xff01; 众所周知&#xff0c;驾驶舱报表的作用就是让企业运营管理者更清晰地了解、分析数据&#xff0c;发现数据中隐藏的问题或机会&#xff0c;从而针对性制定运营管理决策。…

创新与乐趣的融合 —— 探索我们独家录音变音芯片在学舌玩具领域的应用

一&#xff1a;概述 学舌玩具&#xff0c;又称作复读玩具或模仿玩具&#xff0c;是一类设计用来录制人声并重复播放的互动式玩具。这类玩具以其能够模仿人类语音的特性而受到小朋友和宠物主人的喜爱。这些玩具通常具有以下特点和功能&#xff1a; 1. 录音和播放功能&#xff…

GEE错误——Can‘t encode object: function()

错误 Image (Error) Cant encode object: function(){var d=Da.apply(0,arguments).map(function(f){return c.zp(f)}),e=a.hasOwnProperty("prototype")?c.zp(this):void 0;d=m5a(c,a,d,e);return c.qj(d)} Imagen Ms Reciente sin Pxeles 2720: Layer error: Ca…

如何搭建高效安全的eBay测评环境:步骤与要点解析

eBay测评环境的搭建是一个复杂且需要细致考虑的过程&#xff0c;主要涉及到技术配置和资源准备。以下是一些关键的步骤和要点&#xff1a; 一、资源准备&#xff1a; 1.养号系统及软件&#xff1a;选择稳定、可靠的养号系统&#xff0c;确保能够模拟真实用户行为&#xff0c;…

Java面试:MySQL面试题汇总

1.说一下 MySQL 执行一条查询语句的内部执行过程&#xff1f; 答&#xff1a;MySQL 执行一条查询的流程如下&#xff1a; 客户端先通过连接器连接到 MySQL 服务器&#xff1b;连接器权限验证通过之后&#xff0c;先查询是否有查询缓存&#xff0c;如果有缓存&#xff08;之前…

什么是云渲染?云渲染平台怎么使用?云渲染怎么收费?

什么是云渲染&#xff1f; 云渲染是一种利用云计算技术提供的云端服务&#xff0c;用户可以将本地任务递交到远程服务器上&#xff0c;由远程计算集群协调和完成渲染&#xff0c;并将结果返回本地&#xff0c;最后用户可以在本地下载渲染结果。 而实时云渲染则是云渲染的一种…

Git 时光穿梭

文章目录 一、问题引入二、前置知识三、工作区暂存区和版本库四、版本回退1、版本回退命令2、四大常见场景3、删除文件 总结 一、问题引入 假设这样一个场景&#xff1a;有一天你的老板让你整理一份报告&#xff0c;结果你很轻松的整理完了第一版&#xff0c;但是你的老板并不…

大话设计模式之享元模式

享元模式是一种结构型设计模式&#xff0c;旨在有效地支持大量细粒度的对象共享&#xff0c;从而减少内存消耗和提高性能。 在享元模式中&#xff0c;对象分为两种&#xff1a;内部状态&#xff08;Intrinsic State&#xff09;和外部状态&#xff08;Extrinsic State&#xf…

容联云QCon全球软件大会分享:大模型引领“营销服”创新实践

近日&#xff0c;QCon 全球软件开发大会正式召开。容联云大模型产品负责人唐兴才受邀出席&#xff0c;并分享营销服场景中&#xff0c;大模型的创新应用与实践。 唐兴才指出&#xff0c;在大模型浪潮的推动下&#xff0c;营销服场景正经历着前所未有的变革。面对激烈的市场竞争…

node.js-入门

定义 Node.js是一个跨平台Javascript运行环境&#xff0c;使开发者可以搭建服务器端的Javascript应用程序 作用&#xff1a;使用Node.js编写服务器端程序 1&#xff09;编写数据接口&#xff0c;提供网页资源浏览功能等 2&#xff09;前端工程化&#xff1a;集成各种开发中…

北斗卫星系统在海上测量中的创新应用

北斗卫星系统在海上测量中的创新应用 随着全球导航卫星系统技术的飞速发展&#xff0c;北斗卫星系统作为中国自主研发的全球卫星导航系统&#xff0c;在海上测量和导航领域展现出了无可比拟的优势和广阔的应用前景。 一、北斗卫星系统概述 北斗卫星系统是由中国自主研发的全球…

【Numpy】对于 Numpy 中 Axis 的理解

文章目录 前言理解轴的两个角度在维度变化方向上计算降维 示例剖析写在最后 前言 Numpy 是 Python 中一个常用科学计算库&#xff0c;常用来表示向量、矩阵以及多维度数组。在 Numpy 中多对某一个维度&#xff08;轴&#xff09;进行相应的操作&#xff0c;这一点经常出错。今…

K8S一 k8s基础知识及实战

一 K8S 概览 1.1 K8S 是什么&#xff1f; K8S官网文档&#xff1a;https://kubernetes.io/zh/docs/home/ K8S 是Kubernetes的全称&#xff0c;源于希腊语&#xff0c;意为“舵手”或“飞行员”&#xff0c;官方称其是&#xff1a;用于自动部署、扩展和管理“容器化&#xff08…

服务器数据恢复—RAID5故障导致SAP+oracle数据丢失的数据恢复案例

服务器存储数据恢复环境&#xff1a; 某品牌服务器存储中有一组由6块SAS硬盘组建的RAID5阵列&#xff0c;其中有1块硬盘作为热备盘使用。上层划分若干lun&#xff0c;存放Oracle数据库数据。 服务器存储故障&分析&#xff1a; 该RAID5阵列中一块硬盘出现故障离线&#xff0…

进程管理命令

文章目录 一、进程管理相关命令top命令pgrep命令pstree命令进程树lsofvmstat 监控系统资源free 查看内存iostatiftop图形化管理界面总结 二、进程管理启动结束进程 三、计划任务atcrontab周期 一、进程管理相关命令 top命令 ps 命令可以一次性给出当前系统中进程状态&#xf…

HarmonyOS实战开发-如何实现一个简单的健康生活应用

功能概述 成就页面展示用户可以获取的所有勋章&#xff0c;当用户满足一定的条件时&#xff0c;将点亮本页面对应的勋章&#xff0c;没有得到的成就勋章处于熄灭状态。共有六种勋章&#xff0c;当用户连续完成任务打卡3天、7天、30天、50天、73天、99天时&#xff0c;可以获得…

百肤谜 百肤护航医学公益活动启动仪式

近日,中国整形美容协会同知名意大利医美品牌百肤谜联合开展的百肤护航问题肌肤医学公益活动正式启动。众所周知,肌肤健康是一个关乎到个人门面和内心自信的重要议题,也是医疗美容行业关注和发展的核心方向之一。这一公益活动的正式启动,不仅体现了双方对提升公众健康意识和推动…

【练习】二分查找思想

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;算法(Java)&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 二分查找算法介绍 1.二分查找 题目描述 讲解 ​编辑 代码实现 2.…

【剪映专业版】09定格、倒放、镜像、旋转、裁剪

视频课程&#xff1a;B站有知公开课【剪映电脑版教程】 分别为定格、倒放、镜像、旋转、裁剪 定格 时间指示器移动到需要定格的地方&#xff0c;点击定格&#xff0c;自动生成一张图片&#xff0c;时长为3秒。 定格出来的画面&#xff0c;可以任意调整长短时间。 如果需要导…

LeetCode in Python 509. Fibonacci Number (斐波那契数)

斐波那契数实现方式有多种方法&#xff0c;最容易理解的为递归法&#xff0c;也可使用动态规划降低时间复杂度&#xff0c;本文给出递归法和动态规划两种方法的代码实现。 示例&#xff1a; 图1 斐波那契数输入输出示例 方法一&#xff1a;递归法 代码&#xff1a; class …