C语言之“文件操作”

news2024/11/10 17:02:27

文章目录

  • 1. 什么是文件?
    • (1. 为什么使用文件?
    • (2.什么是文件
      • 2.1 程序文件
      • 2.2 数据文件
      • 2.3 文件名
  • 2. 二进制文件和文本文件?
  • 3. 文件的打开和关闭
    • 3.1 流和标准流
    • 3.2 文件指针(用来管理流的)
    • 3.3 文件的打开与关闭
  • 4. 文件的顺序读写
    • 顺序读写函数介绍
    • 4.1 fputc(字符输出函数)
    • 4.2 fgetc(字符输入函数)
    • 4.3 fputs(文本输出函数)
    • 4.4 fgets(文本行输入函数)
    • 4.5 fprintf(格式化输入函数)
    • 4.6 fscanf(格式化输出函数)
      • 对比一组函数
      • 4.7 fwrit
      • 4.7 fread
  • 5. 文件的随机顺序读写
    • 5.1 fseek
    • 5.2 ftell
    • 5.3 rewind
  • 6. 文件读取结束的判定
  • 7. 文件缓冲区

1. 什么是文件?

(1. 为什么使用文件?

	int a = 0;
	printf("a=%d\n", a);
	scanf("%d\n", &a);
	printf("a=%d\n", a);

在上面的代码中,运行一次之后,下次运行,a仍然先显示的是0。为什么还是0呢?因为我们这些数据是放在内存里的。

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

那为什么我们制作的表格和ppt能够一直存在?因为这些是放在电脑的硬盘上。

我们发现,数据放在文件中,文件再放在硬盘中,就可以将数据持久化的保存。

(2.什么是文件

磁盘(硬盘)上的文件是文件。

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

在这里插入图片描述

2.1 程序文件

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

2.2 数据文件

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

本章讨论的是数据文件。
在以前各章所处理数据的输入输出都是以终端(就是vs的黑框框,屏幕)为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。

其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上文件

2.3 文件名

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

文件名包含3部分:文件路径,文件名主干,文件后缀
例如: c:\code\test.txt

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

2. 二进制文件和文本文件?

(1)根据数据的组织形式(即内容),数据文件被称为文本文件或者二进制文件

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

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

(2)一个数据在文件中是怎么存储的呢?

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

如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节。

在这里插入图片描述

3. 文件的打开和关闭

3.1 流和标准流

我们程序的数据需要输出到各种外部设备(文件,U盘,屏幕),也需要从外部设备获取数据。不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了“流”的概念,我们可以把流想象成河(流淌着字符的河)。对于程序员来说,只要关注“流”就可以了。

在这里插入图片描述

C程序针对文件、画面、键盘等的数据输入输出操作都是通过流操作的。

一般情况下,我们要想 向“流”里写数据 或 从“流”中读取数据,都是(1)打开流,(2)操作[读 / 写]。(3)关闭流。

  1. 标准流

为什么我们从键盘输入数据(scanf),向屏幕上输出数据,并没有打开流呢?

那是因为C语言程序在启动的时候,默认打开3个流

stdin - 标准输入流,在大多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据。(记忆方式:键盘从我们这里读取到了即将输入的数据)
stdout - 标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出流中
stderr - 标准错误流,大多数环境中输出到显示器界面。

这是默认打开了这三个流,我们使用scanf、printf等函数就可以直接进行输入输出操作的。

stdin、stdout、stderr 这三个标准流的类型是: FILE * ,通常称为文件指针(指向文件信息区)。

C语言中,就是通过 FILE* 的文件指针来维护流的各种操作的。

3.2 文件指针(用来管理流的)

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。

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

例如,VS2013 编译环境提供的 stdio.h 头文件中有以下的文件类型申明(不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。):

struct _iobuf {
    char *_ptr;
    int _cnt;
    char *_base;
    int _flag;
    int _file;
    int _charbuf;
    int _bufsiz;
    char *_tmpfname;
};
typedef struct _iobuf FILE;

每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。

一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。

下面我们可以创建一个FILE*的指针变量:FILE* pf;//文件指针变量

定义pf是一个指向FILE类型数据的指针变量。可以使pf(FILE* 文件指针)指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过(文件指针变量)能够间接找到(与它关联的文件)

在这里插入图片描述

3.3 文件的打开与关闭

在这里插入图片描述

  1. 在之后经常说,读和写,那什么是读和写呢?
    在这里插入图片描述
  2. 打开文件

ANSIC 规定使用 fopen 函数来打开文件, fclose 来关闭文件。

//打开文件                  文件名            打开方式
函数原型:FILE * fopen ( const char * filename, const char * mode );
//返回类型是文件指针FILE*
 FILE* PF=fopen("test.txt""w");

在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量(文件信息的地址)指向该文件,也相当于建立了指针和文件的关系。

如果文件打开成功,返回的是有效指针
如果文件打开失败,则返回NULL(是空指针的话,很危险,要记得判断)

在这里插入图片描述

’‘w’‘(写)的打开方式:
如果没有我们想打开的文件data.txt,而我们fopen这个文件,它会在这个项目下创立一个data.txt
如果有这个文件,不会新建。它不管里面有什么,它会将文件清空

“r”只读的打开方式:不会修改

  1. 打开的地点

第一种就在当前项目下FILE* fopen ( test.txt,"w" );
第二种是打开桌面上的文件:这个需要使用绝对路径(右击文件,点击属性):路径\名字(双斜杠,防止变成转义字符)
在这里插入图片描述

FILE* fopen("C:\\Users\\20439\\Desktop\\wen.docx","w");

第三种:当前项目的上一级(相对路径)
.表示当前路径,…表示上一级路径

.\\..表示这一级的上一级
.\\..\\..表示这一级的上一级的上一级

FILE* fopen(".\\..\\dao.docx","w");
  1. 打开方式有哪些?
    在这里插入图片描述

  2. 关闭文件

int fclose(FILE* stream);

在关闭文件之后还需要置为空指针

#include<stdio.h>
int main()
{
	FILE* pf = fopen("data.text", "w");//打开文件,返回的是有效指针
	//是否打开
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//.....
	
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

4. 文件的顺序读写

顺序读写函数介绍

在这里插入图片描述

4.1 fputc(字符输出函数)

fputc(只能写一个字符)
int fputc ( int character, FILE * stream );
参数说明:
character :要写入的字符,该字符会被转换为 unsigned char 类型,然后写入文件流。
stream :指向要写入的文件流的指针。
返回值:
如果成功, fputc 返回写入的字符。
如果发生错误, fputc 返回 EOFEnd Of File,通常定义为 -1 )。

1.黑框框里没有内容,说名打开文件没有问题
在这里插入图片描述
2.右击文件,点击“打开所在的文件夹”,点开刚刚打开以及输入的文件
在这里插入图片描述
3. 如果想输入很多个字符可以使用循环
在这里插入图片描述

4.2 fgetc(字符输入函数)

fgetc
int fgetc ( FILE * stream );
参数说明
stream:指向要从中读取字符的文件流的指针。
返回值
如果成功, fgetc 返回读取的字符的ASCII码(一个unsigned char类型的值,被转换为int类型)。
如果到达文件末尾或发生错误,fgetc返回EOF
读取一次,光标就会往后移动一格

int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	int i = 0;
	for (i = 'a'; i < 'z'; i++)
		fputc(i, pf);
	//在读取之前要关闭写句柄
	fclose(pf);
	pf = NULL;
	
//简单一点,用循环	
FILE* pf1 = fopen("test.txt", "r");
if (pf1 == NULL)
{
	perror("fopen");
	return 1;
}
int ch = 0;
while ((ch = fgetc(pf1)) != EOF)
	printf("%c ", ch);

	//读文件
	FILE* pf1 = fopen("test.txt", "r");
	int ch = fgetc(pf1);
	printf("%c\n", ch);
	ch = fgetc(pf1);
	printf("%c\n", ch); 
	ch = fgetc(pf1);
	printf("%c\n", ch);
	ch = fgetc(pf1);
	printf("%c\n", ch);
	ch = fgetc(pf1);
	printf("%c\n", ch);

	//关闭
	fclose(pf1);
	pf1 = NULL;
}

在这里插入图片描述

stdin----输入流------即读的形式打开文件-----文件的输入流
stdout–输出流------即写的形式打开文件-----文件的输出流

int main()
{
	//fgetc读字符,去哪里读呀?()需要的是流
	int ch = fgetc(stdin);//从键盘(标准输入流)上读取
	//fputc打印,第一个参数字符,第二个参数流
	fputc(ch, stdout);//将字符输出(写)到屏幕(标准输出流)
	return 0;
}

在这里插入图片描述

4.3 fputs(文本输出函数)

记得先打开文件(打开方式:写),才能在流里写字符串

fputs(把字符串写到一个流里)
返回类型int----字符串的地址-------文件指针(关联到一个文件)
函数原型:int fputs ( const char * str, FILE * stream );
参数说明:
str:指向要写入的字符串的指针。
stream:指向要写入的文件流的指针。
返回值:
如果成功,fputs返回一个非负整数。
如果发生错误,fputs返回 EOF (通常定义为 -1 )

如果写两行fputs,这两次的内容会放在同一行,因为我们没有加换行符\n
在这里插入图片描述

4.4 fgets(文本行输入函数)

打开方式:读

fgets
char * fgets ( char * str, int num, FILE * stream );
参数说明:
str:指向用于存储读取数据的字符数组的指针。
num:指定要读取的最大字符数,包括字符串结束符 \0 。(实际读取了num-1个字符,因为最后一个是\0)
stream:指向要读取的文件流的指针。
返回值(接收与否均可):
如果成功,fgets返回指向str的指针。
如果到达文件末尾或发生错误,fgets返回 NULL 。

如果文件的内容有好几行,fgets只读取一行,\n也读取了,之后就结束了

int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读文件
	char arr[20] = { "xxxxxxxxxx" };
	fgets(arr, 5, pf);
	printf("%s\n", arr);

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

在这里插入图片描述
我们将num改成10,再将文件的内容改成换行的:
在这里插入图片描述

在这里插入图片描述

int main()
{
	char arr[20] = { 0 };
	fgets(arr, 20, stdin);
	fputs(arr, stdout);
	return 0;
}

4.5 fprintf(格式化输入函数)

对比printf和fprintf
printf("%s %d\n", a, b); //是将内容输出到屏幕上
fprintf(pf,"%s %d",a, b); //是将内容写在文件里

fprintf
int fprintf ( FILE * stream, const char * format, ... );
int printf ( const char * format, ... );
参数说明:
stream :指向要写入的文件流的指针。
format :一个字符串,包含格式说明符和普通字符。格式说明符用于指定如何格式化后续的参数。
... :可变参数列表,包含要写入的值,这些值将根据 format 字符串中的格式说明符进行格式化。
fprintf 返回值:
如果成功, fprintf 返回写入的字符数。
如果发生错误, fprintf 返回一个负值。
printf 返回值:
printf 返回实际写入到标准输出的字符数。

int main()
{
	char name[] = "houpp";
	int age = 20;
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	fprintf(pf, "%s %d\n", name,age);//内容写入文件
    fclose(pf);
	pf = NULL;
}

在这里插入图片描述

4.6 fscanf(格式化输出函数)

fscanf
int fscanf ( FILE * stream, const char * format, ... );
fscanf返回值:
fscanf返回成功解析并赋值的输入项的数量。如果到达文件末尾或发生错误,则返回EOFEnd Of File,通常定义为 -1 )。
scanf返回值
scanf返回成功解析并赋值的输入项的数量。如果到达输入流的末尾或发生错误,则返回EOFEnd Of File,通常定义为 -1

int main()
{
	char name[] = "houpp";
	int age = 20;
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//从文件中读取内容
	fscanf(pf, "%s %d", name, &age);
	//打印在屏幕上
	printf("%s %d", name, age);

	//fprintf(pf, "%s %d\n", name,age);//内容写入文件
    fclose(pf);
	pf = NULL;
}

在这里插入图片描述

对比一组函数

scanf/fscanf/sscanf

printf/fprintf/sprintf

scanf/printf:针对 标准输入流/标准输出流 的 格式化输入/输出函数
fscanf/fprintf:针对 所有输入流/输出流 的 格式化输入/输出函数(也就是可以针对文件也可以针对标准输入/出流)
sscanf/sprintf:将格式化的数据转换成字符串,或者从字符串中提取格式化的数据

scanf
int scanf ( const char * format, ... );
fscanf
int fscanf ( FILE * stream, const char * format, ... );
sprintf
int sprintf ( char * str, const char * format, ... );
sprintf实际上就是将格式化的数据写到字符串中,可以理解为将格式化的数据转换成字符串
sprintf
是将格式化的数据放在数组里【格式化的数据---------写到---------->字符串】

int main()
{
	char name[] = "houpp";
	int age = 20;

	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	char arr[100] = { 0 };
	sprintf(arr, "%s %d", name, age);
	//看一下数组里有没有内容了
	printf("%s\n", arr);

    fclose(pf);
	pf = NULL;
}
struct S {
	char name[20];
	int age;
	float score;
};

int main() {
	char arr[100] = { 0 };
	struct S s = { "wangwu",23,66.6f };
	//printf("%s %d %f", s.name, s.age, s.score);
	sprintf(arr, "%s %d %f", s.name, s.age, s.score);

	printf("%s\n", arr);

	return 0;
}

在这里插入图片描述

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

int main() {
	char arr[100] = { 0 };
	struct S s = { "wangwu",23,66.6f };
	//创建临时变量
	struct S tmp = { 0 };

	//将S中的各个数据转换成字符串,存放在arr中
	sprintf(arr, "%s %d %f", s.name, s.age, s.score);

	//从字符串arr中提取格式化的数据,存放在tmp中
	//scanf("%s %d %f", tmp.name, &(tmp.age), &(tmp.score));
	sscanf(arr, "%s %d %f", tmp.name, &(tmp.age), &(tmp.score));
	printf("%s %d %f", tmp.name, tmp.age, tmp.score);

	return 0;
}

4.7 fwrit

fwrite
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
参数说明:
ptr :指向要写入数据的内存块的指针。
size :每个数据项的大小(以字节为单位)。
count :要写入的数据项的数量。
stream :指向要写入数据的文件流的指针。
返回值:
fwrite 返回成功写入的数据项的数量。如果发生错误或到达文件末尾,则返回一个小于 count 的值。
就是把ptr指向空间里面,count个大小为size个字节的元素的数据,写到stream里面去。

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

int main() {
	struct S s = { "cuihua", 25, 88.8f };
	//以二进制形式写进文件

	//1.打开文件
	FILE* pf = fopen("test.txt", "wb");
	if (pf == NULL) {
		perror("fopen");
		return 1;
	}
	//2.写文件
	fwrite(&s, sizeof(struct S), 1, pf);

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

	return 0;
}

打开文件:乱码是因为写的是二进制字符的原因。
在这里插入图片描述

4.7 fread

fread
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
参数说明:
ptr :指向用于存储读取数据的内存块的指针。
size :每个数据项的大小(以字节为单位)。
count :要读取的数据项的数量。
stream :指向要从中读取数据的文件流的指针。
返回值:
fread 返回成功读取的数据项的数量。如果到达文件末尾或发生错误,则返回一个小于 count 的值。
就是把steam指向空间里面(也就是文件里面读取),count个大小为size个字节的元素的数据,写到ptr里面去。

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

int main() {
	struct S s = { "cuihua", 25, 88.8f };
	//读取二进制形式的信息写进文件中

	//1.打开文件
	FILE* pf = fopen("test.txt", "rb");
	if (pf == NULL) {
		perror("fopen");
		return 1;
	}
	//2.读文件
	fread(&s, sizeof(struct S), 1, pf);

	printf("%s %d %f\n", s.name, s.age, s.score);

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

	return 0;
}

5. 文件的随机顺序读写

5.1 fseek

根据文件指针的位置和偏移量来定位文件指针(文件内容的光标)。

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

参数说明:
stream :指向要操作的文件流的指针。
offset :要移动的字节数

如果 originSEEK_SET ,则 offset 是从文件开始处的偏移量;
如果 originSEEK_CUR ,则 offset 是从当前文件指针位置的偏移量;
如果 originSEEK_END ,则 offset 是从文件末尾的偏移量。
origin :指定 offset 的基准位置,可以是以下三个值之一:
SEEK_SET :从文件的开始位置移动。
SEEK_CUR :从当前文件指针位置移动。
SEEK_END :从文件的末尾位置移动。
返回值
fseek 成功时返回 0 ,失败时返回非零值。

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

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

	return 0;
}

在这里插入图片描述
我们要是想打印abe呢?

这个时候就要用到fseek函数了。

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

	//定位文件指针
	fseek(pf, 4, SEEK_SET);
    //fseek(pf, 2, SEEK_CUR);
    //fseek(pf, -2, SEEK_END);
	ch = fgetc(pf);//e
	printf("%c\n", ch);

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

	return 0;
}

