【Linux-基础IO】C语言文件接口回顾 系统文件概念及接口
目录
一、C语言文件接口回顾
C语言基础知识
C++中文件操作示例
二、系统文件概念及接口
重定向基本理解的回顾
文件的基本概念
系统调用接口
open
read
write
close
lseek
什么是当前路径
一、C语言文件接口回顾
引言:我们并不理解文件!从语言角度(绝对不可能理解)。我们要进行文件操作,前提是我们的程序跑起来了。文件的打开和关闭,是CPU在执行我们的代码
C语言基础知识
几个函数:
FILE *fopen(const char *path, const char *mode);`
fopen
是C语言标准库函数,用于打开一个文件并返回一个文件指针以便进行读写操作。如果文件打开成功,它会返回一个指向 FILE
类型的指针,该指针后续可以用于其他文件操作函数。如果打开失败,则返回 NULL
。
其中:
-
const char *path
:这是一个字符串,表示要打开的文件的路径名。可以是相对路径或绝对路径。 -
const char *mode
:这也是一个字符串,表示打开文件的模式,即如何使用文件
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
fread
函数是 C 标准库中的一个函数,用于从指定的流中读取数据到缓冲区中。该函数同样定义在 stdio.h
头文件中。fread
主要用于二进制输入操作。fread
函数返回成功读取的元素个数,这个数可能小于 nmemb
,如果遇到错误或文件末尾。如果文件末尾在读取任何字节之前到达,fread
将返回 0。
其中:
-
ptr
:指向内存块的指针,该内存块至少要有size * nmemb
字节的大小。函数从流中读取数据到这个内存块中。 -
size
:要读取的每个元素的大小,以字节为单位。 -
nmemb
:要读取的元素个数,每个元素的大小为size
字节。 -
stream
:指向FILE
对象的指针,该对象指定了输入流。
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
fwrite
函数是 C 标准库中的一个函数,用于将数据写入到指定的流中。这个函数也是定义在 stdio.h
头文件中。fwrite
主要用于执行二进制输出操作。fwrite
函数返回成功写入的元素个数,这个数可能小于 nmemb
,如果遇到写入错误。如果成功写入 nmemb
个元素,则返回值等于 nmemb
。
其中:
-
ptr
:指向要写入数据的内存块的指针。 -
size
:要写入的每个元素的大小,以字节为单位。 -
nmemb
:要写入的元素个数,每个元素的大小为size
字节。 -
stream
:指向FILE
对象的指针,该对象指定了输出流
int fprintf(FILE *stream, const char *format, ...);
fprintf
是 C 标准库中的一个函数,用于将格式化的数据写入到指定的流(通常是文件流)。这个函数与 printf
类似,但是 fprintf
允许你指定写入数据的流,而 printf
默认写入到标准输出(通常是控制台)。如果成功,fprintf
返回写入的字符数。如果发生错误,fprintf
返回一个负数。
其中
-
stream
:指向FILE
对象的指针,该对象标识了要写入数据的流。 -
format
:指向一个以空字符结尾的字符串,该字符串包含格式规范,用于指定如何写入后续参数。 -
...
:可变数量的参数,它们将被格式化并写入到流中。
int fclose(FILE *stream);
fclose
是 C 标准库中的一个函数,用于关闭由 fopen
、freopen
或其他文件打开函数创建的文件流。关闭文件是非常重要的,因为它会释放与文件流关联的所有内部缓冲区,并且确保所有写入的数据都已经被正确地刷新到磁盘上。
其中:
-
如果文件成功关闭,
fclose
返回0
。 -
如果在关闭文件时发生错误,
fclose
返回EOF
(通常定义为-1
)。
文件打开方式:
几个例子:
【示例1】
int main()
{FILE* fp = fopen("log.txt","w");if(fp == NULL){perror("fopen");return 1;}fprintf(fp, "helloworld, %d, %s, %lf\n", 10, "wuxu", 3.14);fclose(fp);return 0;
}
执行结果:
[wuxu@Nanyi lesson18]$ ls
makefile mytest test1.c
[wuxu@Nanyi lesson18]$ ./mytest
[wuxu@Nanyi lesson18]$ ls
log.txt makefile mytest test1.c
[wuxu@Nanyi lesson18]$ cat log.t
可以发现,我们以写的方式打开log.txt,我们原先并没有log.txt,是“w”的方式,创建了一个log.txt 并向内格式化写入内容
如果我们修改一下 main函数里的格式化输出,再进行执行
将代码修改为
fprintf(fp, "helloworld, %d, %s, %d\n", 10, "wuxu", 666);
可以发现:原文件内容被内容完全替代,因此我们对于“w”有个结论
-
如果文件不存在,就在当前路径下,新建指定的文件
-
默认打开文件的时候,就会先把目标文件清空
如果我们想追加对文件进行写入就需要讲模式换为“a”模式
C++中文件操作示例
#include <iostream>
#include <string>
#include <fstream>#define FILENAME "log.txt"int main()
{std::ofstream out(FILENAME);if(!out.is_open()) return 1;std::string message = "hello C++\n";out.write(message.c_str(), message.size());out.close();return 0;
}
二、系统文件概念及接口
重定向基本理解的回顾
我们第一次理解重定向是在 echo
命令上理解的,echo 命令本身是向显示器进行输出
[wuxu@Nanyi lesson18]$ echo "hello I am echo"
hello I am echo
我们也可以使用echo命令,向指定文件进行写入
我们也可以使用echo命令,向文件进行追加写入,也就是追加重定向
那么我们也就发现 >
相当于 "w"
, >>
相当于 “a“
,如果是的话,我们也可以使用 > 或 >> 进行创建文件
所以我们也就发现:输出重定向一定是文件操作
文件的基本概念
当我们使用ls-l
查看文件信息时,会显示文件的类型、权限、引用计数、所有者、所属组、大小、文件最新修改时间等信息,这些都是文件的属性
由此我们可以知道:文件 = 内容+属性
文件被打开,需要先被加载到内存。由于内存空间有限,不可能将所有的文件全部打开,所以文件可以分为已被打开文件,和未打开文件。
打开文件:本质是进程打开文件。文件没有打开的时候,文件在磁盘中;
一个进程可以打开很多文件,一个系统中可以存在很多进程;所以很多情况下,在操作系统内部,一定存在大量被打开的文件,那么操作系统是如何对这些文件进行管理呢?--->**先描述,在组织
系统调用接口
文件是存在磁盘中的,由冯诺伊曼体系我们可知,磁盘是一个外设,外设是一个硬件。我们向文件中写入,本质是向硬件中写入;但是用户没有权利直接写入,由于操作系统是硬件的管理着,那我们就可以通过操作系统给我们提供的系统调用(OS不相信任何人)来访问文件
下面是系统调用接口的函数,我们来一一介绍使用,看看与C/C++文件操作有什么共同点与不同点
open
其中:
-
pathname
:指向一个以空字符结尾的字符串,该字符串指定了要打开或创建的文件的路径名。 -
flags
:指定文件的打开模式。这个参数是以下选项中的一个或多个通过按位或操作(|
)组合起来的值:-
O_RDONLY
: 只读打开。 -
O_WRONLY
: 只写打开。 -
O_RDWR
: 读写打开。 -
O_CREAT
: 如果文件不存在,则创建它。需要与mode
参数一起使用。 -
O_EXCL
: 与O_CREAT
一起使用,确保调用open
时创建文件。如果文件已存在,则返回错误。 -
O_TRUNC
: 如果文件已存在且为写入或读写打开,则将其长度截断为 0。 -
O_APPEND
: 追加模式。在每次写入时,数据会被添加到文件的末尾。 -
其他标志请参考
open
的手册页。
-
-
mode
:当创建新文件时,这个参数指定了文件的模式(权限)。它是一个八进制数,通常由umask
的值与要求的权限按位取反后相与得到。常见的权限值包括:-
S_IRUSR
: 用户读权限。 -
S_IWUSR
: 用户写权限。 -
S_IXUSR
: 用户执行权限。 -
S_IRGRP
,S_IWGRP
,S_IXGRP
: 分别对应组成员的读、写、执行权限。 -
S_IROTH
,S_IWOTH
,S_IXOTH
: 分别对应其他用户的读、写、执行权限。 -
也可以使用数字来表示权限
-
返回值:
-
成功时,
open
返回一个最小的非负整数,称为文件描述符,用于后续的读写操作。 -
出错时,
open
返回-1
,并设置errno
来指示错误。
flag选项 | 描述 |
---|---|
O_RDONLY | 只读 |
O_WRONLY | 只写 |
O_CREAT | 不存在就创建 |
O_TRUNC | 清空文件 |
O_APPEND | 追加写入 |
这些选项都是大写,我们在C/C++中什么情况下用上大写?没错就是宏,这里的flag选项与宏并未区别,我们先自己用宏来创建一个传参示例
测试内容:
#include <stdio.h>
#define ONE 1 // 1 0000 0001
#define TWO (1<<1) // 2 0000 0010
#define THREE (1<<2) // 4 0000 0100
#define FOUR (1<<3) // 8 0000 1000void print(int flag)
{if(flag&ONE)printf("one\n"); //替换成其他功能if(flag&TWO)printf("two\n");if(flag&THREE)printf("three\n");if(flag&FOUR)printf("four\n");
}int main()
{print(ONE);printf("\n");print(TWO);printf("\n");print(ONE|TWO);printf("\n");print(ONE|TWO|THREE);printf("\n");print(ONE|FOUR);printf("\n");print(ONE|TWO|THREE|FOUR);printf("\n");return 0;
}
输出结果:
因此我们发现可以定制宏,通过传入不同的宏,实现定制的不同功能。它的原理底层是位图;一个int类型包含32个比特位,如果我们让低位的 1 表示ONE,次低位的 1 表示 TWO......
若此时要实现ONE、TWO、THREE,只需要对这三个数做或位运算ONE|TWO|THREE
则会得到一个值为00000000 00000000 00000000 00011010的flags。将它传递给处理函数中,处理函数会将flag与ONE、TWO、THREE这三个数挨个做按位与,如果按位与出来的结果不为0,则表示该选项会被选择
而我们系统调用的flags也是一样的道理
接下来让我们用系统调用接口来操作文件
【示例】
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main(){//system callint fda = open("loga.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);printf("fda: %d\n", fda);int fdb = open("logb.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);printf("fdb: %d\n", fdb);int fdc = open("logc.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);printf("fdc: %d\n", fdc);int fdd = open("logd.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);printf("fdd: %d\n", fdd);return 0;
}
输出结果:
【问题1】我们定制的权限是666 ,为什么这里是 662?是umask的原因
PS:我们使用系统接口必须要指明权限,否则创建的文件权限是随机的
在 POSIX 兼容的操作系统中,umask
是一个系统调用,用于设置进程的文件模式创建掩码(file mode creation mask)。这个掩码定义了新创建文件的默认权限,通过从权限掩码中“掩蔽”掉一些权限位来限制新文件的权限。我们来查看一下系统的umask
接下来我们修改一下umask,看文件权限能不能达到我们想要的结果
在test2.c 加入umask(0)
即可
测试结果:
【问题2】open系统调用函数返回的数字是什么?这个输出结果有什么含义?
open打开文件后会返回一个数字,这个数字被称为文件描述符,我们一会在下文详细讲解
read
要从某个文件中读取内容时,第一个参数需要传入该文件的文件描述符,第二个参数需要传入接收文件内容的缓冲区首地址,第三个参数表示要从文件中读取多少字节的内容。
下面程序模拟实现了C语言fopen的r(只读)打开模式
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main()
{int fd = open("./log.txt", O_RDONLY);char buffer[1024];read(fd, buffer, sizeof(buffer));printf("%s", buffer);return 0;
}
write
write
是 POSIX 系统调用之一,用于将数据写入文件描述符指向的文件或设备。这个函数在 C 语言中被广泛使用,尤其是在 UNIX、Linux 和其他 POSIX 兼容的操作系统中。
参数:
-
fd
:要写入数据的文件描述符。这个文件描述符可以是open
系统调用返回的,也可以是标准输入输出错误文件描述符(例如STDOUT_FILENO
或STDERR_FILENO
)。 -
buf
:指向要写入数据的缓冲区的指针。 -
count
:要写入的字节数。
返回值:
-
成功时,
write
返回实际写入的字节数。 -
出错时,
write
返回-1
,并设置errno
来指示错误。
下面程序模拟实现C语言fopen的w(只读)模式打开
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main()
{int fd = open("./log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);char* msg = "Have a good day!\n";write(fd, msg, strlen(msg));return 0;
}
下面程序模拟实现C语言fopen的a(追加)模式打开
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main()
{int fd = open("./log.txt", O_WRONLY | O_CREAT | O_APPEND, 0666);char* msg = "Have a good day!\n";write(fd, msg, strlen(msg));return 0;
}
close
传入文件描述符即可关闭对应文件,这里就不掩饰了
lseek
lseek
是 POSIX 系统调用之一,用于设置文件描述符 fd
指向的文件的偏移量。这个函数允许你查询或修改文件流的当前位置,这对于随机访问文件非常有用。
参数:
-
fd
:文件描述符,指向已经打开的文件。 -
offset
:偏移量,根据whence
的值,这个偏移量可以是绝对值,也可以是相对值。 -
whence
:用于确定如何解释offset
的值。它可以是以下三个常量之一:-
SEEK_SET
: 将偏移量设置为从文件开头算起的绝对位置。 -
SEEK_CUR
: 将偏移量设置为相对于当前文件位置的相对位置。 -
SEEK_END
: 将偏移量设置为相对于文件末尾的相对位置。
-
返回值:
-
成功时,
lseek
返回新的文件偏移量。 -
出错时,
lseek
返回-1
,并设置errno
来指示错误。
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main()
{int fd = open("./log.txt", O_RDONLY | O_APPEND, 0666);char buffer[1024];read(fd, buffer, sizeof(buffer));printf("%s", buffer);//回到文件头再读一遍lseek(fd, 0, SEEK_SET);read(fd, buffer, sizeof(buffer));printf("%s", buffer);close(fd);return 0;
}
什么是当前路径
当我们没有指明文件路径,open一个文件时,则open将在当前路径下创建文件那为什么会这个样子呢?
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main()
{int fd = open("log.txt", O_CREAT);close(fd);sleep(200);return 0;
}
当程序运行起来后,我们可以使用ps ajx | head -1 && ps ajx | grep mytest | grep -v grep
查看运行该程序的进程pid,进入/proc/进程pid
目录,可以看到两个链接文件cwd和exe。其中,cwd是程序的工作路径,也就是我们常说的当前路径,而exe是可执行程序的保存位置。
相关文章:

【Linux-基础IO】C语言文件接口回顾 系统文件概念及接口
目录 一、C语言文件接口回顾 C语言基础知识 C中文件操作示例 二、系统文件概念及接口 重定向基本理解的回顾 文件的基本概念 系统调用接口 open read write close lseek 什么是当前路径 一、C语言文件接口回顾 引言:我们并不理解文件!从语…...

系统架构笔记-3-信息系统基础知识
知识要点 结构化方法:结构是指系统内各个组成要素之间的相互联系、相互作用的框架。结构化方法也称为生命周期法,是一种传统的信息系统开发方法,由结构化分析、结构化设计、结构化程序设计三部分有机组合而成,精髓是自顶向下、逐…...
Linux下编程实现网络传送文件
本程序是在Linux下开发的,使用的是C语言,再结合Socket进行编程,分为客户端和服务器两个程序,即采用的是C/S架构,相应的源代码如下: 服务器端: #include <stdio.h> //#include <stdlib.h> #include <sys/socket.h> #include <netinet/in.h&g…...

【速成Redis】04 Redis 概念扫盲:事务、持久化、主从复制、哨兵模式
前言: 前三篇如下: 【速成Redis】01 Redis简介及windows上如何安装redis-CSDN博客 【速成Redis】02 Redis 五大基本数据类型常用命令-CSDN博客 【速成Redis】03 Redis 五大高级数据结构介绍及其常用命令 | 消息队列、地理空间、HyperLogLog、BitMap、…...

SQL Server 2022的数据类型
新书速览|SQL Server 2022从入门到精通:视频教学超值版_sql server 2022 出版社-CSDN博客 《SQL Server 2022从入门到精通(视频教学超值版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) 数据类…...

Linux基础3-基础工具4(git),冯诺依曼计算机体系结构
上篇文章:Linux基础3-基础工具3(make,makefile,gdb详解)-CSDN博客 本章重点: 1. git简易使用 2. 冯诺依曼计算机体系结构介绍 目录 一. git使用 1.1 什么是git? 1.2 git发展史 1.3 git创建仓库 1.4 git命令操作 二. 冯诺依…...

后台数据管理系统 - 项目架构设计-Vue3+axios+Element-plus(0916)
接口文档: https://apifox.com/apidoc/shared-26c67aee-0233-4d23-aab7-08448fdf95ff/api-93850835 接口根路径: http://big-event-vue-api-t.itheima.net 本项目的技术栈 本项目技术栈基于 ES6、vue3、pinia、vue-router 、vite 、axios 和 element-plus http:/…...

MySQL基础篇(黑马程序员2022-01-18)
1 MySQL数据库概述 1.1 MySQL数据库的下载,安装,启动停止 1.2 数据模型 (1)关系型数据库(RDBMS) 概念:建立在关系模型基础上,由多张相互连接的二维表组成的数据库。 特点: A. 使用表存储数据,格式统一,便于维护。…...

nodejs 013:Prect 样式复用(multiple classes)例子
Prect 简单示例 Prect 为使用相同的现代 API 的快速 3kB React 替代方案。代码形式与 React 基本相同。部分语法区别可见 prect-differences-to-react。以下是一个 Prect 简单示例。 Button目录Button.css: .this {display: inline-block;padding: 3px 8px;margi…...

MQ入门(一):同步调用和异步调用--RabbitMQ基础入门
目录 1.初识MQ 1.1.同步调用 1.2.异步调用 1.3.技术选型 2.RabbitMQ 2.1.安装部署 2.2.RabbitMQ基本架构 2.3.收发消息 2.3.1.交换机 2.3.2.队列 2.3.3.绑定关系 2.3.4.发送消息 2.4.数据隔离 2.4.1.用户管理 2.4.2.virtual host 1.初识MQ 微服务一旦拆分&…...

由于安全风险,安全领导者考虑禁止人工智能编码
安全团队与开发团队之间的紧张关系 83% 的安全领导者表示,他们的开发人员目前使用人工智能来生成代码,57% 的人表示这已成为一种常见做法。 然而,72% 的人认为他们别无选择,只能允许开发人员使用人工智能来保持竞争力࿰…...
地图相关的系统软件及插件
1 ArcGis ArcGis For Javascript中文网站 首页 | ArcGis中文网 ArcGis For Javascript英文网站 ArcGIS是一款由Esri公司开发的地理信息系统软件,它提供了丰富的地图数据和分析工具,可以帮助用户进行各种空间分析和决策。 2 leaflet leaflet中文网站…...
Elasticsearch如何排序,分页以及高亮查询
目录 一、排序 二、分页查询 三、高亮查询 一、排序 ES中默认使用相关度分数实现排序,可以通过搜索语法定制化排序。 GET /索引/_search { "query": 搜索条件,"sort": [{"字段1":{"order":"asc"} },{ "字…...

Transformer预测 | 基于Transformer心率时间序列预测(tensorflow)
效果一览 基本介绍 Transformer预测 | 基于Transformer心率时间序列预测(tensorflow) 程序设计 import pandas as pd from pandas.plotting import lag_plot from statsmodels.graphics...

科研绘图系列:R语言误差连线图(errobar linechart)
文章目录 介绍加载R包导入数据数据预处理画图系统信息介绍 误差连线图是一种在数据可视化中常用的图表,它通过在数据点处添加线段(误差线)来表示数据的变异性或不确定性。这些误差线可以基于不同的统计度量,如标准差(Standard Deviation)、标准误差(Standard Error)或…...

智能BI项目第五期
本期主要内容 系统问题分析异步化业务流程分析线程池讲解(入门 原理 实战)系统异步化改造开发 1.系统问题分析 当系统面临大量用户请求时,我们后端的 AI 处理能力有限,例如服务器的内存、CPU、网络带宽等资源有限,…...

Android-UI设计
控件 控件是用户与应用交互的元素。常见的控件包括: 按钮 (Button):用于执行动作。文本框 (EditText):让用户输入文本。复选框 (CheckBox):允许用户选择或取消选择某个选项。单选按钮 (RadioButton):用于在多个选项中…...

docker desktop windows stop
服务docker改为启动 cmd下查看docker版本 {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": ["https://hub.atomgit.com/"]…...

Qt容器类控件——QGroupBox和QTabWidget
文章目录 QGroupBox又来点餐QTabWidget使用演示 QGroupBox 容器类控件即里面可以容纳其他的控件 QGroupBox叫做分组框,可以把其他控件放在里面作为一组 QGroupBox的存在,只是为了让界面更好看一点,并不实现实质性的功能。 当界面较复杂的时候…...

qt-creator-10.0.2之后版本的jom.exe构建和编译速度慢下来了
1、Qt的IDE一直在升级,qt-creator的新版本下载地址 https://download.qt.io/official_releases/qtcreator/ 2、本人一直用的是qt-creator-10.0.2版本,官网历史仓库可以下载安装包qt-creator-opensource-windows-x86_64-10.0.2.exe https://download.qt…...
# 从底层架构到应用实践:为何部分大模型在越狱攻击下失守?
从底层架构到应用实践:为何部分大模型在越狱攻击下失守? 引言 近期,我们对多个主流大语言模型(LLM)进行了安全性测试,使用了极具诱导性的越狱提示词,试图绕过其内容安全机制。测试结果显示&am…...

【多线程初阶】阻塞队列 生产者消费者模型
文章目录 一、阻塞队列二、生产者消费者模型(一)概念(二)生产者消费者的两个重要优势(阻塞队列的运用)1) 解耦合(不一定是两个线程之间,也可以是两个服务器之间)2) 削峰填谷 (三)生产者消费者模型付出的代价 三、标准库中的阻塞队列(一)观察模型的运行效果(二)观察阻塞效果1) 队…...
VBA清空数据
列数转字母 Function CNtoW(ByVal num As Long) As String CNtoW Replace(Cells(1, num).Address(False, False), "1", "") End Function 字母转列数 Function CWtoN(ByVal AB As String) As Long CWtoN Range("a1:" & AB & &…...
大数据学习(131)-Hive数据分析函数总结
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
11. vue pinia 和react redux、jotai对比
对比 Vue 的 Pinia,和 React 的 Redux、Jotai,分中英文简要介绍、特性、底层原理、使用场景。 简单介绍 1.1 Pinia(Vue) • 英文:Pinia is the official state management library for Vue 3, designed to be simple…...
从EDR到XDR:终端安全防御体系演进实践指南
在数字化浪潮中,企业的终端安全面临着前所未有的挑战。从早期单纯的病毒威胁,到如今复杂多变的高级持续性威胁(APT)、零日漏洞攻击等,安全形势日益严峻。为应对这些挑战,终端安全防御技术不断演进ÿ…...

高精度滚珠导轨在医疗设备中的多元应用场景
在医疗行业不断追求高效、精准与安全的今天,医疗设备的性能优化至关重要。每一个精密部件都像是设备这个庞大“生命体”中的细胞,共同维持着设备的稳定运行。滚珠导轨,这一看似不起眼却功能强大的传动元件,正悄然在医疗设备领域发…...
自定义事件wpf
// 自定义控件 public class MyCustomControl : Control { public static readonly RoutedEvent MyCustomEvent EventManager.RegisterRoutedEvent( "MyCustom", RoutingStrategy.Bubbling, typeof(RoutedEventHandler), typeof(MyCustomControl) ); public event R…...

轻松备份和恢复 Android 系统 | 4 种解决方案
我们通常会在 Android 手机上存储大量重要的个人数据,包括照片、视频、联系人、信息等等。如果您不想丢失宝贵的数据,可以备份 Android 数据。当您需要访问和使用这些数据时,可以将其恢复到 Android 设备。如果您想了解 Android 备份和恢复&a…...
前端面试准备-7
1.定义class的实现 //定义class class Person{//公有属性nameage 18//构造函数constructor(name){//构造函数内部的this实例化对象this.name name//动态添加属性(不推荐)this.food [🐂,🐎,🐏]}//公有方法sayHi(){c…...