【C语言】程序员自我修养之文件操作
【C语言】程序员自我修养之文件操作

🔥个人主页:大白的编程日记
🔥专栏:C语言学习之路
文章目录
- 【C语言】程序员自我修养之文件操作
- 前言
- 一.文件介绍
- 1.1为什么使用文件
- 1.2文件分类
- 1.3二进制文件和文本文件
- 二.文件的打开和关闭
- 2.1流和标准流
- 2.2文件指针
- 2.3文件的打开和关闭
- 三.文件的顺序读写
- 3.1fgetc和fputc
- 3.2fgets和fputs
- 3.3fprintf和fscanf
- 3.4对比函数
- 3.5fwrite和fread
- 四.文件的随机读写
- 五. 文件读取结束的判定
- 六.文件缓冲区
- 后言
前言
哈喽,各位小伙伴大家好!今天给大家分享的是,作为程序员的自我修养的文件操作。话不多说,咱们直接进入正题!向大厂冲锋!
一.文件介绍
1.1为什么使用文件
以这段代码为例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int n = 0;scanf("%d", &n);printf("%d", n);return 0;
}
当我们输入10时,发现n这时确实时10。

但当我们退出程序,重新运行时n的值已经不见了。

可以发现我们刚才再程序输入的10,在内存中并没有持久化的保存。
但是我们硬盘中的文件的数据就可以永久的保存起来。
- 文件
如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件。
1.2文件分类
磁盘(硬盘)上的文件是文件。
但是在程序设计中,我们⼀般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。
- 程序文件
程序文件包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序windows环境后缀为.exe)。 - 数据文件
文件的内容不⼀定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。
今天主要我们讨论的是数据文件。
在以前各章所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。
其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上文件。
- 文件名
⼀个文件要有一个唯一的文件标识,以便用户识别和引用。
文件名包含3部分:文件路径+文件名主干+文件后缀
例如: c:\code\test.txt
为了方便起见,文件标识常被称为文件名。
1.3二进制文件和文本文件
根据数据的组织形式,数据⽂件被称为文本文件或者二进制文件。
- 二进制文件
数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的文件中,就是⼆进制文件。例如obj文件:因为是二进制的文件,我们用文本编辑器看到的就是乱码。

- 文本文件
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。
txt后缀的就是文本文件

⼀个数据在文件中是怎么存储的呢?
- 存储方式
字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。

如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符⼀个字节),而⼆进制形式输出,则在磁盘上只占4个字节
#include <stdio.h>
int main()
{int a = 10000;FILE* pf = fopen("test.txt", "wb");fwrite(&a, 4, 1, pf);//⼆进制的形式写到⽂件中fclose(pf);pf = NULL;return 0;
}
- 我们以文本编辑器打开是看不看不懂的。

- 所以我们以二进制编辑器打开


二.文件的打开和关闭
2.1流和标准流
- 流
我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。

C程序针对文件、画面、键盘等的数据输入输出操作都是通过流操作的。
一般情况下,我们要想向流里写数据,或者从流中读取数据,都是要打开流,然后操作。
- 标准流
那为什么我们从键盘输入数据,向屏幕上输出数据,并没有打开流呢?
int main()
{int a = 0;scanf("%d", &a);printf("%d", a);return 0;
}
那是因为C语言程序在启动的时候,默认打开了3个流:
-
stdin
标准输入流,在⼤多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据 -
stdout
标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出流中。 -
stderr
标准错误流,大多数环境中输出到显示器界面。
这是默认打开了这三个流,我们使用scanf、printf等函数就可以直接进行输入输出操作的。
stdin、stdout、stderr 三个流的类型是: FILE* ,通常称为文件指针。
C语言中,就是通过 FILE* 的文件指针来维护流的各种操作的。
2.2文件指针
缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。
每个被使⽤的⽂件都在内存中开辟了⼀个相应的文件信息区,⽤来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名 FILE.
例如,VS2013 编译环境提供的 stdio.h 头文件中有以下的文件类型申明:
struct _iobuf {char *_ptr;int _cnt;char *_base;int _flag;int _file;int _charbuf;int _bufsiz;char *_tmpfname;};
typedef struct _iobuf FILE;
不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。
每当打开一个文件的时候,系统会根据文件的情况自动创建⼀个FILE结构的变量,并填充其中的信息,使用者不必关心细节。
一般都是通过⼀个FILE的指针来维护这个FILE结构的变量,从而维护整个文件流的读写操作,这样使用起来更加方便。
下⾯我们可以创建⼀个FILE*的指针变量:
FILE* pf;//⽂件指针变量
定义pf是⼀个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是⼀个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够间接找到与它关联的文件。

