文件操作详解(C语言)

1.为什么要用到文件?怎样数据才能持久化?

保存在内存中的数不安全(一次断电,忘记保存,不用了还给系统)

持久化:保存在硬盘上(放在文件中)

什么是文件?文件分为程序文件数据文件

程序文件是什么呢?

在windows环境下。.c源程序文件 / .obj目标文件 / .exe执行文件,这些就是程序文件

数据文件

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

如图:

编辑.c源程序文件(test.c)可以对A文件(数据文件)进行读写操作进行

2.文件名

一个文件有唯一的文件标识,以便于用户的识别和引用

文件名包含三部分:文件路径 + 文件主干名 + 文件后缀

例:  c:\code\heyerous\test.txt

3.文件的打开 or 关闭

->1. 文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称:文件指针

每个被使用的文件都在内存中开辟了一个相应的文件信息区用来存放文件的相关信息(如:文件的名字,文件的状态,文件当前的位置等)。这些信息是保存在一个结构体变量中的,该结构体类型是由系统声明的,取名:FILE

如图:

注:  每打开一个文件就会产生一个文件信息区,每一个文件信息区都需要一个文件指针来指向它。不同的C编译器的FILE类型包含的内容不完全相同,但大同小异

一般都是通过FILE的指针来维护这个FILE结构的变量,这样更方便

创建一个FILE指针的变量:

FILE* pf       //文件指针变量

->2. 文件的打开和关闭

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

ANSIC(标准C)规定使用fopen函数(打开成功放回文件地址,失败则返回NULL)来打开文件,fclose函数(打开成功返回0,打开失败返回EOF(-1))来关闭文件

fopen和fclose的使用示例:

#include <stdio.h>int main()
{//打开文件FILE* pf = fopen("C:\\code\\heyerous\\test.txt", "r");//判断文件是否打开成功if(pf == NULL){perror("fopen");return 1;}//读写文件//....//关闭文件fclose(pf);pf = NULL;
}

运行结果:

打开成功说明该路径存在这个文件

上面所示代码是用的绝对路径打开的文件 C:\code\heyerous\test.txt

绝对路径

文件的准确位置

相对路径

相对路径的理解,可以认为是程序和文件的相对位置,比如说和当前.c文件在同文件夹中,或者文件在.c文件的上级路径中 (以.c文件为例)

就可以看到该文本文件(test.txt)了

将文件放在上级目录程序依旧可以运行

除了这两个操作以外还其他的操作:

如:“../test.txt”  上级目录   “./text.txt”  当前目录  "././test,txt" 上一级目录的上一级目录

注:  创建文件的时候看看后缀名(扩展名)

4.怎么读写?

1.文件的顺序读写

fputc

->1.  fputc函数    //向文件中写一个字符

int fputc(int charactor, FILE* stream);

(1). FILE* stream 需要写入的文件的指针

(2). int charactor 需要向文件中写的字符

->2.  fputc函数的使用

puts按顺序向文件中写内容

#include <stdio.h>int main()
{//用"w"会将我们上次写入的内容全部覆盖掉FILE* pf = fopen("C:\\code\\heyerous\\test.txt", "w"); if (NULL == pf){perror("fopen");return 1;}//方法1/*fputc('z', pf);fputc('y', pf);fputc('x', pf);fputc('6', pf);*///方法2:使用for循环for (char ch = 'A'; ch <= 'Z'; ch++){fputc(ch, pf);}fclose(pf);pf = NULL;return 0;
}

运行结果:

向文件写一个字符,不是字符串!!!

fgetc

->1. fgetc函数    //向文件中读一个字符

int fgetc(FILE* stream);

(1). 按顺序向文件读字符

(2). FILE* stream   需要读文件的指针

->2. fgetc函数的使用

