【C语言】探索文件读写函数的全貌

news2024/10/6 20:33:18

请添加图片描述

请添加图片描述
Alt

🌈个人主页:是店小二呀
🌈C语言笔记专栏:C语言笔记
🌈C++笔记专栏: C++笔记

🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅
请添加图片描述
🔥引言

本章将介绍文件读取函数的相关知识和展示使用场景,通过这些函数就可以打开文件与我们之间的桥梁。

文章目录

  • 一、文件的打开和关闭
  • 二、文件的打开模式
  • 三、文件路径
  • 四、文件打开和关闭函数
    • 4.1 fopen()
    • 4.2 fclose()
  • 五、顺序读写函数
    • 5.1 fputc()
    • 5.2 fgetc()
    • 5.3 实现文件拷贝
    • 5.4 fputs()
    • 5..5 fgets()
    • 5.6 fscanf和fprintf函数
    • 5.7 fprintf()
    • 5.8 fscanf()
    • 5.9 sprintf和sscanf函数
      • 5.9.1 sprintf()
      • 5.9.2 sscanf
      • 小总结
  • 六、二进制的方式读写函数
    • 6.1 fwrite()
    • 6.2 fread()
  • 七、文件的随机读写
    • 7.1 fseek()
    • 7.2 ftell()
    • 7.3 rewind()
  • 八、文件读取结束的判断
    • 8.1 ferror()
    • 8.2 feof()
    • 小总结
    • 检查文件读取结束场景
  • 九、文件缓冲区


一、文件的打开和关闭

如果需要对文件进行一些读写操作,那么首先就需要先打开文件,在使用完以后关闭文件,所以最基本是打开文件和关闭文件

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

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

二、文件的打开模式

mode表示文件的打开模式,下面都是文件的打开模式

⽂件使⽤⽅式含义如果指定⽂件不存在
“r”(只读)为了输⼊数据,打开⼀个已经存在的⽂本⽂件出错
“w”(只写)为了输出数据,打开⼀个⽂本⽂件建⽴⼀个新的⽂件
“a”(追加)向⽂本⽂件尾添加数据建⽴⼀个新的⽂件
“rb”(只读)为了输⼊数据,打开⼀个⼆进制⽂件出错
“wb”(只写)为了输出数据,打开⼀个⼆进制⽂件建⽴⼀个新的⽂件
“ab”(追加)向⼀个⼆进制⽂件尾添加数据建⽴⼀个新的⽂件
“r+”(读写)为了读和写,打开⼀个⽂本⽂件出错
“w+”(读写)为了读和写,建议⼀个新的⽂件建⽴⼀个新的⽂件
“a+”(读写)打开⼀个⽂件,在⽂件尾进⾏读写建⽴⼀个新的⽂件
“rb+”(读写)为了读和写打开⼀个⼆进制⽂件出错
“wb+”(读写)为了读和写,新建⼀个新的⼆进制⽂件建⽴⼀个新的⽂件
“ab+”(读写)打开⼀个⼆进制⽂件,在⽂件尾进⾏读和写建⽴⼀个新的⽂件

三、文件路径

在打开和关闭文件一般直接输入指定的文件名,当然也可以根据文件的路径对该文件进行操作。

路径分为:

  • 绝对路径
  • 相对路径
  • . 表示当前路径
  • … 上一级路径
对此当前文件test1.txt在D:\code\2024\2024\Document(绝对路径)
FILE* pf = fopen("C:\\Users\\zpeng\\Desktop\\test.txt", "w");   

当test1.txt在其他文件夹中,可以通过上面表示的关系寻找
FILE* pf = fopen(".\\..\\..\\hehe\\test.txt", "w");

四、文件打开和关闭函数

4.1 fopen()

FILE *fopen(const char * filename, const char * mode)

说明】:

  • 功能:打开其名称在参数 filename 中指定的文件,并将其与流相关联,该流可在将来的操作中通过返回的 FILE指针进行标识。
  • 返回值:如果文件成功打开,该函数将返回指FILE对象的指针,该对象可用于在将来的操作中标识流,如果文件没有成功打开,则将返回NULL。
  • 允许对流执行的操作以及如何执行这些操作由 mode 参数定义

4.2 fclose()

int fclose(FLIE *stream)