2.3文件的打开和关闭
文件操作就像喝水一样:
-
喝水
打开瓶盖——喝水——关闭瓶盖 -
文件操作
打开文件——读写文件——关闭文件
那文件是如何打开关闭的呢?
在编写程序的时候,在打开文件的同时,都会返回⼀个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。
ANSIC 规定使用 fopen 函数来打开文件, fclose 来关闭文件。
//打开⽂件
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件
int fclose ( FILE * stream );
- 参数
filename是要操作的文件名,mode表示文件的打开模式,
stream是要关闭文件的的文件指针
mode表示文件的打开模式,下面都是文件的打开模式:

- "w"和"a"的区别
”w“会清空文件中原有的数据再写。"a"则再原来的数据后追加数据
注意是双引号不是单引号!因为char*指针指向的是字符串首元素的地址,所以要用双引号表示字符串
实例代码:
#include <stdio.h>
int main ()
{FILE * pFile;//打开⽂件pFile = fopen ("myfile.txt","w");//⽂件操作if (pFile!=NULL)//检查指针返回值{fputs ("fopen example",pFile);//关闭⽂件fclose (pFile);pFile=NULL;//置空return 0;
}
注意fopen 如果打开成功返回文件指针,否则返回空指针,所以我们需要对fopen的返回值做判断。
fclose关闭文件后不会把文件指针置为空,所以我们需要手动置空
三.文件的顺序读写
顺序读写函数介绍

3.1fgetc和fputc
fputc是字符输入函数,可以把一个字符写进文件。

-
参数
character是要写进去的字符,ASCLL码值表示,所以用int类型。
stream是指向文件的文件指针 -
光标
文件中有光标进行读写操作的维护,写数据后光标就会向后移动。 -
返回值
如果写操作成功的话,就返回写的字符。失败就返回EOF,就是-1。同时会把错误标记起来。
int main()
{FILE* pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 1;}for (int i = 'a'; i < 'z'; i++){fputc(i, pf);}fclose(pf);pf = NULL;return 0;
}

那如何读取文件的数据呢?那就要使用fgetc

-
参数
stream是要读取文件的文件指针 -
返回值
如果读取成功返回值读取成功的字符,ascll码值表示是int
如果读取失败或遇到文件末尾返回EOF就是-1,所以用int返回,兼容两种返回值的类型 -
光标
文件中有光标进行读写操作的维护,读数据后光标就会向后移动。
int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}int ch=0;while ((ch=fgetc(pf))!= EOF){printf("%c", ch);}fclose(pf);pf = NULL;return 0;
}



这些函数都是一个一个字符读写的,如果我们要读写字符串呢?
3.2fgets和fputs
fputs是把字符串写到文件里的函数。

-
参数
str指向要写入字符串的指针,
stream是要写入文件的文件指针 -
换行
如果想换行写入字符串,需要再字符串末尾添加\0


那如何都出来呢?这就得使用fgets。

- 参数

str是读取内存存放的地址
num是读取的长度,但实际他只会读取num-1个字符,最后一个字符会补上\0。如果文件中的字符串长度不够,就会把字符串读完(包括\n),然后补上\0


stream是读取文件的文件指针 - 返回值
成功读取就返回str的地址
读取失败就返回空指针。
所以多次读取时就可以这样写
int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}char s[20] = "xxxxxxxxxxxxxxxxxx";while (fgets(s, 10, pf) != NULL){printf("%s", s);}fclose(pf);pf = NULL;return 0;
}

3.3fprintf和fscanf
当我们要以指定格式写数据到文件时,我们就可以用fprintf函数


我们可以发现printf和fprintf函数参数非常相似,fprintf多了一个文件指针。
其实fprintf使用跟printf基本一样,只是多了一个文件指针而已
int main()
{FILE* pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 1;}struct S s = { "张三", 18, 80.5f};fprintf(pf, "%s %d %f", s.name, s.age, s.score);fclose(pf);return 0;
}