#include <stdio.h>int main()
{FILE* pf = fopen("C:\\code\\heyerous\\test.txt", "r"); if (NULL == pf){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;
}

运行结果:

fputs

->1. fputs函数   //向文件中写入一行内容

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

(1). const char *string  需要写入文件的内容

(2). FILE *stream 目标文件

->2. fputs函数的使用  

这里我们换用相对路径

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

运行结果:

fgets

->1. fgets函数 //向文件读一行内容

char *fgets( char *string, int n, FILE *stream );

(1). char *string  将读到的内容放到另一个空间中

(2). int n  个数限制

(3). FILE *stream 需要读的文件的指针

->2. fgets函数的使用

#include <stdio.h>
int main()
{FILE* pf = fopen("test.txt", "r");if (NULL == pf){perror("fopen");return 1;}char buf[25] = { 0 };fgets(buf, 12, pf);printf(buf);fclose(pf);pf = NULL;return 0;
}

运行结果:

注:  fgets读文件时会留一个空间存放\0,所以我们想要将hello world全部都读出来得限制12个个数(包括\0)

如果buf空间比文件中一行大,即:fgets只读一行的内容

1.buf > num, 直接读到末尾结束,第二行不管,只管第一行得内容

2.buf < num,只读num数量的字符

fprintf

->1. fprintf函数   //将格式化的内容写到文件中  

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

(1). FILE* stream  需要写入的文件的指针

(2). const char*format  数据流:格式化字符串等各种信息

(3). ...  可变参数列表可接收多个参数

->2. fprintf函数的使用

#include <stdio.h>typedef struct S
{char name[20];int age;float score;
}S;int main()
{FILE* pf = fopen("test.txt", "w");if(FILE == NULL){perror("fopen");reutrn 1;}s stu = {"zhangsan", 20, 89.5}; fprintf(pf, "%s %d %f", stu.name, stu.age, stu.score);fclose(pf);pf = NULL;return 0;
}

运行结果:

 fscanf

->1. fscanf函数   //将格式化的内容写到文件中  

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

(1). FILE* stream  需要写入的文件的指针

(2). const char*format  数据流:格式化字符串等各种信息

(3). ...  可变参数列表可接收多个参数

->2. fprintf函数的使用

#include <stdio.h>typedef struct S
{char name[20];int age;float score;
}S;int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}S stu = { 0 };fscanf(pf, "%s %d %f", stu.name, &(stu.age), &(stu.score));printf("%s %d %f", stu.name, stu.age, stu.score);fclose(pf);pf = NULL;return 0;
}

运行结果:


以上函数操作时写入文件都看得懂,因为是文本信息(适用于所有输入输出流)

我们将数据传给输出设备如果这些设备的读写的都不相同,程序要使用的话都需要了解,那对一个程序来说太复杂了,所以为了解决这个问题C语言引入了流(stream)

将数据输出到流上,然后通过流输出到设备上

任何一个C语言程序运行的时候:默认打开3个流

1.stdin - 标准输出(键盘)

2.stdout - 标准输出(屏幕)

3.stderr - 标准错误(屏幕)

这三个流的类型都是FILE*

例1:

int ch = fgets(stdin)
fputc(ch, stdout)

从键盘上读一个字符然后写到屏幕上

例2:

#include <stdio.h>typedef struct stu
{char name[20];int age;float score;
}stu;int main()
{stu p = { 0 };fscanf(stdin, "%s %d %f", p.name, &(p.age), &(p.score));fprintf(stdout, "%s %d %f", p.name, p.age, p.score);return 0;
}

运行结果:

fwrite

->1. fwrite函数  //以二进制的方式向文件中写入

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

(1). const void *ptr  需要写入数据的地址

(2). size_t size   每个元素的大小

(3). size_t count   需要写入文件的元素个数

(4). FILE *stream   该文件的指针

->2. fwrite函数的使用

#include <stdio.h>typedef struct stu
{char name[20];int age;float score;
}stu;int main()
{FILE *pf = fopen("test.txt", "wb"); //wb以二进制的方式写if(NULL ==pf){perror("fopen");return 1;}stu p = {"zhangsan", 20, 85.5};fwrite(&p, sizeof(stu), 1, pf);fclose(pf);pf = NULL;return 0;    
}

运行结果:

从运行结果来看,确实是以二进制的形式写进去的

 fread

->1. fread函数  //以二进制的方式读文件

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

(1). void *ptr  存放向文件读到的数据

(2). size_t size   每个元素的大小

