当前位置: 首页 > news >正文

C语言——文件操作

文章目录

    • 0. 思维导图
    • 1. 为什么使用文件
    • 2. 什么是文件
      • 2.1 程序文件
      • 2.2 数据文件
      • 2.3 文件名
    • 3. 文件的打开和关闭
      • 3.1 文件指针
      • 3.2 文件的打开和关闭
    • 4. 文件的顺序读写
      • 4.1 字符/字符串写入(出)
      • 4.2 格式化写入(出)
      • 4.3 二进制输入(出)
    • 5. 文件的随机读写
      • 5.1 fseek
      • 5.2 ftell
      • 5.3 rewind
    • 6. 文本文件和二进制文件
    • 7. 文件读取结束的判定
      • 7.1 被错误使用的feof
    • 8. 文件缓冲区

0. 思维导图

在这里插入图片描述

1. 为什么使用文件

相信大多数的小伙伴,都写过一个名为“学生信息管理系统”的小程序,万年不变的增删改查操作。可是,我们有没有想过,我们写的这个小程序, 运行起来的时候可以增删改查数据,此时数据是存放在内存当中,可当程序退出的时候,数据就还给操作系统了,等下次运行的时候,数据又得重新录入。
那如何才能将数据持久化呢?我们一般的方法就是把数据放入硬盘(文件、数据库)。

使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。

2. 什么是文件

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

2.1 程序文件

C语言为例:
包括源程序文件(后缀为 .c )、目标文件(windows环境后缀为 .obj)、可执行程序(windows环境后缀为 .exe)。
在这里插入图片描述

2.2 数据文件

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

本篇文章重点讲解的就是数据文件
学生信息管理系统所处理的数据输入输出就是以终端为对象

即从终端的键盘输入数据,运行结果显示到显示器上
scanf – 输入
printf – 输出

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

2.3 文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。
文件名包含3部分:文件路径 + 文件主干名 + 文件后缀

例如:c:\code\test.txt
在这里插入图片描述

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

3. 文件的打开和关闭

3.1 文件指针

缓冲文件系统中,关键的概念是 “文件类型指针”,简称 “文件指针”
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE
在这里插入图片描述
每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构变量,并填充其中的信息。
一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。
我们可以创建一个FILE*的指针变量:

	FILE* pf;//文件指针变量

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

3.2 文件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件

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

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

代码示例:

int main()
{//E:\\Code\\test.txt  绝对路径FILE* pf = fopen("E:\\Code\\test.txt","r");if (pf == NULL){perror("fopen fail");return 1;}//读文件//...//关闭文件fclose(pf);pf = NULL;return 0;
}

4. 文件的顺序读写

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

4.1 字符/字符串写入(出)

fputc函数示例(字符输入):
在这里插入图片描述
fgetc函数示例(字符输出):
请添加图片描述
fputs函数示例(文本行输入):
请添加图片描述
fgets函数示例(文本行输出):
请添加图片描述

  • 小贴士:
  • fputcfputs区别:
    这里区分cs就是,c理解为char,单个字符,s则是字符串
    fputc一次写入一个字符,fputs一次写入一个字符串。
  • fgetcfgets区别:
    与上面同理,但这里需要注意的是,fgets是会补上 \0,且一次只读取一行的数据。

4.2 格式化写入(出)

fprintf函数示例:
请添加图片描述
fscanf函数示例:
请添加图片描述
这里的fprintffscanf与之前所使用的printfscanf有什么区别呢?
在这里插入图片描述
通过参数对比发现,fprintffscanf多了一个文件指针的参数,那么在格式化写入(出)使用的时候,前面多添加一个参数即可,但是fprintffscanf是针对所以输入(出)流的格式化函数。

scanf - 从键盘上读取格式化的数据 stdio流
printf - 把数据写到(输出)屏幕上 stdout流
fscanf - 针对于所以输入流的格式化的输入函数:stdin流、打开的文件
fprintf - 针对于所以输出流的格式化的输出函数:stdout流、打开的文件