在这里插入图片描述

5.2 ftell

返回文件指针相对于起始位置的偏移量

long int ftell ( FILE * stream );

参数说明:
stream :指向要查询的文件流的指针。
返回值:
ftell 返回当前文件指针的位置(以字节为单位),如果发生错误,则返回 -1L

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

	//定位文件指针
	fseek(pf, 4, SEEK_SET);
	ch = fgetc(pf);//e
	printf("%c\n", ch);

	//输出文件指针相较于文件起始位置的偏移量
	printf("%d\n", ftell(pf));

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

	return 0;
}

在这里插入图片描述

为什么是5呢?
在这里插入图片描述

5.3 rewind

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

void rewind ( FILE * stream );
int main() {
	//1.打开文件
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL) {
		perror("fopen");
		return 1;
	}
	//2.读文件
	int ch = 0;
	ch = fgetc(pf);//a
	printf("%c\n", ch);
	ch = fgetc(pf);//b
	printf("%c\n", ch);

	//定位文件指针
	fseek(pf, 4, SEEK_SET);
	ch = fgetc(pf);//e
	printf("%c\n", ch);

	//输出文件指针相较于文件起始位置的偏移量
	printf("%d\n", ftell(pf));

	//将文件指针重新定位到文件的起始位置
	rewind(pf);
	ch = fgetc(pf);//a
	printf("%c\n", ch);


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

	return 0;
}

