零基础自学C语言|文件操作

✈为什么使用文件?

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

✈什么是文件?

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

🚀程序文件

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

🚀数据文件

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

在以前各章所处理数据的输入输出(即printf和scanf)都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。

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

🚀文件名

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

✈二进制文件和文本文件

根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。

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

c06ccd266d58449ea61e69e83d335ab0.png
字符一律以ASCIl形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节(VS2019测试)
测试代码:


int main()
{
	int a = 10000;
	FILE* pf = fopen("test.txt", "wb");//打开文件
	fwrite(&a, 4, 1, pf);//写入a
	fclose(pf);//关闭文件
	pf = NULL;//pf置为空指针
	return 0;
}

b865f3265f6045d9bcdea3f61cf64dcc.png

7c7f571483b14df79ea6dce273bf7e16.png

✈文件的打开和关闭

🚀流和标准流

🛸流

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。

C程序针对文件、画面、键盘等的数据输入输出操作都是通过流操作的。
一般情况下,我们要想向流里写数据,或者从流中读取数据,都是要打开流,然后操作。

🛸标准流 

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

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

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

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

🚀文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名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指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够间接找到与它关联的文件。
比如:

da51ab0f7cdd4641a094ed43756186a7.png

🚀文件的打开和关闭

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

//打开⽂件
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件
int fclose ( FILE * stream );
mode表示文件打开模式,下列是文件打开模式:
625b0c690a504f7db225d11a5c83af89.png

 应用实例:

int main()
{
	FILE* pf = ("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	fputs("hello world", pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

a502de748b3a484e8e18972ae1b7a4ad.png

✈文件的顺序读写

🚀顺序读写函数介绍

b476fda212c0421d8add895ebd9bc9b5.png

🛸fgetc

int fgetc ( FILE * stream );

参数说明: 

  • stream:输入流;

返回值:

如果成功,返回读的字符的ASCII码值;

如果失败,返回EOF;

例子:


int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	char a = 1;
	while ((a = fgetc(pf)) != EOF)
	{
		putchar(a);
	}
	fclose(pf);
	pf = NULL;
	return 0;
}

 1fcb5d1b059c4ead87eecf00dc1bffb7.png

运行结果:
cc30c9c2d6b446cc900a85bad1a7e76c.png

🛸fputc

int fputc ( int character, FILE * stream );

参数说明: 

  • character:输出字符的ASCII码;
  • stream:输出流;

返回值:

如果成功,输入字符的ASCII码值;

如果失败;返回EOF;

例子:

int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	char b[] = "hello world";
	char a = 1;
	int i = 0;
	while ((a = b[i]) != '\0')
	{
		fputc(a, pf);
		i++;
	}
	fclose(pf);
	pf = NULL;
	return 0;
}

 运行前:

75828d147080486e8a241bb31e73ca6e.png

运行后:

9de48bb2001a4b3a99b33c4f38128097.png

🛸fgets

char * fgets ( char * str, int num, FILE * stream );

参数说明: 

  • str:字符串首元素的地址;
  • num:输入的字符数(读n-1个字符,再在末尾放一个\0)
  • stream:输入流;

返回值:

如果成功,返回str的地址;

如果失败,返回空指针;

举例:

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	char a[5] = { 'x','x','x','x','x' };
	fgets(a, 4, pf);//最多打印3个
	printf("%s", a);
	fclose(pf);
	pf = NULL;
	return 0;
}

4e87252ed2034615b352db1404e73f6d.png

运行结果: 

f3560a1ef4c14c9883837df790b6be9e.png 调试结果:
dc5d5c78c9e64d2db966ce4970fd9c8e.png

 🛸fputs

int fputs ( const char * str, FILE * stream );

 参数说明:

  • str:字符串首元素的地址;
  • stream:输出流;

返回值:

如果成功,返回一个非负的值;

如果失败,返回EOF;

例子:

int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	char a[] = "abcd";
	fputs(a, pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

运行前:
d771c9ace8ce43918bc96fd617cbc0a1.png 运行后:

08ac2af99e854b988cfe7efe0a4ca9d8.png

 🛸fprintf 

fprintf既可以写入字符和字符串,也可以写入整型等其他数据类型(fscanf也是如此)。

int fprintf ( FILE * stream, const char * format, ... );

参数说明: 

  • stream:输出流,代表输入值的来源;
  • format:输出格式,类似于printf(例如%d)
  • ...:输出列表,类似于printf

返回值:

如果成功,返回写入的字符个数(例如写入一个整型10,返回值为2)。

如果失败,返回EOF;

例子:

int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	int a = 10;
	char b = 'a';
	float c = 3.14159;
	fprintf(pf, "%d %c %f", a, b, c);
	fclose(pf);
	pf = NULL;
	return 0;
}