(3). size_t count   需要写入文件的元素个数

(4). FILE *stream   该文件的指针

->2. fread函数的使用

#include <stdio.h>typedef struct stu
{char name[20];int age;float score;
}stu;int main()
{FILE *pf = fopen("test.txt", "rb"); //以二进制的形式读if(NULL == pf){perror("fopen");return 1;}stu s = { 0 };fread(&s, sizeof(stu), 1, pf);fclose(pf);pf = NULL;return 0;
}

运行结果:

可以看到fread将文件的内容放入了结构体变量s上

sprintf

->1. sprintf函数  //把格式化的数据,以字符串的格式打印存放在一个字符串中

int sprintf(const char* s, const char* format, ...);

(1). const char* s  存放数据的地址

(2). const* format   数据流:格式化字符串等各种信息

(3). ...   可变参数列表,可以放多个参数

->2. sprintf函数的使用

#incldue <stdio.h>typedef struct tmp
{char name[20];int age;float score;
}tmp;int main()
{tmp s = {"zhangsan", 20, 86.5};char buf[30] = { 0 };sprintf(buf, "%s%d%f", s.name, s.age, s.score);printf(buf);return 0;
}

运行结果:

 sscanf

->1. sscanf函数  //从一个字符串中,还原出一个格式化的数据

int sscanf(const char* s, const char* format, ...);

(1). const char* s  存放数据的地址

(2). const* format   数据流:格式化字符串等各种信息

(3). ...   可变参数列表,可以放多个参数

->2. sscanf函数的使用

#include <stdio.h>typedef struct tmp
{char name[20];int age;float score;
}tmp;int main()
{tmp s = { 0 };char buf[30] = { "zhangsan 20 86.5" };sscanf(buf, "%s%d%f", s.name, &(s.age), &(s.score));printf("%s %d %f", s.name, s.age, s.score);return 0;
}

运行结果:


scanf - 从键盘(stdin)上读取格式化的数据

printf - 把数据输出到屏幕(stdout)上

fprintf - 针对所有输入流的格式化的输入函数:stdin,打开的文件

fscanf - 针对所有的输出流的格式化的输出函数:stdout,打开的文件

5.文件的随机读写

fseek

->1. fseek函数  //调整光标位置

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

(1). FILE* stream  目标文件

(2). long int offset   偏移量(往哪偏移)

(3). int orgin  从哪开始调整

​​​SEEK_SET    文件开始的位置

SEEK_CUR   光标现指向的位置

SEEK_END   文件末尾位置

->2. fseek函数的使用

 例:

文本文件中的内容

#include <stdio.h>int main()
{FILE* pf = fopen("test.txt", "r");if (NULL == pf){perror("fopen");return 1;}int ch = fgetc(pf);ch = fgetc(pf);printf("%c\n", ch);ch = fgetc(pf);//此时光标在字符c的后面d的前面,如果继续往下读肯定回到d,但是我们调整一下去读bfseek(pf, 1, SEEK_SET);// 或者fseek(pf, -2, SEEK_SUR);//这时往下读就会读到bch = fgetc(pf);printf("%c", ch);fclose(pf);pf = NULL;return 0;
}

运行结果:

ftell

->1. ftell函数  //返回文件指针相对于起始位置的偏移量

long int fseek(FILE* stream);

(1). FILE* stream  目标文件

#include <stdio.h>int main()
{FILE* pf = fopen("test.txt", "r");if (NULL == pf){perror("fopen");return 1;}int ch = fgetc(pf);printf("%c\n", ch);ch = fgetc(pf);printf("%c\n", ch);int pos = ftell(pf);printf("%d", pos);fclose(pf);pf = NULL;return 0;
}

运行结果:

->2. rewind函数的使用

#include <stdio.h>int main()
{FILE *pf = fopen("test.txt", "r");if(NULL == pf){perror("fopen");return 1;}int ch = fgetc(pf);printf("%c\n", ch);rewind(pf);ch = fgetc(pf);printf("%c", ch);fclose(pf);pf = NULL;return 0;
}

rewind

->1. rewind函数  //使指针回到初始位置