在这里插入图片描述

6. 文件读取结束的判定

7. 文件缓冲区

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

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

相关文章

vitis (eclipse) 的Indexer不能搜索、不能跳转到函数和变量定义和声明不能打开调用层次的解决方法

在使用vitis(2021.1) 过程中&#xff0c;有一个非常方便实用的功能&#xff0c;就是在函数或变量等源代码上通过右键菜单或快捷键F3、F4、CtrlAltH&#xff0c;也可以按住Ctrl键然后鼠标停留在函数名或变量名上&#xff0c;点击出现的链接&#xff0c;可以跳转到函数或变量的定…

linux磁盘可视化分析工具

在 Linux 系统中&#xff0c;了解磁盘使用情况对于系统维护和优化至关重要。文件和目录随着时间的推移会占据大量磁盘空间&#xff0c;了解哪些部分占用的空间最多可以帮助我们更好地管理和清理磁盘。Baobab&#xff0c;也称为 GNOME Disk Usage Analyzer&#xff0c;是一款非常…

数据化信息时代中开源 AI 智能名片拓客微信小程序的角色与价值

摘要&#xff1a;本文深入探讨了数据化信息的特性&#xff0c;包括其数字化基础、多媒体表现、可转化性及增值利用特点。同时&#xff0c;着重阐述了开源 AI 智能名片拓客微信小程序在这一背景下的重要作用和独特价值&#xff0c;为信息传播与利用提供了新的视角和思路。 关键…