运行前: 

运行后:

🛸fscanf 

int fscanf ( FILE * stream, const char * format, ... );

参数说明:

  • stream:输入流,代表输入值的来源;
  • format:输入格式,类似于scanf(例如%d)
  • ...:输入列表,类似于scanf

返回值:

如果成功,返回所有变量的个数总和(例如输入%d%d,返回2);

如果失败,返回EOF;

例子:


int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	int a[10] = { 0 };
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		fscanf(pf, "%d", &a[i]);
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
	fclose(pf);
	pf = NULL;
	return 0;
}

 

运行结果:

🛸fread

size_t fread(const void *Buffer, size_t ElementSize, size_t ElementCount, FILE *stream)

 参数说明:

  • const void *Buffer : 指针指向要写出数据的内存首地址 ;
  • size_t ElementSize : 要写出数据的 基本单元 的字节大小 , 写出单位的大小 ;

如果 Buffer 缓冲区是 char 数组 , 则该参数的值是 sizeof(char) ;

如果 Buffer 缓冲区是 int 数组 , 则该参数的值是 sizeof(int) ;

  • size_t ElementCount : 要写出数据的 基本单元 的个数 ;
  • FILE *stream : 打开的文件指针 ;

返回值:

返回读取的元素个数(失败为0);

例子:
 

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	int a[10] = { 0 };
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		fread(&a[i], sizeof(int), 1, pf);
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
	fclose(pf);
	pf = NULL;
	return 0;
}

运行结果:

🛸fwrite

size_t fwrite(const void *Buffer, size_t ElementSize, size_t ElementCount, FILE *stream)

 参数说明:

  • const void *Buffer : 指针指向要写出数据的内存首地址 ;
  • size_t ElementSize : 要写出数据的 基本单元 的字节大小 , 写出单位的大小 ;
  • size_t ElementCount : 要写出数据的 基本单元 的个数 ;
  • FILE *stream : 打开的文件指针 ;

返回值:

返回写入的元素个数(失败返回0);

例子:

int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	int a = 1000;
	fwrite(&a, sizeof(int), 1, pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

 运行前:

 

 运行后:

上面说的适用于所有输入流一般指适用于标准输入流和其他输入流(如文件输入流);所有输出流一般指适用于标准输出流和其他输出流(如文件输出流)。

对比一组函数: 

  • scanf/fscanf
  • sscanf/printf
  • fprintf/sprintf

✈文件的随机读写

🚀fseek

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

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

参数说明:

stream:打开的文件指针 ;

offset:光标的偏移量;

origin:设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET

  • SEEK_SET (0): 文件开头
  • SEEK_CUR(1): 当前位置
  • SEEK_END(2): 文件结尾

返回值:

如果成功,返回0;

如果失败,返回非0值;

例子:

int main()
{
	FILE* pFile;
	pFile = fopen("example.txt", "wb");
	if (pFile == NULL)
	{
		perror("fopen");
		return 1;
	}
	fputs("This is an apple.", pFile);
	int b = fseek(pFile, 9, SEEK_SET);
	fputs(" sam", pFile);
	fclose(pFile);
	pFile = NULL;
	return 0;
}

运行结果: 

🚀ftell

 返回文件指针相对起始的偏移量。

long int ftell(FILE* stream);

 举例:

int main()
{
	FILE* pFile;
	long size;
	pFile = fopen("myfile.txt", "rb");
	if (pFile == NULL)
		perror("Error opening file");
	else
	{
		fseek(pFile, 0, SEEK_END);
		size = ftell(pFile);
		fclose(pFile);
		pFile = NULL;
		printf("Size of myfile.txt: %ld bytes.\n", size);
	}

	return 0;
}

 

🚀rewind 

返回文件的初始位置

void rewind ( FILE* stream );

例子: 

int main()
{
	int n;
	FILE* pFile;
	char buffer[27];

	pFile = fopen("myfile.txt", "w+");
	for (n = 'A'; n <= 'Z'; n++)
		fputc(n, pFile);
	rewind(pFile);

	fread(buffer, 1, 26, pFile);
	fclose(pFile);

	buffer[26] = '\0';
	printf(buffer);
	return 0;
}

运行结果:

 

 

✈文件读取结束的判定

🚀被错误使用的feof

牢记:在文件读取过程中,不能用feof函数的返回值直接来判断文件的是否结束。
feof 的作用是:当文件读取结束的时候,判断是读取结束的原因是否是:遇到文件尾结束。
1.文本文件读取是否结束,判断返回值是否为EOF(fgetc),或者NULL(fgets)
例如:

  • fgetc判断是否为EOF
  • fgets判断返回值是否为NULL

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

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

文本文件例子:

int main(void) {
 int c; // 注意:int,⾮char,要求处理EOF
 FILE* fp = fopen("test.txt", "r");
 if(!fp) {
 perror("File opening failed");
 return EXIT_FAILURE;
 }
 //fgetc 当读取失败的时候或者遇到⽂件结束的时候,都会返回EOF
 while ((c = fgetc(fp)) != EOF) // 标准C I/O读取⽂件循环
 { 
 putchar(c);
 }
 //判断是什么原因结束的
 if (ferror(fp))
 puts("I/O error when reading");
 else if (feof(fp))
 puts("End of file reached successfully");
 fclose(fp);
}

二进制文件例子: 

enum { SIZE = 5 };
int main(void) {
	double a[SIZE] = { 1.,2.,3.,4.,5. };
	FILE* fp = fopen("test.bin", "wb"); // 必须⽤⼆进制模式
	fwrite(a, sizeof * a, SIZE, fp); // 写 double 的数组
	fclose(fp);
	double b[SIZE];
	fp = fopen("test.bin", "rb");
	size_t ret_code = fread(b, sizeof * b, SIZE, fp); // 读 double 的数组
	if (ret_code == SIZE) {
		puts("Array read successfully, contents: ");
		for (int n = 0; n < SIZE; ++n) printf("%f ", b[n]);
		putchar('\n');
	}
	else { // error handling
		if (feof(fp))
			printf("Error reading test.bin: unexpected end of file\n");
		else if (ferror(fp)) {
			perror("Error reading test.bin");
		}
	}
	fclose(fp);
}

✈文件缓冲区

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

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语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。如果不做,可能导致读写文件的问题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

EFI Driver Model(下)-SCSI 驱动设计

1、SCSI简介 SCSI是Small Computer System Interface&#xff08;小型计算机系统接口&#xff09;的缩写&#xff0c;使用50针接口&#xff0c;外观和普通硬盘接口有些相似。SCSI硬盘和普通IDE硬盘相比有很多优点&#xff1a;接口速度快&#xff0c;并且由于主要用于服务器&…

记一次Tomcat启动失败的经历

首先&#xff0c;下载tomcat10.1.20后&#xff0c;双击启动bin下的startup.bat闪退&#xff0c;查了资料&#xff0c;说是依赖JDK环境和JRE环境&#xff0c;当然&#xff0c;我Java是能正常用的&#xff0c;毕竟写了这么多东西它有没有我还不清楚吗 可问题就来了&#xff0c;既…

软件应用实例,租赁系统软件操作教程,脚手架租赁管理集装箱租赁管理系统教程

软件应用实例&#xff0c;租赁系统软件操作教程&#xff0c;脚手架租赁管理集装箱租赁管理系统教程 一、前言 以下软件操作教程以&#xff0c;佳易王租赁管理系统软件V17.0为例说明 件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、软件可以记录&#x…

GEE土地分类——分类后样本点值提取至点过程中,导出的csv数据表中不存在geometry的位置信息

值提取至点导出的csv数据表中不存在geometry的位置信息 错误提示: {"type":"MultiPoint","coordinates":[]} 问题分析 问题主要出现在在reduceregions中所使用的第二个参数中。在reduceregions中,第二个参数用于指定geometry信息,以便将r…

约克中央空调YES-will系列,舒适冷暖与高品质家居的优选

漫漫寒冬,室内一片寒意,开启空调多久才能享受到暖意?如果冬季气温较低,空调能否保持正常的制热运行? 炎炎夏季,即便在室内也同样是“暴汗”不断,身上黏糊糊,什么样的家用中央空调才能快速制冷,让全家人感受到舒适,同时又能避免传统空调直吹带来的一系列问题? 遇上梅雨季节…

【采购季】全网云服务器采购季活动大盘点 网站博客搭建、程序员职场毕业神器 低至50/年 阿里云 京东云 腾讯云

《最新对比表》已更新在文章头部—腾讯云文档&#xff0c;文章具有时效性&#xff0c;请以腾讯文档为准&#xff01; 【腾讯文档实时更新】云服务器1分钟教会你如何选择教程 2024-开年采购活动 云服务器专区 京东云 阿里云 腾讯云 配置最新价格表 与 官方活动地址 ​ 当前活动…

双碳目标下基于全球模式比较计划CMIP6与区域气候-化学耦合模式WRF-Chem的未来大气污染变化模拟教程

原文链接&#xff1a;双碳目标下基于全球模式比较计划CMIP6与区域气候-化学耦合模式WRF-Chem的未来大气污染变化模拟教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247599209&idx7&sn2fb78bcb18e6ec709853a7595d8822d9&chksmfa82058ecdf58c9852bf4…

鸿蒙HarmonyOS应用开发之使用Node-API接口进行异步任务开发

场景介绍 napi_create_async_work是Node-API接口之一&#xff0c;用于创建一个异步工作对象。可以在需要执行耗时操作的场景中使用&#xff0c;以避免阻塞主线程&#xff0c;确保应用程序的性能和响应性能。例如以下场景&#xff1a; 文件操作&#xff1a;读取大型文件或执行复…

朋友圈运营攻略,还有多号群发朋友圈教程

为什么需要打造朋友圈&#xff1f; 私域朋友圈运营运营者和私域流量理论上其实就是“网友”的关系 要维持稳定的社交关系&#xff0c;做好私域流量运营&#xff0c;就必须持续地进行自身价值塑造&#xff01;而朋友圈就是最好的“战场” 打造优质朋友圈的关键点&#xff1a; …

09 网络ARP请求,响应,ICMP协议

arp协议_arp请求_arp回应 ICMP包构造ping搜狐服务器参考 #include <stdio.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <linux/if_packet.h> #include <linux/if_ether.h> #include <string.h> #includ…

文案转化率低?快看看这两个坑你踩没踩

对于很多中小企业来说&#xff0c;无论是来拓市场还是获客&#xff0c;软文营销都会成为他们的主要营销方式&#xff0c;比较软文营销的成本较低&#xff0c;同时门槛也不高。但是也有品牌发现&#xff0c;自己和团队辛苦构思了几周写出的文案&#xff0c;但是效果不是很好。今…

五、Elasticsearch 集成

目录 5.1 Spring Data 框架集成5.1.1 Spring Data 框架介绍5.1.2 Spring Data Elasticsearch 介绍5.1.3 Spring Data Elasticsearch 版本对比5.1.4 集成步骤 5.1 Spring Data 框架集成 5.1.1 Spring Data 框架介绍 Spring Data 是一个用于简化数据库开发的开源框架。其主要目…

前端 CSS 经典:grid 栅格布局

前言&#xff1a;Grid 布局是将容器划分成"行"和"列"&#xff0c;产生单元格&#xff0c;然后将"项目"分配给划分好的单元格&#xff0c;因为有行和列&#xff0c;可以看作是二维布局。 一 术语 1. 容器 采用网格布局的区域&#xff0c;也就是…

【机器学习之旅】概念启程、步骤前行、分类掌握与实践落地

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

六、保持长期高效的七个法则(二)Rules for Staying Productive Long-Term(2)

Rule #5 - If your work changes, your system should too. 准则五&#xff1a;如果你的工作变了&#xff0c;你的系统也应该改变。 For some, work will be consistent enough to not need major changes.You simply stick to the same system and you’ll get the results y…

高精密基准源 国产替代 REF191 ADR4520 ADR420 ADR430 ADR440 REF5020 MAX6126

高精密基准源 国产替代 REF191 ADR4520 ADR420 ADR430 ADR440 REF5020 MAX6126 ADR03 REF03 REF192 AD580 AD780 ADR441 ADR4525 ADR431 ADR421 REF5025ADR423 ADR433 ADR443 ADR4530 REF193 AD780 ADR06 REF5030ADR434 ADR444 ADR4540 REF198 REF5040ADR425 ADR435 ADR445 AD…

成功推出全新生成式AI的四大原则

生成式AI有望从根本上打开一扇新世界机遇的大门&#xff0c;以满足各行各业的客户需求。从提供个性化回复的对话式聊天机器人&#xff0c;到各种应用的代码&#xff0c;再到营销传播的目标内容&#xff0c;生成式AI正在彻底改变企业的运作方式。为竞相提供卓越的客户体验&#…

分布式系统的发展史

目录 &#x1f433;今日良言&#xff1a;且视他人之疑目如盏盏鬼火&#xff0c;大胆地去走自己的夜路 &#x1f407;一、常见概念 &#x1f407;二、发展史 今日良言&#xff1a;且视他人之疑目如盏盏鬼火&#xff0c;大胆地去走自己的夜路 一、常见概念 在正式介绍分布式系…

16、OpenFeign和Sentinel集成实现fallback服务降级

注&#xff1a;本篇文章主要参考周阳老师讲解的cloud进行整理的&#xff01; 1、需求说明 cloudalibaba-consumer-nacos-order83 通过OpenFeign调用 cloudalibaba-provider-payment9001 1、 83 通过OpenFeign调用 9001微服务&#xff0c;正常访问OK 2、 83 通过OpenFeign调用 …

推特社交机器人分类

机器人有不同的种类。 cresci-17数据集中的三种不同的机器人类:传统垃圾机器人、社交垃圾机器人和假追随者。 传统的垃圾邮件机器人会生成大量推广产品的内容&#xff0c;并且可以通过频繁使用的形容词来检测; 社交垃圾邮件倾向于攻击或支持政治候选人&#xff0c;因此情绪是一…