【C语言基础】:文件操作详解(后篇)

news2024/11/26 16:37:48

文章目录

      • 一、文件的顺序读写
        • 1.1 顺序函数读写函数介绍
        • 1.2 fgetc函数和fputc函数
        • 1.3 fputs函数和fgets函数
        • 1.4 fprintf函数和fscanf函数
        • 1.5 fwrite函数和fread函数
      • 二、文件的随机读写
        • 2.1 fseek函数
        • 2.2 ftell函数
        • 2.3 rewind函数
      • 三、文件读取结束的判定
        • 3.1 feof函数
      • 四、文件缓冲区

上期回顾: 【C语言基础】:文件操作详解(前篇:准备知识)

一、文件的顺序读写

1.1 顺序函数读写函数介绍

在这里插入图片描述

1.2 fgetc函数和fputc函数

fputc函数原型

int fputc ( int character, FILE * stream );

将字符写入流
将一个字符写入流并推进位置指示器。
字符被写入流的内部位置指示器所指示的位置,然后自动向前移动一个。

参数说明

character: 要写入的字符,以整数形式表示。
stream :指向要写入的文件的文件指针。

函数返回值

如果成功写入字符,则返回写入的字符,如果发生错误,则返回 EOF。

【示例1】

#include<stdio.h>
int main()
{
	// 打开文件
	FILE* pf = fopen("test1.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	// 写文件
	fputc('a', pf);
	fputc('b', pf);
	fputc('c', pf);
	// 关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述
在这里插入图片描述
【示例2】

#include<stdio.h>
int main()
{
	// 打开文件
	FILE* pf = fopen("test1.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	// 写文件
	char ch = 0;
	for (ch = 'A'; ch <= 'Z'; ch++)
	{
		fputc(ch, pf);
	}
	// 关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述
在这里插入图片描述

fgetc函数原型

int fgetc ( FILE * stream );

从流中获取字符
返回指定流的内部文件位置指示符当前指向的字符。然后将内部文件位置指示符推进到下一个字符。
如果流在被调用时位于文件的末尾,则该函数返回EOF并为流设置文件结束指示器(feof)。
如果发生读错误,该函数返回EOF并设置流的错误指示器(error)。
fgetc和fgetc是等价的,除了getc可以在某些库中作为宏实现。

参数说明

stream: 指向要读取的文件的文件指针。

函数返回值

如果成功读取一个字符,则返回读取的字符,如果已到达文件末尾或发生错误,则返回 EOF。
返回值是整形的原因

  1. 读取成功,返回该字符的ASCII值。
  2. 读到文件末尾或则读取失败,返回EOF(-1)。

【示例1】

#include<stdio.h>
int main()
{
	// 打开文件
	FILE* pf = fopen("test1.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	// 读文件
	int ch = fgetc(pf);
	printf("%c", ch);

	ch = fgetc(pf);
	printf("%c", ch);

	ch = fgetc(pf);
	printf("%c", ch);
	// 关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述
【示例2】

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

在这里插入图片描述

1.3 fputs函数和fgets函数

fputs函数原型

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

将字符串写入流
将由str指向的C字符串写入流。
函数从指定的地址(str)开始复制,直到到达结束的空字符(‘\0’)。这个终止的空字符不会复制到流中。
注意,fputs与puts的不同之处不仅在于可以指定目标流,而且fputs不会写入额外的字符,而puts会自动在末尾附加一个换行符。

参数说明

str: 要写入的字符串,以 const char * 类型表示。
stream: 指向要写入的文件的文件指针。

函数返回值

如果成功写入字符串,则返回非负值(通常为 0),如果发生错误,则返回 EOF。

【示例】

#include<stdio.h>
int main()
{
	// 打开文件
	FILE* pf = fopen("test1.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	// 写文件
	fputs("hello", pf);
	fputs(" world", pf);
	// 关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

fgets函数原型

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

从流中获取字符串
从流中读取字符,并将其作为C字符串存储到str中,直到读取(num-1)个字符,或者到达换行符或文件结束符,以先发生的为准。
换行符使fgets停止读取,但它被函数认为是一个有效字符,并包含在复制到str的字符串中。
在复制到str的字符之后,将自动追加一个终止null字符。
请注意,fgets与gets有很大的不同:fgets不仅接受流参数,而且允许指定str的最大长度,并在字符串中包含任何结束换行符。
参数说明

str: 一个指向字符数组的指针,用于存储读取的字符。
num: 要读取的最大字符数(包括空字符),通常是 str 缓冲区的大小。
stream: 指向要读取的文件的文件指针。

函数返回值

如果成功读取一行字符,则返回 str 参数的值;如果到达文件末尾或发生错误,则返回 NULL。

【示例】

#include<stdio.h>
int main()
{
	// 打开文件
	FILE* pf = fopen("test1.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	// 读文件
	char arr[10] = { 0 };
	fgets(arr, 10, pf);
	printf("%s\n", arr);
	// 关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述
在这里插入图片描述
注意:要求读10个字符,结果却只读9个,因为\0也会算进去。

1.4 fprintf函数和fscanf函数

fprintf函数原型

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

将格式化的数据写入流
将由format指向的C字符串写入流。如果format包含格式说明符(以%开头的子序列),则格式化format之后的其他参数并将其插入到结果字符串中,以替换它们各自的说明符。
在format形参之后,函数期望至少与format指定的一样多的附加参数。

参数说明如下

stream:指向文件的指针,它指定了数据将要被写入的文件。
format:一个格式化字符串,其中包含了要写入的数据以及格式化说明符。
:可变数量的参数,根据 format 字符串中的格式化说明符指定了要写入的数据。
fprintf 函数的返回值是一个 int 类型,表示成功写入的字符数,如果发生错误则返回一个负数。

【示例】

#include<stdio.h>
struct S
{
	char name[20];
	int age;
	float score;
};
int main()
{
	struct S s = { "张三", 19, 89.5 };
	// 打开文件
	FILE* pf = fopen("test1.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	// 写文件
	fprintf(pf, "%s %d %f", s.name, s.age, s.score);
	// 关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述
在这里插入图片描述
fscanf函数原型

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

从流中读取格式化的数据
从流中读取数据,并根据参数格式将其存储到附加参数所指向的位置。
额外的参数应该指向已经分配的对象,其类型由格式字符串中相应的格式说明符指定。

参数说明如下

stream:指向文件的指针,它指定了从中读取数据的文件。
format:一个格式化字符串,其中包含了要读取的数据的格式化说明符。
:可变数量的参数,根据 format 字符串中的格式化说明符指定了要读取的数据。
fscanf 函数的返回值是一个 int 类型,表示成功读取并匹配的数据项的数量。如果到达文件结束或发生读取错误,则返回 EOF (-1)。

【示例】

#include<stdio.h>
struct S
{
	char name[20];
	int age;
	float score;
};
int main()
{
	struct S s = { "张三", 19, 89.5f };
	// 打开文件
	FILE* pf = fopen("test1.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 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;
}

在这里插入图片描述

1.5 fwrite函数和fread函数

fwrite函数原型

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

将数据块写入流
将由count元素组成的数组(每个元素的大小为size字节)从ptr所指向的内存块写入流中的当前位置。
流的位置指示器按写入的总字节数前进。
在内部,该函数将ptr指向的块解释为unsigned char类型的(size*count)元素数组,并将它们顺序写入流,就像对每个字节调用fputc一样。

参数说明如下

ptr:指向要写入的数据块的指针。
size:每个数据项的大小(以字节为单位)。
count:要写入的数据项的数量。
stream:指向文件的指针,它指定了数据将要被写入的文件。
fwrite 函数的返回值是一个 size_t 类型,表示成功写入的数据项的数量。如果发生错误,则返回一个小于 count 的值。

【示例】

#include<stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5 };
	// 打开文件
	FILE* pf = fopen("test1.txt", "wb");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	// 写文件
	int sz = sizeof(arr) / sizeof(arr[0]);
	fwrite(arr, sizeof(arr[0]), sz, pf);  // 以二进制的形式写入 
	// 关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述
在这里插入图片描述
fread函数原型

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

从流中读取数据块
从流中读取一个由count元素组成的数组,每个元素的大小为size字节,并将它们存储在ptr指定的内存块中。
流的位置指示器按读取的总字节数前进。
如果成功读取的总字节数为(size*count)。

参数说明如下

ptr:指向存储读取数据的缓冲区的指针。
size:每个数据项的大小(以字节为单位)。
count:要读取的数据项的数量。
stream:指向文件的指针,它指定了从中读取数据的文件。
fread 函数的返回值是一个 size_t 类型,表示成功读取的数据项的数量。如果到达文件末尾或发生读取错误,则返回一个小于 count 的值。

【示例】

#include<stdio.h>
int main()
{
	int arr[5] = { 0 };
	// 打开文件
	FILE* pf = fopen("test1.txt", "rb");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	// 读文件
	fread(arr, sizeof(arr[0]), 5, pf);
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", arr[i]);
	}
	// 关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述
上面说的适用于所有输入流一般指适用于标准输入流和其他输入流(如文件输入流);所有输出流一般指适用于标准输出流和其他输出流(如文件输出流)

二、文件的随机读写

2.1 fseek函数

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

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

重新定位流位置指示器
将与流关联的位置指示器设置为新位置。
对于以二进制模式打开的流,通过将偏移量添加到由origin指定的参考位置来定义新位置。
对于以文本模式打开的流,offset值要么为零,要么为先前调用ftell返回的值,origin必须为SEEK_SET。
如果使用这些参数的其他值调用函数,则支持取决于特定的系统和库实现(不可移植)。
在成功调用此函数后,流的文件结束内部指示符将被清除,并且先前调用ungetc对该流的所有效果将被删除。
在为update(读+写)打开的流上,调用fseek允许在读和写之间切换。

参数说明如下

stream:指向文件的指针,它指定了要设置位置指针的文件。
offset:相对于 origin 的偏移量。偏移量可以是正数(向文件末尾方向移动)或负数(向文件开头方向移动)。
origin:指定了从哪个位置计算偏移量的基准。可以取以下三个值之一:

  • SEEK_SET:从文件开头计算偏移量。
  • SEEK_CUR:从当前位置计算偏移量。
  • SEEK_END:从文件末尾计算偏移量。

fseek 函数的返回值是一个 int 类型,表示操作是否成功。如果成功,返回0;如果出现错误,返回非零值。通过 ferror 函数可以检查是否发生了错误。

【示例】

#include<stdio.h>
int main()
{
	// 打开文件
	FILE* pf = fopen("test1.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	// 读文件
	int ch = fgetc(pf);
	printf("%c\n", ch);

	// fseek(pf, 5, SEEK_SET);// f
	// fseek(pf, 4, SEEK_CUR);// f
	fseek(pf, -4, SEEK_END);// f

	ch = fgetc(pf);
	printf("%c\n", ch);
	// 关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述
在这里插入图片描述

2.2 ftell函数

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

long int ftell ( FILE * stream );

获取流中的当前位置
返回流的位置指示器的当前值。
对于二进制流,这是从文件开头开始的字节数。
对于文本流,数值可能没有意义,但仍然可以用于稍后使用fseek将位置恢复到相同的位置(如果使用ungetc放回的字符仍然等待读取,则行为未定义)。

参数说明如下

stream:指向文件的指针,它指定了要获取位置指针的文件。
ftell 函数的返回值是一个 long int 类型,表示当前位置指针相对于文件开头的偏移量(以字节为单位)。如果出现错误,返回值可能是 -1。通常情况下,返回值应该是非负数,但标准并未规定返回值的确切含义,因此应谨慎处理。

【示例】

#include<stdio.h>
int main()
{
	// 打开文件
	FILE* pf = fopen("test1.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	// 读文件
	int ch = fgetc(pf);
	printf("%c\n", ch);// a
	fseek(pf, -4, SEEK_END);// f
	printf("%d\n", ftell(pf));
	// 关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

2.3 rewind函数

让文件指针的位置回到文件的起始位置
函数原型

void rewind ( FILE * stream );

设置流的起始位置
将与流关联的位置指示器设置为文件的开头。
在成功调用此函数后,与流相关的文件结束和错误内部指示器将被清除,并且先前调用ungetc对该流的所有效果将被删除。
在为更新(读+写)打开的流上,对rewind的调用允许在读和写之间切换。

参数说明如下

stream:指向文件的指针,它指定了要重置位置指针的文件。
rewind 函数没有返回值。它会将文件流的位置指针设置为文件开头,以便重新读取文件内容或进行其他操作。使用 rewind 函数后,可以再次从文件开头开始读取数据。

【示例】

#include<stdio.h>
int main()
{
	// 打开文件
	FILE* pf = fopen("test1.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	// 读文件
	int ch = fgetc(pf);
	printf("%c\n", ch);// a
	fseek(pf, -4, SEEK_END);
	ch = fgetc(pf);
	printf("%c\n", ch);// f
	rewind(pf);
	ch = fgetc(pf);
	printf("%c\n", ch);// a
	// 关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

三、文件读取结束的判定

3.1 feof函数

函数原型

int feof ( FILE * stream );

当文件读取结束的时候,判断是读取结束的原因是否是:遇到文件尾结束。
【示例】

#include<stdio.h>
int main()
{
	// 打开文件
	FILE* pf = fopen("test1.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	// 读文件
	int ch = 0;
	while ((ch = fgetc(pf)) != EOF)
	{
		printf("%c\n", ch);
	}
	// 导致读取结束的原因
	if (feof(pf))
	{
		printf("遇到文件末尾,正常结束");
	}
	else if (ferror(pf))
	{
		perror("fgetc");
	}
	// 关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

四、文件缓冲区

ANSIC 标准采用“缓冲文件系统” 处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟⼀块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。
在这里插入图片描述
因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。
如果不做,可能导致读写文件的问题。

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2vun1hwpzn40o

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

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

相关文章

Linux操作系统的学习

Linux系统的目录结构 / 是所有目录的顶点目录结构像一颗倒挂的树 Linux常用命令 常见命令 序号命令对应英文作用1lslist查看当前目录下的内容2pwdprint work directory查看当前所在目录3cd [目录名]change directory切换目录4touch [文件名]touch如果文件不存在&#xff0c;新…

4. 依赖查找依赖注入

本小节源码&#xff1a;Spring-DI 1. 依赖查找 前面两个小节我们学习了如何将 Bean 对象分别以配置文件与注解的方式存入 Spring 中&#xff0c;然而通过 Bean 从 Spring 容器中取出的过程其实就是依赖查找&#xff0c;这里我简单归纳一下各种依赖查找的方式。 1.1 通过beanI…

【MySQL】索引篇

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;学习技术栈 个性签名&#xff1a;保留赤子之心也许是种幸运吧 本文封面由 凯楠&#x1f4f8;友情提供 目录 本系列传送门 1. 什么是索引 2. 索引的特性 3. 索引的分类 4. 索引的优点及缺点 优点 缺点 5.…

FPGA基于VCU的H265视频压缩,HDMI2.0输入,支持4K60帧,提供工程源码+开发板+技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的视频图像编解码方案 3、详细设计方案设计框图FPGA开发板视频输入Video PHY ControllerHDMI 1.4/2.0 Receiver SubsystemVideo Processing SubsystemVideo Frame Buffer WriteZynq UltraScale VCUPetaLinux 系统制作VLC播放器工…

ElasticSearch的数据同步【Java实现】

文章目录 1、思路分析1.1、同步调用1.2、异步通知1.3、监听binlog1.4、如何选择 2、实现数据同步2.1、思路2.2、demo2.3、声明交换机、队列1&#xff09;引入依赖2&#xff09;声明队列交换机名称3&#xff09;声明队列交换机 2.4、发送MQ消息2.5、接收MQ消息 3、代码链接分享 …

Quartz + SpringBoot 实现分布式定时任务

文章目录 前言一、分布式定时任务解决方案二、Quartz是什么&#xff1f;1.quartz简介2.quartz的优缺点 二、Quartz分布式部署总结 前言 因为应用升级&#xff0c;由之前的单节点微服务应用升级为集群微服务应用&#xff0c;所以之前的定时任务Spring Scheduled不再适用了&…

蓝桥备赛——组合数、其他技巧

对字符串进行permutations排列组合 from itertools import permutations a abc #对字符串进行permutations排列组合 for i in permutations(a,3):x .join(i)print (x,end ) print (\n------------------------------------) permutations后面的参数&#xff0c;第一个表示…

Canal 扩展篇

1.Canal介绍 GitHub - alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件 Canal 主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费&#xff0c;工作原理如下&#xff1a; Canal 模拟 MySQL slave 的交互协议&#xff0c;伪装自己为 M…

【原创】springboot+mysql宠物管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

Redis(二十)五大经典类型源码

文章目录 面试题源码核心Redis基本的数据结构(骨架)Redis数据库的实现Redis服务端和客户端实现其他 K-V实现怎样实现键值对(key-value)数据库的传统五大基本数据类型和新五大数据类型 5大数据结构底层C语言源码分析示例redisObject五大数据结构解析定义Debug Object keyString …

01 SQL基础 -- 初识数据库与安装

一、初识数据库 数据库是将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合。该数据集合称为数据库(Database, DB)。用来管理数据库的计算机系统称为数据库管理系统(Database Management System, DBMS) 1.1 DBMS 的种类 DBMS 主要通过数据的保存格式…

【WEEK7】 【DAY3】JDBC—数据库驱动【中文版】

2024.4.10 Wednesday 目录 10.JDBC10.1.数据库驱动10.1.1.驱动10.1.2.JDBC10.1.3.第一个JDBC程序10.1.3.1.创建一个普通项目10.1.3.2.导入数据库驱动10.1.3.3.编写测试代码10.1.3.4.DriverManager10.1.3.5.URL10.1.3.6.Connection10.1.3.7.Statement执行SQL的对象10.1.3.8.Res…

[大模型]Atom-7B-chat网页例子

# Atom-7B-chat## 环境准备在[autodl](https://www.autodl.com/)平台中租一个3090等24G显存的显卡机器&#xff0c;如下图所示镜像选择PyTorch-->2.0.0-->3.8(ubuntu20.04)-->11.8![Alt text](images/image-1.png)接下来打开刚刚租用服务器的JupyterLab&#xff0c;并…

Codeforces Round 937 (Div. 4)(A~E)

A. Stair, Peak, or Neither? 根据题意来就可以了 #include <bits/stdc.h> using namespace std;void solve(){int a,b,c;cin>>a>>b>>c;if(a<b and b<c){cout<<"STAIR"<<endl;}else if(a<b and b>c){cout<<…

Docker部署SpringBoot+Vue前后端分离项目

文章目录 1. 安装Docker1. 1 卸载旧版Docker1.2 配置yum仓库1.3 安装Docker1.4 添加自启动配置1.5 配置阿里云镜像加速1.6 测试 2. 安装Nginx2.1 拉取镜像2.2 安装Nginx2.3 测试 3. 安装MySQL3.1 拉取镜像3.2 安装MySQL3.3 连接MySQL 4. 部署SpringBoot项目4.1 Maven打包4.2 编…

算法——栈

. - 力扣&#xff08;LeetCode&#xff09; 给你一个以字符串表示的非负整数 num 和一个整数 k &#xff0c;移除这个数中的 k 位数字&#xff0c;使得剩下的数字最小。请你以字符串形式返回这个最小的数字。 class Solution { public:string removeKdigits(string num, int k…

LeetCode-热题100:64. 最小路径和

题目描述 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 **说明&#xff1a;**每次只能向下或者向右移动一步。 示例 1&#xff1a; 输入&#xff1a; grid [[1,3,1],[1,5,1],[4,2,1]]…

二叉树:小红的完全二叉树构造

题目描述 小红想构造一个总共 n 个节点完全二叉树&#xff0c;该二叉树满足以下两个性质&#xff1a; 1. 所有节点的权值值为 1 ~ n 的一个排列。 2. 除了根节点以外&#xff0c;每个节点的权值和它父亲的权值的乘积为偶数。 请你帮小红构造出这个二叉树&#xff0c;并按层序遍…

Handler——小白能懂的原理,老鸟需要的面经

1.机制学习 1.1Handler定义 发送并处理 与线程的消息队列关联的Message和Runnable 1.2基本用法 1、Message.obtain() 从消息池取得Message 2、Handler().sendMessage(msg) 发送消息 3、Handler().post 将Runnable包装成Message发送 以下提供一个结构代码 import android.os.H…

嵌入式linux系统链接腾讯云的方法

各位开发者大家好,今天主要给大家分享一个,如何使用linux系统链接腾讯云的方法,因为微信小程序越来越普遍,链接腾讯云也是日常必须掌握的一个技能。 第一:【实验目的】 1、linux 系统连接腾讯云的方法 第二:【实验原理】 涉及到原理图添加原理图 2、linux开发板 …