WCF 禁止第三方访问,避免泄露元数据信息

开发的时候&#xff0c;服务端的web.config,将httpGetEnabled和httpsGetEnabled置true&#xff0c;这个时候客户端就可以添加服务引用。开发结束后&#xff0c;部署的时候&#xff0c;将这俩配置改成false

Bug 解决 | 后端项目无法正常启动,或依赖服务连接失败

目录 1、版本问题 2、依赖项问题 明明拷贝的代码&#xff0c;为什么别人行&#xff0c;我启动就报错&#xff1f; 这篇文章我就理一下最最常见的项目启动报错的两种原因&#xff01; 1、版本问题 比如明明项目的 Java 版本是 8&#xff0c;你非得拿 5 跑&#xff1f;那不是…

python爬虫预备知识三-序列化和反序列化

序列化和反序列化 序列化是为了将内存中的数据保存在磁盘上或者用于传输&#xff0c;实现程序状态的保存和共享。反序列化反之。 序列化后的变量再被反序列化回来之后&#xff0c;两者之间已经没有任何关系。 序列化后的文件是在不同程序或者说不同语言之间传递数据的关键方…

开发助手专业版,有反编译等多种功能

软件介绍 开发助手能够用来快速调试应用以及查看手机软硬件相关信息&#xff0c;包括&#xff1a;快速打开或关闭开发者选项中的选项。 将原来几十秒的操作缩短为一次点击。包括显示布局边界&#xff0c;显示 GPU 过度绘制。显示布局更新。强制 GPU 渲染 显示 GPU 视图更新&a…