void rewind( FILE *stream );

(1). FILE *stream  需要调整文件的指针

->2. rewind函数的使用

#include <stdio.h>int main()
{FILE *pf = fopen("test.txt", "r");if(NULL == pf){perror("fopen");return 1;}int ch = fgetc(pf);printf("%c\n", ch);rewind(pf);ch = fgetc(pf);printf("%c", ch);fclose(pf);pf = NULL;return 0;
}

运行结果:

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

数据文件被称为文本文件或者二进制文件

数据在内存中以二进制的形式存储,如果不加转换的输出到外存(文件),就是二进制文件

在外存上以ASCII码的形式储存,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件

测试代码:

#include <stdio.h>int main()
{FILE* pf = fopen("test.txt", "wb");if (NULL == pf){perror("fopen");return 1;}int a = 10000;fwrite(&a, 4, 1, pf);fclose(pf);pf = NULL;return 0;
}

运行结果:

可以看到是二进制文件

我们来看看它是否是如我们所说的二进制一样

 

然后添加这个文件

添加进来之后右击点击这个文件,选择打开方式,点击二进制编辑器

可以看到是以十六进制的方式写的,因为这样更加方便表达展现,而且字节存储方式是小端

#include <stdio.h>int main()
{FILE* pf = fopen("test.txt", "w");if (NULL == pf){perror("fopen");return 1;}int a = 10000;fprintf(pf, "%d", a);fclose(pf);pf = NULL;return 0;
}

运行结果:

文本文件

7.文件读取结束的判定

feof 和 ferror

int ferror( FILE *stream );
int feof( FILE *stream );

(1). FILE *stream - 需要判断的文件

feof - 文件正常读取遇到了结束标志而结束就返回真

ferror - 返回真,说明文件在读取过程中出错了而结束

用这两个函数的前提是文件已经读取结束了才可以去使用这两个函数

用于文件读取结束的时候,判断是读取失败,还是到文件末尾结束 

1.文本文件读取是否结束,判断返回值是否为EOF(fgetc),NULL(fgets)

例如:

  • fgetc判断是否为EOF
  • fgets判断是否为NULL

文本文件的例子:

#include <stdio.h>
#define EXIT_FAILURE 1int main()
{FILE *pf = fopen("test,txt", "r");if(NULL == pf){perror("file opening failed");return EXIT_FAILURE;}int ch;while((ch = fgetc(pf)) != EOF)  //fgetc的返回值是int类型{putchar(ch);}//判断是什么原因结束的//判断文件是否是读取时遇到错误结束if(ferror(pf))puts("I/O error when reading"); //I/O读取文件else if(feof(pf))puts("End of file reached successfully");fclose(pf);pf = NULL;return 0;
}

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

例如:

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

二进制文件的例子:

#include <stdio.h>enum     //没有枚举名作用和define差不多,文本替换
{size = 5,  
};int main()
{FILE* pf = fopen("test.txt", "wb");if (NULL == pf){perror("FILE fopening failed");return 1;}int a[size] = { 1, 2, 3, 4, 5, };fwrite(a, sizeof * a, size, pf);fclose(pf);pf = NULL;return 0;
}
//以上代码是将数组a中的容写进文件test.txt
#include <stdio.h>enum     //没有枚举名作用和define差不多,文本替换
{size = 5,  
};int main()
{FILE* pf = fopen("test.txt", "rb");int a[size] = { 0 };size_t ret_code = fread(a, sizeof *a, size, pf);if (ret_code == size){perror("FILE fopening failed");return 1;}else if(feof(pf)){puts("Error reading test.txt: unexpected end of file\n");}else if(ferror(pf)){puts("Error reading test.txt");}fclose(pf);pf = NULL;return 0;
}

8.文件缓冲区

我们将数据冲数据区输出/输入到磁盘(文件)的时候不是直接输入/输出过去而是先经过缓冲区,通过缓冲区进入磁盘的,但是我们放到缓冲区的数据不会直接进入到磁盘,要怎么才能将数据放到磁盘了

将数据放入磁盘的条件

(1). 缓冲区放满的时候,缓冲区会自动将数据放入磁盘