那我们读取就用fscanf读取


我们发现scanf和fscanf也非常相似,就差了一个文件指针的参数
所以fscanf的使用也只需多加一个读取文件的文件指针即可。
int main()
{FILE* pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 1;}struct S s = { "张三", 18, 80.5f};fscanf(pf, "%s %d %f", s.name, &s.age, &s.score);printf("%s %d %f", s.name, s.age, s.score);fclose(pf);return 0;
}

我们发现这些函数都适用于所有流
所有流分为文件流和标准流


那是不是我们用标准流也可以呢?
这里我们来验证一下:
- 验证

大家发现我们把文件流替换成标准输出流结果也是一样的。
3.4对比函数
sprintf是把格式化的数据转化为字符串的函数


sprintf多了一个str参数,其实就是格式化数据转化字符串后存放的地址
int main()
{FILE* pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 1;}char a[30];struct S s = { "张三", 18, 80.5f};sprintf(a, "%s %d %f", s.name, &s.age, &s.score);printf("%s", a);fclose(pf);return 0;
}

sscanf就是在字符串中读取格式化数据的函数


int main()
{FILE* pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 1;}char a[30];struct S s = { "张三", 18, 80.5f};printf("字符串打印:");sprintf(a, "%s %d %f\n", s.name, s.age, s.score);printf("%s", a);struct S t = {0};sscanf(a, "%s%d%f", t.name, &t.age, &t.score);printf("格式打印: %s %d %f", t.name, t.age, t.score);fclose(pf);return 0;
}

现在我们来对比一下这些相似的函数

3.5fwrite和fread
前面我们用的函数写进去都能看懂,这是因为我们是以文本或字符的形式写进去的。 那以二进制写进去又是怎样的呢?
fwrite把数据以二进制写入文件


-
参数
ptr指向一个数组,数组存放要写入的数据
size是每个数据的大小
count数据的个数
stream写入文件的文件指针 -
打开方式
"wb"打开
int main()
{FILE* pf = fopen("test.txt", "wb");if (pf == NULL){perror("fopen");return 1;}int arr[] = { 1,2,3,4 };fwrite(arr, 4, 4, pf);fclose(pf);return 0;
}

当然以二进制形式写进去我们看不懂,我们再以二进制形式都出来就好了
fread就是把数据以二进制形式读出来。


-
参数
ptr指向数组,读取后的数据存放到数据中
size读取数据的大小
count读取数据的个数
strenm读取文件的文件指针 -
打开方式
"rb"打开 -
返回值
size_t返回值,表示成功读取的个数。如果读取小于count参数说明是最后一次读取
当我们不知道文件中的数据个数是就可以这样写
int main()
{FILE* pf = fopen("test.txt", "rb");if (pf == NULL){perror("fopen");return 1;}int arr[20] = { };int i = 0;while (fread(arr+i, 4, 1, pf)){printf("%d ", arr[i]);i++;}fclose(pf);return 0;
}

四.文件的随机读写
大家发现我们讲的这些函数都是一个一个读写,所以叫顺序读写
那我们可不可以想从任意位置开始读写呢?这就是我们接下来要讲的随机读写
fseek函数

- 参数
stream:操作文件的文件指针
offset 想让光标偏移的偏移量
origin 偏移的起始位置 - 起始位置
起始位置有三种

int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}fseek(pf, 2, SEEK_SET);printf("%c", fgetc(pf));fclose(pf);return 0;
}



- ftell
返回文件指针相对于起始位置的偏移量