第15课 Scratch少儿编程 入门篇:师生问候

师生问候 故事背景&#xff1a; 魔法学院的期末考核刚刚考完&#xff0c;魔法老师在教室里碰到小明&#xff0c;老师问小明考的怎么样&#xff1f; 程序原理&#xff1a; 找一个教室的背景&#xff0c;小精灵角色和魔法师的角色&#xff0c;将魔法师的角色造型左右反转&…

Java与Python谁更适合后端开发?

在软件开发的世界里&#xff0c;选择合适的编程语言就像为建筑选择合适的材料一样重要。 对于后端开发而言&#xff0c;Java和Python都是流行的选择&#xff0c;但它们各自拥有独特的优势和劣势&#xff0c;“谁更适合”就成为一个被议论的话题。 事实上&#xff0c;并不存在…

调用IP实现数据加速

前言 在数字系统设计中&#xff0c;提升数据处理速度和效率是关键目标。本实验着眼于利用双端口RAM和异步FIFO对IP核ROM中的数据进行加速处理&#xff0c;通过这两种硬件组件的有效结合来优化数据访问和传输。双端口RAM允许同时进行读写操作&#xff0c;提高数据处理的并行性和…

中央空调常用风口的分类

中央空调常用风口的分类中央空调常用的风口类型有七类&#xff0c;包括百叶风口、散流器、喷口、旋流风口、条缝风口、格栅风口和专用风口。详细分类如下&#xff1a; 1&#xff09;百叶风口&#xff1a;单层百叶风口、双层百叶风口、连动百叶风口、固定斜百叶风口、地面固定斜…