(2). 主动刷新缓冲区的时候,缓冲区会将数放入磁盘

(3). 使用fclose关闭文件时,也会主动刷新缓冲区的将数据写到硬盘中然后关闭文件

 注:

因为有缓冲区的存在,C语言在操作文件的时候。需要做刷新缓冲区或者在文件操作结束的时候关闭文件   很重要!!!(保存信息)

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

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

相关文章

Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件

章节内容 上一节完成&#xff1a; HDFS的简介内容HDFS基础原理HDFS读文件流程HDFS写文件流程 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机上搭建过一次&#xff0c;但是没留下…

SpringSecurity的执行原理

SpringSecurity的执行原理&#xff1a;当我们服务端接收到请求后&#xff0c;首先通过DelegatingFilterProxy代理对象交互&#xff0c;转发给springsecurity的执行链&#xff0c;由于他自带的执行链有16条&#xff0c;我们将不用的过滤器进行了排除&#xff0c;同时加入了我们自…

如何保护应用?可快速部署的WAF服务器分享

Web应用攻击是安全事件和数据泄露的主要原因。相关统计表明&#xff0c;超过四分之三的网络犯罪直指应用及其漏洞。为保护数量日益增长的应用安全&#xff0c;Web应用防火墙(WAF)因此而生。本文则聚焦于WAF服务器&#xff0c;了解它的性能与具体的实践应用。   新加坡网络安全…

《单片机》期末考试复习-学习笔记总结

题型 问答题(15分)编程题(65分)编程题1(20分)编程题2(45分)设计题(20分)一、问答题 1.1.单片机概念和特点 1.2. 51单片机的中断结构 1.3.主从式多机通讯的概念及其工作原理 多机通信是指两台以上计算机之间的数据传输,主从式多机通信是多机通信系统中最简单的一种,…

PHP电商系统开发指南最佳实践

电子商务系统开发的最佳实践包括&#xff1a;数据库设计&#xff1a;选择适合关系型数据库&#xff0c;优化数据结构&#xff0c;考虑表分区&#xff1b;安全&#xff1a;加密数据&#xff0c;防止 sql 注入&#xff0c;处理会话管理&#xff1b;用户界面&#xff1a;遵循 ux 原…

vue3长列表优化,使用vue-virtual-scroller实现直播间弹幕列表虚拟滚动效果

使用的组件库是&#xff1a;https://github.com/Akryum/vue-virtual-scroller 官方文档&#xff1a;vue-virtual-scroller 安装依赖 npm install --save vue-virtual-scrollernextpnpm install --save vue-virtual-scrollernextyarn add vue-virtual-scrollernext 组件导入…

如何用文章改写ai软件进行改写?5个软件教你快速进行修改文章

如何用文章改写ai软件进行改写&#xff1f;5个软件教你快速进行修改文章 使用AI改写软件可以帮助你快速重写文章&#xff0c;使其更加流畅、符合要求或避免重复。以下是五款优质的AI改写软件&#xff0c;它们能够帮助你快速进行文章修改&#xff1a; 聪明灵犀 这是一款非常简…

数据结构_1.0

一、数据结构概述 1.1 概念 在计算机科学中&#xff0c;数据结构是一种数据组织、管理和存储的格式 。它是相互之间存在一种或多种特定关系的数据元素的集合。通常情况下&#xff0c;精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技…

【开源合规】开源许可证基础知识与风险场景引入