int main ()
{FILE * pFile;long size;pFile = fopen ("myfile.txt","rb");if (pFile==NULL) perror ("Error opening file");else{fseek (pFile, 0, SEEK_END); // non-portablesize=ftell (pFile);fclose (pFile);printf ("Size of myfile.txt: %ld bytes.\n",size);}return 0;
}
- rewind
让文件指针的位置回到文件的起始位置
int main ()
{int n;FILE * pFile;char buffer [27];pFile = fopen ("myfile.txt","w+");for ( n='A' ; n<='Z' ; n++)fputc ( n, pFile);rewind (pFile);fread (buffer,1,26,pFile);fclose (pFile);buffer[26]='\0';printf(buffer);return 0;
}
五. 文件读取结束的判定
牢记:在文件读取过程中,不能⽤feof函数的返回值直接来判断文件的是否结束。
feof 的作用是:当文件读取结束的时候,判断是读取结束的原因是否是:遇到文件末尾结束。
- 文本文件
判断返回值是否为 EOF ( fgetc结束),或者 NULL ( fgets结束 )

int main(void)
{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);
}
- 二进制文件
⼆进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
#include <stdio.h>
enum { SIZE = 5 };
int main(void)
{double a[SIZE] = {1.,2.,3.,4.,5.};FILE *fp = fopen("test.bin", "wb"); // 必须⽤⼆进制模式fwrite(a, sizeof *a, SIZE, fp); // 写 double 的数组fclose(fp);double b[SIZE];fp = fopen("test.bin","rb");size_t ret_code = fread(b, sizeof *b, SIZE, fp); // 读 double 的数组if(ret_code == SIZE) {puts("Array read successfully, contents: ");for(int n = 0; n < SIZE; ++n) printf("%f ", b[n]);putchar('\n');} else { // error handlingif (feof(fp))printf("Error reading test.bin: unexpected end of file\n");else if (ferror(fp)) {perror("Error reading test.bin");}}fclose(fp);
}
六.文件缓冲区
ANSIC 标准采⽤“缓冲文件系统” 处理的数据⽂件的,所谓缓冲文件系统是指系统自动地在内存中为 程序中每⼀个正在使用的⽂件开辟⼀块“⽂件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓 冲区的大小根据C编译系统决定的。