How to tune agent _executor for better understanding of the database

题意&#xff1a;如何调整agent _executor以更好地理解数据库 问题背景&#xff1a; I have a database in which I have connected an agent too. However, I have noticed that it sometimes gets confused between whether or not it should return a column ID or persons…

5 mysql 查询语句

1.DML:对数据进行增删改查 提示:Execute执行 Execute and Suppress 执行并且抑制这个警告 person表的结构 /* DML:Data Manipulation Language 数据操作语言,对数据进行 增删改查操作,因为査询的操作太频繁和复杂,将查询的操作独立成为DQL */ use db1109;//person表在d…

智慧水务项目(二)django(drf)+angular 18 创建通用model,并对orm常用字段进行说明

一、说明 上一篇文章建立一个最简单的项目&#xff0c;现在我们建立一个公共模型&#xff0c;抽取公共字段&#xff0c;以便于后续模块继承&#xff0c;过程之中会对orm常用字段进行说明&#xff0c;用到的介绍一下 二、创建一个db.py 目录如下图 1、代码 from importlib im…

私域流量变迁与精细移动化趋势下的AI智能名片小程序源码应用探索

摘要&#xff1a;随着移动互联网技术的飞速发展&#xff0c;私域流量的价值日益凸显&#xff0c;成为企业营销战略的重要组成部分。私域流量的精细化和移动化趋势不仅改变了传统的营销格局&#xff0c;也为新兴技术的应用提供了广阔空间。本文深入探讨了私域流量的变迁历程&…