文章目录 什么是开源许可证(License)?开源许可证有什么用?开源许可证分类开源许可证分类及描述公共代码 (Public Domain)CC0无License宽松型许可证 (Permissive)MITApache 2.0BSD弱互惠型许可证 (Weak Copyleft)LGPLMPLEPL互惠型许可证 (Reciprocal)GPLEUPL强互惠许可证 (Str…

读-改-写操作

1 什么是读-改-写操作 “读-改-写”&#xff08;Read-Modify-Write&#xff0c;简称RMW&#xff09;是一种常见的操作模式&#xff0c;它通常用于需要更新数据的场景。 这个模式包含三个基本步骤&#xff1a; 1.读&#xff08;Read&#xff09;&#xff1a;首先读取当前的数据…

从0开始学习pyspark--pyspark的数据分析方式[第2节]

PySpark是Apache Spark的Python API&#xff0c;能够在分布式计算环境中处理大规模数据。本文将详细介绍PySpark中不同的数据分析方式&#xff0c;包括它们的使用场景、操作解释以及示例代码。 1. RDD&#xff08;Resilient Distributed Dataset&#xff09;API 概述 RDD是Sp…

Linux——查找文件-find(详细)

查找文件-find 作用 - 按照文件名、大小、时间、权限、类型、所属者、所属组来搜索文件 格式 find 查找路径 查找条件 具体条件 操作 注意 - find命令默认的操作是print输出 - find是检索文件的&#xff0c;grep是过滤文件中字符串 参数 参数 …

简述Vue中的数据双向绑定原理

Vue中的数据双向绑定原理是Vue框架的核心特性之一&#xff0c;它通过数据劫持结合发布者-订阅者模式来实现。下面将详细阐述Vue中数据双向绑定的原理&#xff0c;并尽量按照清晰的结构进行归纳&#xff1a; 一、数据劫持 使用Object.defineProperty()&#xff1a; Vue在组件…

Mojo模板引擎:释放Web开发的无限潜能

&#x1f680; Mojo模板引擎&#xff1a;释放Web开发的无限潜能 Mojolicious是一个基于Perl的现代化、高性能的Web开发框架&#xff0c;它内置了一个功能强大的模板引擎&#xff0c;专门用于快速构建Web应用程序。Mojo的模板引擎不仅简洁易用&#xff0c;而且具备多种高级特性…

《每天5分钟用Flask搭建一个管理系统》第11章:测试与部署

第11章&#xff1a;测试与部署 11.1 测试的重要性 测试是确保应用质量和可靠性的关键步骤。它帮助开发者发现和修复错误&#xff0c;验证功能按预期工作。 11.2 Flask测试客户端的使用 Flask提供了一个测试客户端&#xff0c;可以在开发过程中模拟请求并测试应用的响应。 …

Unity海面效果——4、法线贴图和高光

Unity引擎制作海面效果 大家好&#xff0c;我是阿赵。 继续做海面效果&#xff0c;上次做完了漫反射颜色和水波动画&#xff0c;这次来做法线和高光效果。 一、 高光的计算 之前介绍过高光的光照模型做法&#xff0c;比较常用的是Blinn-Phong 所以我这里也稍微连线实现了一下 …

在线医疗诊断平台开发教程大纲 (Java 后端,Vue 前端)—实践篇-01

项目分析 第一部分:项目概述及技术选型 项目背景: 在线医疗诊断平台的市场需求与发展趋势本平台的目标用户和核心功能,突出解决的痛点竞品分析,差异化优势技术选型: 后端: 核心框架: Spring Boot (简化开发流程)持久层框架: MyBatis (灵活,易于上手)数据库: MySQL (成熟稳…

API 授权最佳实践

API&#xff08;应用程序编程接口&#xff09;就像秘密之门&#xff0c;允许不同的软件程序进行通信。但并不是每个人都应该拥有每扇门的钥匙&#xff0c;就像不是每个软件都应该不受限制地访问每个 API 一样。 这些 API 将从银行的移动应用程序到您最喜欢的社交媒体平台的所有…

英语中Would you和Could you的区分用法

Spark: 在英语中&#xff0c;“Would you”和“Could you”都是用来礼貌地提出请求或询问的表达方式&#xff0c;但它们之间存在一定的差异&#xff1a; 语气与礼貌程度&#xff1a; Would you&#xff1a;通常用于更正式或较为礼貌的场合&#xff0c;它体现了一种比较客气的请…

打开wsl显示请启用虚拟机平台 Windows 功能并确保在 BIOS 中启用虚拟化。

安装了个安卓模拟器&#xff0c;后面wsl打开后显示这个 按照很多博客说的运行一串命令 bcdedit /set hypervisorlaunchtype auto 之后重启电脑 没有效果 运行 dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart 之后重启成功打开 wsl 来…