说明】:

  • 功能:关闭与流关联的文件并取消关联
  • 与流关联的所有内部缓冲区都将与其解除关联并刷新:写入任何未写入的输出缓冲区的内容,并丢弃任何未写入输入缓冲区的内容。(更新缓冲区)
  • 返回值:流关闭成功,则返回0。关闭失败,返回EOF

五、顺序读写函数

这里所有的输入流、输出流分别指stdin(标准输入流)、stdout(标准输出流)和文件流

5.1 fputc()

请添加图片描述

函数部分说明】:

功能上:

将字符写入流并推进位置指示器,然后自动前进1。适用于所有输入流(字符输入到流中)

参数部分上:

character

  • 将要写入的字符的整型提升
  • 写入时,该值在内部转换为无符号字符

stream:

  • 指向标识输出流的FILE对象指针

返回值:

  • 成功,将返回写入的字符。发生写入错误,则返回EOF并设置错误指示符(ferror)
int main()
{
	FILE* pf = fopen("test1.txt", "w");
	if (pf == NULL)
	{
		perror("fopen fail!!!");
			return;
	}
	fputc('d', pf);
	fputc('e', pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

使用说明】:

  • 首次调用fputc函数将字符‘d’写入到文件当中,位置指示器向前+1就会指向‘d’的下一个位置,第二次fputc函数时,字符‘e’在这个位置输入进去。
  • 注意这里对流执行写操作"w"模式
  • 对于stream可以是文件流也可以是标准流

练习】:使用fputc将A ~Z个字符输入到指定文件和显示器中

int main()
{
	FILE* pf = fopen("test1.txt", "w");
	if (pf == NULL)
	{
		perror("fopen fail!!!");
		return;
	}
	for (char i = 'A'; i <= 'Z'; i++)
	{
	fputc(i, pf);//输入到文件中
	fputc(i, stdout);//输入到显示器中
	}
	fclose(pf);
	pf = NULL;
	return 0;
}

5.2 fgetc()

在这里插入图片描述

函数部分说明】:

  • 功能:字符输入函数,从流中获得字符,返回指定流的内部文件位置指示符当前指向的字符内部文件位置指示器将前进到下一个字符
  • 返回值:成功后,将返回字符读取(进行整型提升)。如果失败则,返回EOF
int main()
{
    FILE* pf = fopen("test1.txt", "r");
    if (pf == NULL)
    {
        perror("fopen fail!!!");
        return;
    }	
    char ch;
    //ch用于接收fgetc从流中获得的字符
    ch = fgetc(pf);
    printf("%c", ch);
    
    ch = fgetc(pf);
    printf("%c", ch);

    fclose(pf);
    pf = NULL;
    return 0;
}

使用说明】:

  • 这里对流的操作采用mode是"r"模式
  • 此时在指定文件提前写入数据,使用fgetc读取该文中的数据,第一次使用时读取‘h’字符,指示器++1,指向‘e’字符位置,在第二次使用读取该字符。
  • 当然也可以直接从键盘读取数据(使用标准输入流stdin)–>改为ch = fgetc(stdin);

5.3 实现文件拷贝

通过以上两个函数,我们可以用来实现文件拷贝的场景

int main()
{
    FILE* pfread = fopen("data1.txt", "r");
    if (pfread == NULL)
    {
        perror("fopen fail!!!");
        return;
    }	
    FILE* pfwrite = fopen("data2.txt", "w");
    if (pfwrite == NULL)
    {
        fclose(pfread);//读文件操作没有必要
        pfread=NULL;
        perror("fopen fail!!!");
        return;
    }
    
    char ch;
    while ((ch = fgetc(pfread)) != EOF)
    {
        fputc(ch, pfwrite);
    }
    fclose(pfread);
    fclose(pfwrite);
    return 0;
}

在这里插入图片描述

使用说明】:

  1. 这里先提前准备好两个文件,并且在data1.txt中提前输入数据
  2. 这里需要对两个不同文件使用不同mode打开,对data1.txt使用读的形式,而data2.txt是写的形式打开
  3. 在while循环中一个从data1.txt读取字符,同时一个向data2.txt输入字符,直到读取完成或者发生错误

5.4 fputs()

在这里插入图片描述

函数部分说明】:

  • 功能:文本行输入函数,将str指向的字符串写入流中,从指定的地址开始复制,直到结束标志\0(\0’字符不会复制到流中
  • 返回值:成功,返回一个非负值,失败,则返回EOF
int main()
{
    FILE * pf = fopen("test1.txt", "w");
    if (pf == NULL)
    {
        perror("fopen fail!!!");
        return;
    }	
    //fputs("hellow world", pf); -- 将字符串输入到文件流中
    fputs("hellow world", stdout); -- 将字符串输入到输出流中(打印到屏幕上)

    fclose(pf);
    pf=NULL;
    return 0;
}

5…5 fgets()

在这里插入图片描述

函数部分说明】:

功能上:

  • 文本行输入函数,从流中获得字符串,直到读取到num-1个字符或者在达到换行符或文件末尾(前者为准)
  • 换行符(\n)会使fgets停止,但函数将其视为有效字符,并包含在复制到str的字符串中,在将字符复制到str之后,会自动添加\0,导致只能读取num-1字符

参数部分上:

str

  • 指向复制字符串读取到char数组的指针(这里提前开辟好数组)

num:

  • 复制到str中的最大字符数(包括‘\0’字符-字符串)

返回值:

  • 成功,返回str指针,失败,返回EOF
int main()
{
    FILE* pf = fopen("test1.txt", "r");
    if (pf == NULL)
    {
        perror("fopen fail!!!");
        return;
    }
    char ch[1000]="xxxxxxx";
    fgets(ch, 7, pf);
    printf("%s", ch);
    fclose(pf);
    pf = NULL;
    return 0;
}

在这里插入图片描述

说明】:给\0留了一个位置


5.6 fscanf和fprintf函数

fprintfscanf属于格式化输入输出函数,将不同数据类型放在结构体中进行统一管理

struct S
{
    char a[1000];
    int p;
    float pa;
};

5.7 fprintf()

在这里插入图片描述

函数部分说明】:

功能上

  • 按格式化数据写入流,如果format包含格式说明符(%开头的子序列),则格式化format后面的其他参数并将其插入到生成的字符串中,代替其各自的说明符.
  • 根据格式说明符顺序,匹配不同类型对应的数据,输入到text1.txt中去。

返回值:

  • 成功,返回写入字符总数,失败,则返回负数
int main()
{
    struct S s={"zhangsan",100,4.3};
    FILE* pf = fopen("test1.txt", "w");
	if (pf == NULL)
	{
		perror("fopen fail!!!");
		return;
	}
	fprintf(pf,"%s %d %f", s.a, s.p, s.pa);
		fclose(pf);
		pf = NULL;
	return 0;
}

5.8 fscanf()

在这里插入图片描述

函数部分说明】:

功能:

  • 从流中读取数据,并根据格式将其存储到其他参数指向的位置。
  • 该对象由格式化字符串的相应格式说明符指示。
  • 根据格式说明符顺序,匹配text1.txt对应的数据,输入到对应的数据变量中

返回值:

成功后,该函数返回已成功填充的参数列表的项数,失败,EOF

int main()
{
	struct S s;//这里没有初始化,目的是通过fscanf赋值
	FILE* pf = fopen("test1.txt", "r");
	if (pf == NULL)
	{
		perror("fopen fail!!!");
		return;
	}	
	fscanf(pf, "%s %d %f", s.a, &(s.p), &(s.pa));
	printf("%s %d %f", s.a, s.p, s.pa);
    
		fclose(pf);
		pf = NULL;
	return 0;
}

5.9 sprintf和sscanf函数

5.9.1 sprintf()

在这里插入图片描述

函数部分说明】:

功能:

从字符串中读取格式化数据(将字符数组中的字符串按照格式说明符转换为对应的格式化数据)

5.9.2 sscanf

在这里插入图片描述

函数部分说明】:

功能:

将格式化数据写入字符串(格式化数据转换为字符串存放在字符数组中)

基于以上两个函数使用场景:

int main()
{
	//将格式化的数据转换为字符串存放在p数组中
	struct S s = { "zhangsan",100,4.3 };
	char p[1000] = { 0 };
	sprintf(p, "%s %d %f", s.a, s.p, s.pa);
	printf("%s\n", p);

	//从p这个字符串中提取格式化的数据(用p数组中的数据,为结构体t成员赋值)
	struct S t;
	sscanf(p, "%s %d %f", t.a, &(t.p), &(t.pa));
	printf("%s %d %lf", s.a, s.p, s.pa);

	return 0;
}

小总结

在这里插入图片描述


六、二进制的方式读写函数

6.1 fwrite()

在这里插入图片描述

函数部分说明】:
请添加图片描述

功能:

  • 二进制输出,将 count 元素数组(每个元素的大小为 size bytes)ptr 指向的内存块写入中的当前位置

返回值:

  • 成功将返回写入元素个数
  • 如果此数字与 count 参数不同,则写入错误会阻止函数完成
  • 如果 sizecount 为零,则函数返回零,错误指示器保持不变。
int main()
{
	FILE* pf = fopen("test1.txt", "wb");//打开一个二级制文件
	if (pf == NULL)
	{
		perror("fopen fail!!!");
		return;
	}
	int nums[] = { 1,2,3,4,5,6,7 };
	fwrite(nums, sizeof(int), 7, pf);
    fclose(pf);
	pf = NULL;
	return 0;
}

注意】:这里是通过二进制的形式写入文本文件中,如果想要看懂输入的数据,可以在打开方式选择二进制编辑器或者使用fread函数读取出来


6.2 fread()

在这里插入图片描述

函数部分说明】:

  • 功能:
  • 二进制输入,从流中读取 count 元素的数组,每个元素的大小为 bytes,并将它们存储在 ptr 指定的内存块中。

返回值:

  • 成功将返回写入实际元素个数
  • 如果此数字与 count 参数不同,则表示读取时发生读取错误或达到文件末尾
  • 如果 sizecount 为零,则该函数返回零, ptr 指向的流状态和内容保持不变

比如:如果实际文件中只有7个字符,count是14,那么读到7给字符就结束(返回值 < count就返回)

int main()
{
    FILE* pf = fopen("test1.txt", "rb");//打开一个二级制文件
    if (pf == NULL)
    {
        perror("fopen fail!!!");
        return;
    }
    //int nums[] = { 1,2,3,4,5,6,7 };
    //fwrite(nums, sizeof(int), 7, pf);
    //读取二进制存放的信息
    
    int nums[10] = { 0 };
    fread(nums, sizeof(int), 10, pf);
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", nums[i]);
    }
    
    fclose(pf);
    pf = NULL;
    return 0;
}

在这里插入图片描述


七、文件的随机读写

由于文本文件和二进制文件使用方面存在差异,下面三个函数将采用二进制文件

7.1 fseek()

在这里插入图片描述

函数部分说明】:

功能上:

  • 重新定位流位置指示器,根据文件指针的位置和偏移量定位文件指针

返回值:

  • 成功,返回零,失败,返回非零值

注意】:

  • 二进制文件:要从原点偏移的字节数
  • 文本文件:零或 ftell 返回的值

【原点】

特别注意的是起源(从哪个位置),用作偏移参考位置

  • SEEK_SET :文件开头
  • SEEK_CUR :文件指针的当前位置
  • SEEK_END: 文件末尾
int main()
{
	FILE* pf = fopen("test1.txt", "wb");//打开一个二级制文件
	if (pf == NULL)
	{
		perror("fopen fail!!!");
		return;
	}
	fputs("This is an apple", pf);
	fseek(pf, 3, SEEK_SET);
	fputs("sam", pf);
    
	fseek(pf, -3, SEEK_END);//文件指针往前走
	fputs("xxx", pf);
    fclose
	return 0;
}

在这里插入图片描述

7.2 ftell()

在这里插入图片描述

函数部分说明】:

功能上:

  • 返回流的位置指示器的当前值(返回文件指针相对于起始位置的偏移量 )

返回值:

  • 对于二进制流,这是从文件开头开始的字节
  • 对于文本流,数值可能没有意义
int main()
{
    FILE* pf = fopen("test1.txt", "wb");//打开一个二级制文件
    if (pf == NULL)
    {
        perror("fopen fail!!!");
        return;
    }
    fputs("This is an apple", pf);

    fseek(pf, 0, SEEK_END);
    int size = ftell(pf);
    printf("%d", size);//size==16,源头到参考位置的字节数
    fclose(pf);
    pf = NULL;
    return 0;
}

7.3 rewind()

image-20240429202328302

函数部分说明】:

  • 功能:让文件指针的位置回到文件的起始位置
int main()
{
    FILE* pf = fopen("test1.txt", "wb");//打开一个二级制文件
    if (pf == NULL)
    {
        perror("fopen fail!!!");
        return;
    }
    fputs("This is an apple", pf);

    fseek(pf, 0, SEEK_END);
    rewind(pf);
    int size = ftell(pf);
    printf("%d", size);
    fclose(pf);
    pf = NULL;
    return 0;
}

请添加图片描述


八、文件读取结束的判断

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

8.1 ferror()

在这里插入图片描述

函数部分说明】:

  • 功能:检查错误指示器
  • 返回值:检查是否设置了与关联的错误指示器,如果设置了,则返回一个不同于零的值

8.2 feof()

在这里插入图片描述

函数部分说明】:

  • 功能:检查文件结束指示器

  • 返回值:**如果设置了与流关联的文件结束指示符,则返回非零值。**否则,返回零。

小总结

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

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


检查文件读取结束场景

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");

九、文件缓冲区

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


请添加图片描述

以上就是本篇文章的所有内容,在此感谢大家的观看!这里是店小二C语言笔记,希望对你在学习C语言中有所帮助!

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

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

相关文章

AI自动化办公:批量将Excel表格英文内容翻译为中文

有一个50列的表格&#xff0c;里面都是英文&#xff0c;要翻译成中文&#xff1a; 在ChatGPT中输入提示词&#xff1a; 你是一个开发AI大模型应用的Python编程专家&#xff0c;要完成以下任务的Python脚本&#xff1a; 打开Excel文件&#xff1a;"F:\AI自媒体内容\AI行业…

harbor -- docker私有仓库安装配置

1 安装docker-compose $ curl -L "https://get.daocloud.io/docker/compose/releases/download/v1.25.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose $ chmod x /usr/local/bin/docker-compose 2 安装配置harbor $ wget https://g…

JS-51-Node.js10-yarn

一、yarn的简介 Yarn 是一款 JavaScript 的包管理工具&#xff08;npm的代替方案&#xff09;&#xff0c;是 Facebook, Google, Exponent 和 Tilde 开发的一款新的 JavaScript 包管理工具。 正如 Yarn 官网的介绍&#xff0c;Yarn 的具有速度快 、安全 、可靠 的优点&#x…

嘉立创使用gif

新建原理图 边框设置2 新建pcb图 放置焊盘 排列焊盘 新建符号 封号向导 新建封装 封装向导 符号与封装联结 原件查找 drc设计规则&#xff08;线之间的距离等 布线冲突 顶底层切换 T ,B 顶底连线&#xff0c;自动创造过孔 铺铜 泪滴 网格大小 吸附 元件库

民国漫画杂志《时代漫画》第33期.PDF

时代漫画33.PDF: https://url03.ctfile.com/f/1779803-1248635648-d8235b?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

任何图≌自己这一几何最起码常识推翻直线公理让R外标准实数一下子浮出水面

黄小宁 h定理&#xff1a;点集AB≌B的必要条件是A≌B。 证&#xff1a;若AB则A必可恒等变换地变为BA≌A&#xff0c;而恒等变换是保距变换。证毕。 如图所示R轴即x轴各元点x沿x轴正向不保距平移变为点y2x就使x轴沿本身拉伸&#xff08;放大&#xff09;变换为y2x轴不≌x轴&…

PDF盖骑缝章

在PDF文件上加盖骑缝章&#xff0c;您可以采取以下几种方法之一&#xff1a; 使用Adobe Acrobat&#xff1a; 打开Adobe Acrobat软件&#xff0c;加载PDF文件。在工具栏选择“工具”选项&#xff0c;找到“骑缝章”或“印章”工具。选择或上传您的骑缝章图片&#xff0c;将其放…

区块链技术:金融行业的信任基石

一、引言 在数字化转型的浪潮中,区块链技术以其独特的优势,正逐渐成为金融行业的信任基石。本文将深入探讨区块链技术在金融行业的应用,通过具体案例的细化和完善,分析其特点和影响。 二、区块链技术的核心特点 1. 去中心化:区块链技术通过分布式账本,实现去中心化的数…

乡村振兴,教育先行:加强农村教育事业发展,提高农民素质,培育新时代新型农民,为美丽乡村建设提供人才保障

目录 一、引言 二、农村教育事业发展的重要性 1、提高农民素质&#xff0c;促进全面发展 2、推动农村经济社会发展 3、传承乡村文化&#xff0c;促进文化振兴 三、加强农村教育事业发展的策略 1、加大教育投入&#xff0c;改善教育设施 2、普及义务教育&#xff0c;提高…

栈和队列题目练习

本节小编选了两道题来加深对栈和队列的认识理解&#xff01; 有效的括号 方法1&#xff1a;直接用栈的结构&#xff08;动态数组&#xff09; 本题可以用栈这个结构来解答&#xff0c;将(,{,[ 左括号压入栈中&#xff0c;然后取出栈顶元素与右括号),},]匹配。不匹配的话&…

雅特力串口485模式TCDT/TSDT说明

TCDT&#xff08;发送器完成延迟时间&#xff08;transmit complete delay time&#xff09;占了5个bit位&#xff0c;则最大值为 2 5 − 1 31 2^{5} -1 31 25−131&#xff0c;时间单位是 1 16 波特率周期 \frac{1}{16}波特率周期 161​波特率周期 波特率为9600&#xff…

如何理解 Java 接口和抽象类的定义和使用场景

Java 是一种面向对象编程语言&#xff0c;提供了丰富的面向对象编程机制。其中&#xff0c;接口和抽象类是两个重要的概念&#xff0c;它们在设计和实现代码时扮演着关键的角色。 接口&#xff08;Interface&#xff09; 定义和特性 接口是 Java 中的一种引用数据类型&#…

神经网络与深度学习——第4章 前馈神经网络

本文讨论的内容参考自《神经网络与深度学习》https://nndl.github.io/ 第4章 前馈神经网络 前馈神经网络 神经元 Sigmoid型函数 Hard-Logistic函数和Hard-Tanh函数 ReLU函数 带泄露的ReLU 带参数的ReLU ELU函数 Softplus函数 Swish函数 GELU函数 Maxout单元 网络结构 前馈网络…

JAVAEE之多线程进阶(2)_ CAS概念、实现原理、ABA问题及解决方案

前言 在并发编程时&#xff0c;常常会出现线程安全问题&#xff0c;那么如何保证原子性呢&#xff1f;常用的方法就是加锁。在Java语言中可以使用 Synchronized和CAS实现加锁效果。  Synchronized关键字保证同步的&#xff0c;这会导致有锁&#xff0c;但是锁机制存在以下问题…

当你想使用预测概率作为预测模型的结果

&#x1f31f;当你想使用预测概率作为医学预测模型的结果&#x1f31f; 分类预测模型的预测结果有两种。一种是直接判断是哪一类&#xff0c;这种情况下唯一可以调节的就是决策阈值&#xff0c;或者是默认的0.5&#xff0c;也可以是参数确定的决策阈值&#xff0c;比如约登指数…

ELK 使用 metricbeat监控数据

IP功能版本192.168.140.153elk-18.13.4192.168.140.153metricbeat8.13.4192.168.140.156elk-28.13.4192.168.140.156metricbeat8.13.4192.168.140.159logstash8.13.4192.168.140.159kibana8.13.4 一、安装ELK 参考文档&#xff1a; https://download.csdn.net/download/weix…

Spring 源码:深度解析AOP源码配置解析

文章目录 一、 解析AOP配置的入口1.1 从XML配置到AOP Namespace的解析流程1.2 分析注解驱动的AOP配置解析流程 二、AOP配置解析的核心流程2.1 ConfigBeanDefinitionParser 类2.2 parse()2.3 parseAdvisor()2.4 parseAspect()2.5 parsePointcut()2.6 createAdvisorBeanDefinitio…

CentOS 7基础操作02_优化Linux操作系统中的服务

1、实验环境 公司在文件服务器中新安装了CentOS系统.由于默认启动的服务程序较多&#xff0c;系统运行缓慢。现需要对系绞服务进行适当优化&#xff0c;减少一些不必要的自启动服务.并设置系统在开机后直接进入字符模式。 2、需求描述 根据实际使用需求对CentOS 7操作系统中的…

C++第二十二弹---vector深度剖析及模拟实现(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、容量操作 2、内容修改操作 3、打印函数 4、迭代器失效 4.1、什么是迭代器失效 4.2、哪些操作会引起迭代器失效 总结 1、容量操作 size()…

【Docker】宝塔创建Docker容器配置nginx

前言 本篇是我入门docker的第一篇&#xff0c;由于docker具有很好的移植性&#xff0c;易于安装&#xff0c;开箱即用&#xff1b;签约的公司项目开发需要我进行学习&#xff0c;否则money减半&#xff0c;5555~ 百度找了一圈&#xff0c;只有关于docker怎么装宝塔服务器的却没…