磁盘碎片整理工具IObit Smart Defrag PRO 绿色版

在数字化时代&#xff0c;电脑的性能直接影响到我们的工作效率和娱乐体验。随着使用时间的增长&#xff0c;硬盘上的文件碎片逐渐增多&#xff0c;导致电脑运行缓慢。今天&#xff0c;我为大家介绍一款强大的磁盘碎片整理工具——IObit Smart Defrag&#xff0c;它能有效解决这…

探索Python的聊天机器人世界:Errbot的魔力

文章目录 探索Python的聊天机器人世界&#xff1a;Errbot的魔力背景&#xff1a;为何选择Errbot&#xff1f;Errbot&#xff1a;Python中的聊天机器人框架安装Errbot&#xff1a;简单几步&#xff0c;即刻开始探索Errbot&#xff1a;五个简单函数的魔法1. 创建机器人2. 响应消息…

全球汽车用MEMS加速度计市场规划预测:未来六年CAGR为2.8%

随着汽车行业的持续发展和消费者对安全性能的需求增加&#xff0c;汽车用MEMS加速度计作为提升车辆安全性和稳定性的关键组件&#xff0c;正逐渐受到市场的广泛关注。本文旨在通过深度分析汽车用MEMS加速度计行业的各个维度&#xff0c;揭示行业发展趋势和潜在机会。 【市场趋…

ElementPlus 中el-select自定义指令实现触底加载请求options数据

1) 背景: 老项目翻新时&#xff0c;发现一个下拉框数据非常多&#xff0c;客户呢&#xff0c;希望全部数据一起展示&#xff0c;意思就是全部数据一起返回给前端用于展示。但这会造成明显的卡顿。~~明显的不合理! QAQ!~~ 于是压力给到前端&#xff0c;查询资料&#xff0c;各种…

论文阅读:Most Probable Densest Subgraphs

摘要 本文提出了一种在不确定图中发现最有可能稠密子图&#xff08;MPDS&#xff09;的新方法。不确定图中的每条边都有存在概率&#xff0c;使得计算稠密子图变得複杂。作者定义了稠密子图概率&#xff0c;并证明了计算该概率是#P难的。为了解决这个问题&#xff0c;设计了基…