另外有还一点,我们通常理解的输入就是scanf输入,printf输出,可是为什么在文件操作的时候,确相反了呢?
在这里插入图片描述

4.3 二进制输入(出)

二进制写入示例:
请添加图片描述
当然了, .tex文件中并不是乱码,而是以二进制形式写入,我们当然无法识别,但机器还是能识别的。
二进制读示例:
请添加图片描述

5. 文件的随机读写

5.1 fseek

根据文件指针的位置和偏移量来定位文件指针。
fseek参数及返回类型:
int fseek ( FILE * stream, long int offset, int origin );

代码示例:

int main()
{//假设文本里是abcdFILE* pf = fopen("E:\\Code\\test.txt", "r");if (pf == NULL){perror("fopen fail");}else{int ch = fgetc(pf);printf("%c\n", ch);//ach = fgetc(pf);printf("%c\n", ch);//bch = fgetc(pf);printf("%c\n", ch);//c//如果继续往下读,那必然会读到d//通过fseek函数调整,读取b//fseek(pf, -2, SEEK_CUR);fseek(pf, 1, SEEK_SET);ch = fgetc(pf);printf("%c\n", ch);//b}return 0;
}

5.2 ftell

在随机调整的时候,我们无法精准的确定这个相对起始位置的偏移量,那么ftell函数就能计算文件指针相对起始位置的偏移量。

返回文件指针相对于起始位置的偏移量
ftell参数及其返回类型:
long int ftell ( FILE * stream );

代码示例:

		//延续上面的代码int ch = fgetc(pf);printf("%c\n", ch);//ach = fgetc(pf);printf("%c\n", ch);//bch = fgetc(pf);printf("%c\n", ch);//c//如果继续往下读,那必然会读到d//通过fseek函数调整,读取b//fseek(pf, -2, SEEK_CUR);fseek(pf, 1, SEEK_SET);ch = fgetc(pf);printf("%c\n", ch);//b//找到相对起始位置偏移量printf("%d\n", ftell(pf));

5.3 rewind

让文件指针的位置回到文件的起始位置
rewind参数及返回类型:
void rewind ( FILE * stream );

代码示例:

int main()
{FILE* pf = fopen("E:\\Code\\test.txt", "r");if (pf == NULL){perror("fopen fail");}else{int ch = fgetc(pf);printf("%c\n", ch);//ach = fgetc(pf);printf("%c\n", ch);//bch = fgetc(pf);printf("%c\n", ch);//c//如果继续往下读,那必然会读到d//通过fseek函数调整,读取b//fseek(pf, -2, SEEK_CUR);fseek(pf, 1, SEEK_SET);ch = fgetc(pf);printf("%c\n", ch);//b//找到相对起始位置偏移量printf("%d\n", ftell(pf));//返回起始位置rewind(pf);ch = fgetc(pf);//aprintf("%c\n", ch);}return 0;
}

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

根据数据的组织形式,数据文件被称为文本文件或者二进制文件
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件
一个数据在内存中是怎么存储的呢?
字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节。
在这里插入图片描述
代码示例:

int main()
{int a = 10000;FILE* pf = fopen("E:\\Code\\test.txt", "wb");fwrite(&a, 4, 1, pf);//二进制的形式写到文件中fclose(pf);pf = NULL;return 0;
}

请添加图片描述
这里文本里的信息我们看不懂,但是我们可以通过编译器进行翻译查看
在这里插入图片描述

7. 文件读取结束的判定

7.1 被错误使用的feof

牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。
而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束

  1. 文本文件读取是否结束,判断返回值是否为EOF( fgetc ),或者 NULL( fgets )
    例如:
    fgetc判断是否为EOF
    fgets判断返回值是否为NULL
  2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
    例如:
    fread判断返回值是否小于实际要读的个数.

文本文件示例:

int main()
{int c; // 注意:int,非char,要求处理EOFFILE* fp = fopen("test.txt", "r");if (!fp) {perror("File opening failed");return EXIT_FAILURE;}//fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOFwhile ((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);
}

首先文件读取结束了
结束后想知晓原因:
feof:返回真,说明文件正常读取遇到了结束标志而结束;
ferror:返回真,说明文件在读取过程中出错而导致结束。

8. 文件缓冲区

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

#include <stdio.h>
#include <windows.h>
//VS2022 WIN11环境测试
int main()
{FILE* pf = fopen("E:\\Code\\test.txt", "w");fputs("abcdef", pf);//先将代码放在输出缓冲区printf("睡眠5秒-已经写数据了,打开test.txt文件,发现文件没有内容\n");Sleep(5000);//5秒printf("刷新缓冲区\n");fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到文件(磁盘)//注:fflush 在高版本的VS上不能使用了printf("再睡眠5秒-此时,再次打开test.txt文件,文件有内容了\n");Sleep(10000);fclose(pf);//注:fclose在关闭文件的时候,也会刷新缓冲区pf = NULL;return 0;
}

请添加图片描述
这里可以得出一个结论:
因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件;如果不做,可能导致读写文件的问题。

相关文章:

C语言——文件操作

文章目录0. 思维导图1. 为什么使用文件2. 什么是文件2.1 程序文件2.2 数据文件2.3 文件名3. 文件的打开和关闭3.1 文件指针3.2 文件的打开和关闭4. 文件的顺序读写4.1 字符/字符串写入&#xff08;出&#xff09;4.2 格式化写入&#xff08;出&#xff09;4.3 二进制输入&#…...

使用aim7测试内核性能变化

aim7是一个功能强大的性能测试套件&#xff0c;可以用来测试内核的性能变化情况&#xff0c;尤其是在修改内核源码后&#xff0c;用来测试补丁对内核性能的影响情况。aim7测试结果中有一个重要的统计项&#xff1a;jobs/min&#xff0c;即每分钟完成的任务数量&#xff0c;可以…...

C++——内存管理

一&#xff0c;为什么要有内存管理因为在C/C中各个内置类型或者是自定义类型的大小都不一样&#xff0c;而如何让各个类型在内存中合理分布就非常有必要&#xff0c;由此我们就需要有内存管理。我们来看看下面这个程序中的各个变量都是如何分布的int globalVar 1; static int …...

AOP的另类用法 (权限校验自定义注解)

&#x1f473;我亲爱的各位大佬们好&#x1f618;&#x1f618;&#x1f618; ♨️本篇文章记录的为 AOP的另类用法 (权限校验&&自定义注解) 相关内容&#xff0c;适合在学Java的小白,帮助新手快速上手,也适合复习中&#xff0c;面试中的大佬&#x1f649;&#x1f649…...

[数据结构]:12-快速排序(顺序表指针实现形式)(C语言实现)

目录 前言 已完成内容 快速排序实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-PSeqListFunction.cpp 04-SortCommon.cpp 05-SortFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容&#xff0c;除其中使用到C引用外&#xff0c;全为C语言代…...

运算符——“Python”

各位CSDN的uu们你们好呀&#xff0c;好久没有更新Python文章了&#xff0c;今天&#xff0c;小雅兰的内容就是Python中的操作符啦&#xff0c;那么现在&#xff0c;就让我们进入Python的世界吧 注释 注释是什么 注释的语法 注释的规范 输入输出 和用户交互 通过控制台输出 通…...

2022 IoTDB Summit:华为王超《Apache IoTDB 在华为云的实践》

12 月 3 日、4日&#xff0c;2022 Apache IoTDB 物联网生态大会在线上圆满落幕。大会上发布 Apache IoTDB 的分布式 1.0 版本&#xff0c;并分享 Apache IoTDB 实现的数据管理技术与物联网场景实践案例&#xff0c;深入探讨了 Apache IoTDB 与物联网企业如何共建活跃生态&#…...

C 语言网络编程 — PF_NETLINK sockets

目录 文章目录目录PF_NETLINK socketsPF_NETLINK sockets Linux 提供了 4 种 User Process 和 Kernel 之间进行通信的 IPC&#xff08;Inter-Process Communicate&#xff0c;进程间通信&#xff09;方式&#xff1a; /procioctlsysfsPF_NETLINK sockets&#xff08;Netlink …...

广州银行冲刺A股上市:不良贷款规模突破100亿元,不良率飙升

又一家城商行平移申报IPO。近日&#xff0c;广州银行股份有限公司&#xff08;下称“广州银行”&#xff09;递交招股书&#xff0c;准备在深圳证券交易所主板上市。本次冲刺上市&#xff0c;广州银行计划募资约94.79亿元&#xff0c;国泰君安证券为其保荐机构。 截至目前&…...

【C++】bsearch函数的使用及二分法查找介绍

写程序的时候&#xff0c;肯定避免不了需要从集合中找到符合条件的元素&#xff0c;一般情况下&#xff0c;最简单也最常用的就是循环遍历元素&#xff0c;这种方法虽然写的简单&#xff0c;但是小数据量还行&#xff0c;但是数据过大的话&#xff0c;这样效率就低了。循环的时…...

分布式系统中的补偿机制设计问题

我们知道&#xff0c;应用系统在分布式的情况下&#xff0c;在通信时会有着一个显著的问题&#xff0c;即一个业务流程往往需要组合一组服务&#xff0c;且单单一次通信可能会经过 DNS 服务&#xff0c;网卡、交换机、路由器、负载均衡等设备&#xff0c;而这些服务于设备都不一…...

类成员的方法

初识对象 生活中或是程序中&#xff0c;我们都可以使用设计表格、生产表格、填写表格的形式组织数据进行对比&#xff0c;在程序中&#xff1a; 设计表格&#xff0c;称之为&#xff1a;设计类&#xff08;class&#xff09; 打印表格&#xff0c;称之为&#xff1a;创建对象 …...

华为OD机试真题Python实现【端口合并】真题+解题思路+代码(20222023)

端口合并 题目 有M(1<=M<=10)个端口组, 每个端口组是长度为N(1<=N<=100)的整数数组, 如果端口组间存在 2 个及以上不同端口相同, 则认为这 2 个端口组互相关联,可以合并 第一行输入端口组个数 M,再输入 M 行,每行逗号分隔,代表端口组。 输出合并后的端口组…...

自考本科计算机网络原理(04741)历年大题真题【18年10月-22年10月】

文章目录一、简答题&#xff08;历年真题&#xff09;18年10月-22年10月历年简答题出题情况分析2018年10月2019年4月2019年10月2020年8月2020年10月2021年4月2021年10月2022年4月2022年10月二、综合题&#xff08;历年真题&#xff09;2018年10月2019年4月2019年10月2020年8月2…...

计算机SCI期刊投稿,除了投稿信,还要做什么准备? - 易智编译EaseEditing

投稿信的准备 期刊的编辑往往需要一些有关作者及其论文的信息。 而作者也希望给编辑提供一些有助于其全文送审及决策的信息。 这些信息都应该包括在投稿信中。 投稿信应包括以下几方面的内容&#xff1a; 文题和所有作者的姓名;稿件适宜的栏目; 为什么此论文适合于在该刊而…...

Allegro如何刷新封装和库里的封装同步操作指导

Allegro如何刷新封装和库里的封装同步操作指导 在做PCB设计的过程中,有时会因为库里的封装有更新,所以PCB上使用到了这个封装时候需要和库里的同步,如下图 如何刷新,具体操作如下 点击Place点击Update Symbols...

基于Vue3手写选课组件(含时区切换,拖拽选择)

环境说明 基于vue3vite 无关联别的ui框架&#xff0c;组件化 初次使用vue3&#xff0c;技术菜&#xff0c;大佬勿喷 main.ts "moment": "^2.29.4","moment-timezone": "^0.5.41",import moment from moment; import momentTz from &…...

准备好了吗?加入 GDE 成长计划,成为下一位谷歌开发者专家!

谷歌开发者专家 (Google Developer Experts&#xff0c;GDE)&#xff0c;又称谷歌开发者专家项目&#xff0c;是由一群经验丰富的技术专家、具有社交影响力的开发者和思想领袖组成的全球性社区。通过在各项活动演讲以及各个平台上发布优质内容来积极助力开发者、企业和技术社区…...

搭建帮助中心的 8 个最佳工具

网站帮助中心的作用通过向客户表明您了解他们所面临的问题以及如何提供帮助来建立信任&#xff1b;通过回答常见问题来改善客户服务&#xff0c;增强专业的品牌形象&#xff1b;通过减少重复发送给支持人员的电话和电子邮件&#xff0c;节省时间和金钱&#xff1b;增强您在搜索…...

LQB小板焊接V3版本的小板原理图,PCB图,注意事项和步骤

第一部分&#xff0c;这个部分&#xff0c;可以不焊接&#xff0c;直接用买的下载器进行下载代码&#xff0c;外接一个下载器&#xff0c;网上大概是10元左右&#xff0c;以后学习stm32的芯片的时候&#xff0c;这个下载器就是一个串口转换器&#xff0c;也可以使用。。 当然也…...

华为OD机试真题Python实现【翻转单词顺序】真题+解题思路+代码(20222023)

翻转单词顺序 题目 输入一个英文文章片段 翻转指定区间的单词顺序,标点符号和普通字母一样处理 例如输入字符串 I am a developer. 区间[0,3]则输出 developer. a am I 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Python)真题目录汇总 ## 输入 使用换行隔…...

微机原理和计算机组成原理复习

1&#xff1a;冯诺依曼机器的主要特点&#xff1f; 1&#xff09;计算机由运算器、存储器、控制器、输入设备和输出设备五大部分组成&#xff1b; 2&#xff09;指令和数据存储在存储器中&#xff0c;并可以按地址访问&#xff1b; 3&#xff09;指令和数据均以二进制表示&…...

mysql5.7.33安装配置教程【保姆级安装教程】

MySQL5.7.33安装教程 1、官方网站下载 点击这里跳转页面下载 1.1、看下你是什么系统&#xff0c;系统是64位还是32位 2、解压到D盘跟路径或者其下面纯英文路径 2.1、可见它没有data、log等文件夹&#xff0c;不需手动添加(下面执行命令自动初始化)&#xff01;&#xff01; …...

每天都和时间序列打交道,我总结了这篇文章!

Datawhale干货 作者&#xff1a;戳戳龍&#xff0c;上海交通大学&#xff0c;量化算法工程师前言&#x1f534; 平时工作中每天都在和时间序列打交道&#xff0c;对时间序列分析进行研究是有必要的&#x1f7e1; 分享和交流一些自己的在时序处理方面的心得&#xff0c;提供一…...

【Leetcode——重排链表】

文章目录一、重排链表思路1.思路2.总结一、重排链表 对于这道题&#xff0c;有两种思路&#xff1a; 思路1. 1.使用一个线性表&#xff0c;存储链表中的每个节点&#xff0c;然后按照题目的条件&#xff0c;来链接线性表的各个节点即可。 使用左下标和右下标来定位线性表中的…...

HCIP总结(一)

抽象语言---编码---二进制---电信号----处理电信号 &#xff08;电脑工作流程&#xff09; OSI参考模型 ----OSI/RM (核心思想&#xff1a;分层) 应用层----提供各种应用服务&#xff0c;将抽象语言转换成编码&#xff0c;提供人机交互的接口 表示层----将编码转换成二进制 …...

华为OD机试真题Python实现【黑板上色】真题+解题思路+代码(20222023)

题目 疫情过后希望小学终于又重新开学了,3 年 2 班开学第一天的任务是将后面的黑板报重新制作, 黑板上已经写上了N个正整数,同学们需要给这每个数分别上一种颜色, 为了让黑板报既美观又有学习意义,老师要求同种颜色的所有数都可以被这个颜色中最小的那个数整除, 现在帮小…...

C++中的利器——模板

前文本文主要是讲解一下C中的利器——模板&#xff0c;相信铁子们在学完这一节后&#xff0c;写代码会更加的得心应手&#xff0c;更加的顺畅。一&#xff0c;泛型编程想要学习模板&#xff0c;我们要先了解为什么需要模板&#xff0c;我们可以看看下面这个程序。int add(int&a…...

k8s控制器

目录 一、控制器简介 二、控制器类型 1、RC和RS 2、Deployment 3、DaemonSet 4、Job 5、CronJob 6、StateFulSet 7、HPA 一、控制器简介 在kubernetes中&#xff0c;按照Pod的创建方式可以将其分为两类&#xff1a; 自主式:kubernetes直接创建出来的Pod&#xff0c;…...

嵌入式学习笔记——认识STM32的 GPIO口

寄存器开发STM32GPIO口前言认识GPIOGPIO是什么GPIO有什么用GPIO怎么用STM32上GPIO的命名以及数量GPIO口的框图&#xff08;重点&#xff09;输入框图解析三种输入模式GPIO输入时内部器件及其作用1.保护二极管2.上下拉电阻&#xff08;可配置&#xff09;3.施密特触发器4.输入数…...

18末年年禁止观看网站/seo网站优化培训多少价格

地址 abs(x) 返回一个数的绝对值。实参可以是整数或浮点数。如果实参是一个复数&#xff0c;返回它的模。all(iterable) 如果 iterable 的所有元素为真&#xff08;或迭代器为空&#xff09;&#xff0c;返回 True 。def all(iterable):for element in iterable:if not ele…...

专业型网站网站/厦门百度竞价开户

周期分析struct结构体redis代码。最后&#xff0c;越多越发现很多的代码其实大同小异。于struct有袋1,2不分析文件&#xff0c;关于set集合的一些东西&#xff0c;就放在下次分析好了&#xff0c;在选择下个分析的对象时&#xff0c;我考虑了一下&#xff0c;最后决定先把简单的…...

做慕斯蛋糕那个网站有视频/北京互联网公司

动态变量和静态变量的区别&#xff1a; 1、存储位置动态变量&#xff1a;存储在内存出栈数据区静态变量&#xff1a;存储在全局数据区&#xff08;静态数据区&#xff09; 2、生命期动态变量&#xff1a;根据你定义的位置确定&#xff0c;比如你在一个函数中定义的&#xff0c;…...

网站百度收录秒收方法/手机免费建网站

看到有面试题里会有问到如何用css画出三角形 众所周知好多图形都可以拆分成三角形&#xff0c;所以说会了画三角形就可以画出很多有意思的形状 画出三角形的原理是调整border&#xff08;边框&#xff09;的四个方向的宽度&#xff0c;线条样式以及颜色。 如果你将宽度调的足够…...

做化妆品网站怎样/业务网站制作

大家好&#xff0c;我是为人造的智能操碎了心的智能禅师。全文大约1900字。读完可能需要下面这首歌的时间...

天津市建设银行租房网站/东莞关键词seo优化

〖Array王锐大神力作〗osg与PhysX结合系列内容——地形碰撞体“烘焙”物理碰撞体HeightField与TriangleMesh物理材质的概念与使用直接读取高度图数据与osg::HeightField结合使用Pvd调试环境构建测试场景并运行“烘焙”物理碰撞体 在上一篇文章中&#xff0c;我们介绍了多种不同…...