#include <stdio.h>
#include <windows.h>
//VS2019 WIN11环境测试
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语言】程序员自我修养之文件操作 🔥个人主页:大白的编程日记 🔥专栏:C语言学习之路 文章目录 【C语言】程序员自我修养之文件操作前言一.文件介绍1.1为什么使用文件1.2文件分类1.3二进制文件和文本文件 二.文件的打开和关闭2.…...
一种获取java代码结构的实现思路
一种获取java代码结构的实现思路 有时,我们需要获取java文件里的代码结构,即,只需要里面的class定义、方法声明、属性定义。不需要额外的方法实现 这里提供一下实现思路: 采用语法解析器Tree-sitter对java代码进行解析,获取里面的方法实现遍历第一步获取到的方法列表,在源…...
MySQL---增删改查
MySQL是一个流行的关系型数据库管理系统,它使用结构化查询语言(SQL)来管理数据库中的数据。以下是MySQL中增删改查(CRUD)操作的基本命令: 创建(Create): 创建新表:CREATE TABLE table_name (column1 datatype,column2 datatype,...PRIMARY KEY (column) );插入数据:…...
C#编程-.NET Framework使用工具类简化对象之间的属性复制和操作
在C#编程中,对象之间的属性复制和操作是一个常见的需求。为此,.NET Framework提供了多种实用工具库,如AutoMapper、ValueInjecter和ExpressMapper。这些库通过简化代码,提高了开发效率。本文将介绍这些工具库,比较它们…...
爬虫基本原理及requests库用法
文章目录 一、爬虫基本原理1、什么是爬虫2、爬虫的分类3、网址的构成4、爬虫的基本步骤5、动态【异步】页面和静态【同步】页面6、请求头 二、requests基本原理及使用1、chrome 抓包按钮详解1.1 Elements1.2 元素定位器1.3 Network1.4 All1.5 XHR1.6 Preserve log1.7 手机模式1…...
spring和springboot、springcloud版本关系
进入新公司,看底层框架代码时,想了解spring的版本,很好奇这些版本之间时怎么对应的,因为不同版本应该有依赖关系,用得不对可能代码会有隐藏问题。 Spring、SpringBoot和SpringCloud的版本不一致,并且需要搭…...
视频监控汇聚平台LntonCVS通过GB/T28181国标协议实现视频监控平台的级联方案
近年来,随着网络视频监控应用范围的拓展,越来越多的政府部门和跨区域行业单位对视频监控的需求已经不局限于本地联网监控。他们正在探索在原有的本地联网监控基础上,建设省级乃至全国范围内的跨区域监控联网,以全面打造数据共享平…...
【精品】使用 v-md-editor 上传图片
简介 v-md-editor 是基于 Vue 开发的 markdown 编辑器组件,即支持vue2也支持vue3。 gitee:https://gitee.com/ckang1229/vue-markdown-editor文档:https://code-farmer-i.github.io/vue-markdown-editor/zh/ 服务器端代码 RestController…...
STM32——DAC篇(基于f103)
技术笔记! 一、DAC简介(了解) 1.1 DAC概念 传感器信号采集改变电信号,通过ADC转换成单片机可以处理的数字信号,处理后,通过DAC转换成电信号,进而实现对系统的控制。 1.2 DAC的特性参数 1.3…...
突然提示由于找不到msvcr120.dll,无法继续执行代码有什么办法可以解决?
msvcr120.dll是Microsoft Visual C 2013 Redistributable Package的一部分,它包含了运行时库,用于支持使用Visual C 2013开发的应用程序。如果电脑突然提示由于找不到msvcr120.dll,无法继续执行代码有什么办法可以解决?以下是关于msvcr120.dl…...
swig4.2.1压缩包中里面没有找到swig.exe
官网:Simplified Wrapper and Interface Generator C转 C# 采用Swig.exe 打开Example示例的解决方案:sln 生成 即可查看如何调用和使用.i文件 但是:迅雷不管下载哪个版本都是没有exe 官网说了自带。很迷很迷~ 下载其他版本的时候发现&…...
Vue文本溢出如何自动换行
css新增 word-break: break-all; word-wrap: break-word;...
【系统架构师】-论文-系统安全性与保密性设计
1、摘要: 2018 年初,我所在的公司为一票务公司开发开票业务平台的建设。我在该项目中担任系统架构设计师的职务,主要负责设计平台系统架构和安全体系架构。该平台以采用 B/S 架构服务用户,采用”平台应用”的模式解决现有应用单机独立开票的模…...
Cisco Catalyst 9000 9200 9300 9400 IOS software upgrade
1 背景 从Catalyst 3650 ,3850,Catalyst 9000开始, 更准确的说是IOS XE的交换机的系统镜像安装方式分为2种 Bundle mode Install mode 这2种方工啥区别? Bundle mode 传统方式利用boot system flash:c9k.xx16.bin方式引导 Install mode 将bin文…...
Web Server项目实战2-Linux上的五种IO模型
上一节内容的补充:I/O多路复用是同步的,只有调用某些API才是异步的 Unix/Linux上的五种IO模型 a.阻塞 blocking 调用者调用了某个函数,等待这个函数返回,期间什么也不做,不停地去检查这个函数有没有返回,…...
Docker | 基础指令
环境:centos8 参考: 安装 Docker | Docker 从入门到实践https://vuepress.mirror.docker-practice.com/install/ 安装Docker 卸载旧版本,安装依赖包,添加yum软件源,更新 yum 软件源缓存,安装 docker-ce…...
10款手机黑科技app,每款都好用到爆!
AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 1. 计划程序应用 —— Android Auto Text Android Auto Text(前身为 Do It Later)是一款简单易用的日程安排应用程序&am…...
tomcat请求数据解析过程
前面提到tomcat请求处理的io交互过程,现在开始看下经过io交互后tomcat是怎么处理请求数据的。首先到AbstractProtocol.java中的process方法,注意这个方法是在tomcat线程池分配的线程调用的。生成用来对请求字节流数据进行解析的Http11Processor。 public…...
《扑克牌游戏》
描述 有一个扑克牌游戏,游戏规则是不断地摸牌,尽可能地使手上的牌的点数接近于10,最完美的情况是总点数为10,不可以超过10,否则就爆了。输入10张牌的点数,(每张点数不超过10),请你输出用户应该抓…...
kali模块及字典介绍
1. 基本模块介绍 模块 类型 使用模式 功能 dmitry 信息收集 命令行 whois查询/子域名收集/端口扫描 dnmap 信息收集 命令行 用于组建分布式nmap,dnmap_server为服务端;dnmap_client为客户端 i…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)
名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 原创笔记:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:《数据结构第4章 数组和广义表》…...

