9.2 Linux_标准I/O_相关函数

打开与关闭

文件打开就是判断这个文件资源可不可以被占用,如果可以,就能够打开成功,否则打开失败

文件关闭就是释放文件资源

1、打开文件

1.1 函数声明

FILE *fopen(const char *pathname, const char *mode);

返回值:出错返回NULL,成功返回流指针

pathname:文件的路径。如果是当前目录下的文件,只写文件名即可。其他目录需要写绝对路径

mode:打开的模式

模式含义适用情况
r     rb只读,文件必须存在只想查看,不想修改文件
w    wb只写,先清空原文件,写时覆盖原文件,没有则创建只写一次的情况
a     ab只写,追加原文件,没有则创建需要多次写入的情况
r+    r+b读写,写时覆盖原文件,文件必须存在可使用光标随意位置写入
w+  w+b读写,先清空原文件,写时覆盖原文件,没有则创建可使用光标随意位置写入
a+   a+b读写,写时追加原文件,没有则创建不可指定光标位置

注意:打开文件后,必须判断返回值是否有效。只有当返回值有效时,才能对文件进行操作。

注意:打开文件后,光标指向文件的开头 

1.2 基本使用方法

使用步骤:

  1. 定义一个流指针fp
  2. 调用fopen打开文件
  3. 判断返回值有效性

具体代码实现如下:

#include <stdio.h>int main(){//1.定义一个流指针FILE* fp = NULL;//2.打开文件fp = fopen("./test.c","r");//以只读方式打开文件./test.c//3.判断返回值有效性if(fp == NULL){perror("fopen");//打印错误信息return -1;}printf("open success\n");fclose(fp);return 0;
}

代码执行结果如下: 

2、关闭文件

2.1 函数声明如下:

int fclose(FILE *stream);

返回值:成功返回0;失败返回EOF(-1),并设置错误号errno

stream:指向要关闭的文件的流指针

2.2 关闭文件函数所做的事情:

流关闭时,自动刷新缓冲区中的数据并释放缓冲区,这意味着将之前对文件的写入内容会真正的写入到磁盘中,并释放内存开辟的缓冲区。

如果不调用fclose但是程序结束,也会有fclose的同样的效果。

3、打印错误信息

3.1 函数声明如下:

//先输出字符串s,再输出错误号对应的信息
void perror(const char *s);//根据错误号errnum,返回对应的错误信息
char *strerror(int errnum);

对于strerror的参数errnum,固定填入errno即可。这需要先包含#include <errno.h>

3.2 基本使用方法

具体代码实现如下: 

#include <stdio.h>
#include <string.h>
#include <errno.h>int main(){FILE* fp = NULL;fp = fopen("./alksjdla","r");if(fp == NULL){perror("perror");                        //perror 打印错误printf("strerror:%s\n",strerror(errno)); //strerror 打印错误return -1;}printf("open success\n");return 0;
}

代码执行结果如下: 

读取与写入

输入输出两大问题:

  • 光标问题:

读取与写入操作都是从光标位置开始执行,执行完成后都会对光标位置进行修改。因此读写操作首先要考虑的时当前光标位置,以及执行之后光标移动的结果

  • 缓冲区问题:

输出(写入)操作,都是行缓冲模式,如果输出结果没有'\n',那么需要在输出之后使用fflush手动刷新缓冲区,将缓冲区内容写入到文件中。

1、按字符输入输出

1.1 按字符输入函数声明如下:

//从文件中读取一个字符
int fgetc(FILE *stream);//这是fgetc的宏,不是函数
int getc(FILE *stream);//只能读取标准输入的一个字符,等同于fgetc(stdin)
int getchar(void);

返回值:成功返回字符,失败或读到文件末尾返回EOF(-1) 

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

注意:从文件的当前光标位置读取一个字符,读取后光标偏移一个字符 

1.2 按字符输出函数声明如下:

//向文件中写入一个字符
//同样,fputc只是将数据存入缓冲区,当遇到\n时才真正的存入到文件中
int fputc(int c, FILE *stream);//这是fputc的宏,不是函数
int putc(int c, FILE *stream);//只能向标准输出上输出一个字符,等同于fputc(stdout)
//同样,putchar只是将数据存入缓冲区,当遇到\n时才打印到屏幕
int putchar(int c);

返回值:成功返回写入的字符,失败返回EOF

c:要写入的字符

stream:指向要写入的文件的流指针

注意:将光标移动(与模式有关),在光标位置写入一个字符,写入后光标偏移一个字符  

1.3 基本使用方法

具体代码实现如下:  

#include <stdio.h>
#include <string.h>
#include <errno.h>int main(){FILE* fp = NULL;//1.打开文件fp = fopen("./file","a+");//以追加方式,可读可写打开文件if(fp == NULL){perror("fopen");return -1;}//读取文件printf("1:输出%%c %c\n",fgetc(fp));//光标指向0,读取后偏移一个字符printf("2:输出%%c %c\n",fgetc(fp));//光标指向1,读取后偏移一个字符//写入文件fputc('x',fp);//先将光标指向末尾,再向光标位置写入一个字符,写后光标偏移一个字符//读取文件printf("3:输出%%d %d\n",fgetc(fp));//光标指向末尾,没有数据//关闭文件fclose(fp);return 0;
}

 代码执行结果如下: 

2、按行输入输出

2.1 按行输入

2.1.1 按行输入函数声明如下:

//从文件中读取数据,存放在s中
char *fgets(char *s, int size, FILE *stream);//从标准输入上读取数据,存放在s中
char *gets(char *s);  //不使用,因为没有指定读取数据的大小,容易造成缓冲区溢出

返回值:成功返回缓冲区首地址,失败返回NULL

s:将读取的内容放置的缓冲区地址

size:每次读取的字符的个数,'\0'同样算一个字符。size>输入字符个数时,会将回车也存入s

          比如size = 3,输入abcd,最终缓冲区存放的数据为ab'\0',而不是abc

          比如size = 10,输入abcd,最终缓冲区存放的数据为abcd '\n' '\0'

stream:从哪一个文件读取数据

注意:fgets执行后,光标会进行移动

2.1.2 size验证代码如下:

  • 当size>字符个数时,会将\n存入缓冲区 

  • 当size<字符个数时,'\0'也算一个字符

2.1.3  按行输入的原理验证

按行输入函数 fgets()的原理就是读到回车就算一行,假如这一行有n个字符,如果n<size,那么读取到的是完整的一行数据;如果n>=size,那么本次只读取size-1个字符,其余字符下次调用fgets()会接着读取。

具体代码如下:

#include <stdio.h>
#include <string.h>
#include <errno.h>int main(){char buf[100];FILE* fp = NULL;//打开文件if((fp = fopen("./file","r")) == NULL){perror("fopen");return -1;}//读取文件fgets(buf,5,fp);//从fp文件上一次最多读取5个字符printf("1:%s\n",buf);fgets(buf,5,fp);//从fp文件上一次最多读取5个字符printf("2:%s\n",buf);fgets(buf,5,fp);//从fp文件上一次最多读取5个字符printf("3:%s\n",buf);//关闭文件fclose(fp);return 0;
}

代码执行结果如下: 

2.1.4 应用:获取文件的行号 

具体代码实现如下:

int main(){FILE* fp = NULL;int i = 0;char buf[3] = {0};//数组大小可随意填,后面有判断是否换行的处理,不需要一次读完一行if((fp = fopen("./file","a+")) == NULL){//以追加方式,可读可写perror("fopen");return -1;}//计算文件有多少行while(fgets(buf,sizeof(buf),fp) != NULL){if(buf[strlen(buf)-1] == '\n'){//判断倒数第二个字符是否为换行,是换行代表这行读完i++;}}fclose(fp);return 0;
}

2.2 按行输出 

2.2.1 按行输出函数声明如下:

//将字符串数据s输出到文件中
int fputs(const char *s, FILE *stream);//将字符串数据s输出到标准输出上
int puts(const char *s);

返回值:成功返回非负数,失败返回EOF

s:要输出的字符串

stream:指向要输出到的文件位置

注意:puts会自动添加'\n',fputs不会自动添加'\n'

注意:fputs执行后,光标会进行移动

2.2.2 基本使用方法

具体代码实现如下:

#include <stdio.h>
#include <string.h>
#include <errno.h>int main(){FILE* fp = NULL;//1.打开文件fp = fopen("./file","a+");//以追加方式,可读可写打开文件if(fp == NULL){perror("fopen");return -1;}//这里的fputs能写进去是因为文件关闭了,应该之后用fflush刷新一下fputs("fputs",fp);//没有换行符'\n'puts("puts");//关闭文件fclose(fp);return 0;
}

代码执行结果如下:

3、按对象(二进制)输入输出

3.1 按对象输入输出函数声明:

//按对象输入,从stream中读取数据存入到ptr中
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
//按对象输出,将ptr中的数据写入到stream中
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);

返回值:成功返回读写对象的个数,出错返回EOF

ptr:缓冲区指针,用于存放读的数据或要写的数据

size:每个内容的大小(块大小) 单位:字节

nmemb:读写多少个内容

stream:进行操作的文件流指针

注意:这两个函数既可以读写文本文件,也可以读写二进制文件(数据文件)

注意:这两个函数执行后,光标都会进行移动 

3.2 读写文本文件实验

具体代码实现如下:

#include <stdio.h>
#include <string.h>
#include <errno.h>int main(){FILE* fp = NULL;char buf[100] = {0};//1.打开文件fp = fopen("./file","a+");//以追加方式,可读可写打开文件if(fp == NULL){perror("fopen");return -1;}fread(buf,sizeof(char),5,fp);//从fp指向的文件中读取5*sizeof(char)个字节,存放到buf中printf("read:%s\n",buf);//关闭文件fclose(fp);return 0;
}

代码运行结果如下:

3.3 读写二进制文件实验

具体代码实现如下:

#include <stdio.h>
#include <string.h>
#include <errno.h>struct test{char name[10];int age;
};int main(){FILE* fp = NULL;struct test tWrite = {"rsy",20};struct test tRead;//打开文件fp = fopen("./file","a+");//以追加方式,可读可写打开文件if(fp == NULL){perror("fopen");return -1;}//从fp指向的文件中写入1*sizeof(struct test)个字节fwrite(&tWrite,sizeof(struct test),1,fp);//重置光标位置fclose(fp);if((fp = fopen("./file","a+")) == NULL){perror("fopen");return -1;}//从fp指向的文件中读取1*sizeof(struct test)个字节fread(&tRead,sizeof(struct test),1,fp);printf("name = %s,age = %d\n",tRead.name,tRead.age);//关闭文件fclose(fp);return 0;
}

代码运行结果如下:

流刷新定位

1、流刷新

流刷新的作用,就是手动的让缓冲区的内容进行输出,丢弃输入缓冲区的内容。

1.1 刷新流的函数声明如下:

int fflush(FILE *stream);

返回值:成功返回0,失败返回EOF

stream:指向文件的流

如果输出到屏幕,使用fflush(stdout)即可。

1.2 刷新流实验

#include <stdio.h>
#include <string.h>
#include <errno.h>struct test{char name[10];int age;
};int main(){FILE* fp = NULL;struct test tWrite = {"rsy",20};struct test tRead;//打开文件fp = fopen("./file","a+");//以追加方式,可读可写打开文件if(fp == NULL){perror("fopen");return -1;}//写入数据fwrite("1234",sizeof("1234"),1,fp);fflush(fp);//刷新流,这里的1234没有'\n',但刷新后可以将1234写入文件中while(1);//关闭文件fclose(fp);return 0;
}

2、流定位

流定位就是可以手动改变流指针(光标)的位置

注意:这下面3个函数只适用2GB以下的文件

2.1 流定位的函数声明如下:

//查询流指针位置
long ftell(FILE *stream);

返回值:成功返回流当前的读写位置,失败返回EOF

stream:要进行操作的文件流指针

注意:刚打开文件时,流指针的值为0,流指针的单位为字节。

//将流指针定位到开头
void rewind(FILE *stream);
//定位一个流
int fseek(FILE *stream, long offset, int whence);

返回值:成功返回0,失败返回 EOF

stream:要进行操作的文件流指针

offset:偏移量,正数代表向文件尾偏移,负数代表向文件头偏移,0代表不偏移

whence:偏移位置,从哪里开始偏移

参数含义
SEEK_SET从文件头开始偏移
SEEK_CUR从文件流指针当前位置开始偏移
SEEK_END从文件尾开始偏移

注意:当fopen时,模式为a时,fseek不起作用

2.2 流定位实验

具体代码实现如下:

#include <stdio.h>
#include <string.h>
#include <errno.h>int main(){FILE* fp = NULL;char read_buf[100] = {0};//打开文件fp = fopen("./file","w+");//打开时清空,以覆盖方式,可读可写打开文件if(fp == NULL){perror("fopen");return -1;}//1.打开后,文件流指针为0	printf("after fopen,point = %ld\n",ftell(fp));//2.写入数据后,文件流指针偏移n个字节fwrite("12345",strlen("12345"),1,fp);fflush(fp);printf("after write 12345,point = %ld\n",ftell(fp));//3.写完后读取,需要将流指针重置位置rewind(fp);	fread(read_buf,100,1,fp);printf("now file data is %s\n",read_buf);memset(read_buf,0,sizeof(read_buf));//4.将流指针指向头,流指针变为0rewind(fp);printf("after rewind,point = %ld\n",ftell(fp));//写入是在流指针位置开始写入,这会覆盖数据fwrite("ab",strlen("ab"),1,fp);fflush(fp);rewind(fp);	fread(read_buf,100,1,fp);printf("now file data is %s\n",read_buf);	memset(read_buf,0,sizeof(read_buf));//5.fseek测试//将流指针指向ab345的bfseek(fp,1,SEEK_SET);fread(read_buf,100,1,fp);//读取之后流指针指向了5后面printf("after fseek->b,read data is %s\n",read_buf);memset(read_buf,0,sizeof(read_buf));fread(read_buf,100,1,fp);//printf("again read,read data is %s\n",read_buf);//memset(read_buf,0,sizeof(read_buf));//将流指针指向ab345的5fseek(fp,-1,SEEK_CUR);fread(read_buf,100,1,fp);printf("after fseek->5,read data is %s\n",read_buf);memset(read_buf,0,sizeof(read_buf));//关闭文件fclose(fp);return 0;
}

代码运行结果如下:

格式化输入输出

1、格式化输出

1.1 格式化输出的函数声明如下:

//将内容输出到屏幕
int printf(const char *format, ...);//将内容输出到文件
int fprintf(FILE *stream, const char *format, ...);//将内容输出到指定字符数组
int sprintf(char *str, const char *format, ...);

返回值:成功返回输出字符的个数,失败返回EOF

stream:要进行操作的文件流指针

str:要进行操作的字符数组指针

注意:fprintf也是从当前流指针位置开始写入

1.2 格式化输出实验

具体代码实现如下:

#include <stdio.h>
#include <string.h>
#include <errno.h>int main(){FILE* fp = NULL;char buf[100] = {0};	//打开文件fp = fopen("./file","w+");//打开时清空,以覆盖方式,可读可写打开文件if(fp == NULL){perror("fopen");return -1;}//printfprintf("printf:%s\n","this is printf");//将字符串打印到屏幕//sprintfsprintf(buf,"%s","this is sprintf");//将字符串写进buf中printf("sprintf:%s\n",buf);memset(buf,0,sizeof(buf));//fprintffprintf(fp,"%s","this is fprintf");//将字符串写进fp指向的文件中fflush(fp);rewind(fp);fread(buf,sizeof(char),100,fp);printf("fprintf:%s\n",buf);memset(buf,0,sizeof(buf));//关闭文件fclose(fp);return 0;
}

代码运行结果如下:

2、格式化输入

2.1 格式化输入的函数声明如下:

//从标准输入上获取数据
int scanf(const char *format, ...);//从文件中获取数据
int fscanf(FILE *stream, const char *format, ...);//从字符串中获取数据
int sscanf(const char *str, const char *format, ...);

返回值:成功返回读取的数据个数,失败返回EOF

stream:从哪个文件获取数据

str:从哪个字符数组获取数据

注意:fscanf与sscanf会将存储空间先清空,再存入读取的值

注意:fscanf也是从当前流指针位置开始读取

sscanf这种格式化输入应用见b站视频,链接如下:

4.3.2蓝桥杯嵌入式组_串口接收数据解析(不定长)_哔哩哔哩_bilibili

2.2 格式化输入实验

具体代码实现如下:

#include <stdio.h>
#include <string.h>
#include <errno.h>int main(){FILE* fp = NULL;char buf[100] = {0};	//打开文件fp = fopen("./file","w+");//打开时清空,以覆盖方式,可读可写打开文件if(fp == NULL){perror("fopen");return -1;}//scanfscanf("%s",buf);printf("scanf:%s\n",buf);memset(buf,0,sizeof(buf));//sscanfsscanf("abcdef:123:xxx","%[^:]",buf);printf("sscanf:%s\n",buf);memset(buf,0,sizeof(buf));//fscanffwrite("this is fscanf\n",strlen("this is fscanf\n"),1,fp);rewind(fp);fscanf(fp,"%s",buf);printf("fscanf:%s\n",buf);//关闭文件fclose(fp);return 0;
}

代码执行结果如下:

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

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

相关文章

排序算法Java实现

文章目录 排序算法概述比较排序算法非比较排序算法稳定 vs 不稳定Java 中的排序 外部排序1) 冒泡排序2) 选择排序3) 堆排序4) 插入排序5) 希尔排序6) 归并排序递归实现时间复杂度非递归实现 7) 归并插入8) 快速排序随机基准点处理重复值 9) 计数排序10) 桶排序11) 基数排序 排序…

Redmi Note 7 Pro(violet)免授权9008文件分享及刷机教程

获取文件 关注微信公众号 heStudio Community回复 violet_9008 获取下载链接。 刷机教程 下载搞机助手&#xff08;可以从上方文件中获取&#xff09;并安装。手机按音量减键和电源键进入 Fastboot 模式&#xff0c; 打开搞机助手&#xff0c;点击进入 9008 模式 等待手机…

功能强大的项目管理平台通常融合多种方法论,系统化解决项目管理难点

难、质量管理难等难点&#xff0c;使用科学的方法论配合专业的项目管理工具&#xff0c;能够更快更好管理项目&#xff0c;提高项目成功率。 那么项目管理的不同阶段分别会用到哪些关键方法论呢&#xff1f; 例如&#xff1a;启动阶段&#xff0c;会用到SMART目标原则制定合理且…

C# winforms 使用菜单和右键菜单

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

20240924替换电脑微信消息提示音

一.准备工作 1.先关闭电脑微信,退出进程 2.打开资源管理器,找到微信的安装位置,进入微信软件的资源目录,找到"WeChatResource.dll"文件 3.将"WeChatResource.dll"文件复制2份,其中一份复制到桌面(用作等下修改),另一份任意保存起来(用作保存原始文件,防止出…

如何使用MacPorts安装tesseract来进行简单的OCR识别

希望文章能给到你启发和灵感&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏 支持一下博主吧&#xff5e; 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、下载MacPorts三、如何使用macPorts安装Tesseract四、 配置并使用Tesseract五、最…

excel 时间戳与日期转换

使用 函数&#xff1a; TEXT((C1/100028800)/8640025569,"yyyy/mm/dd HH:MM:ss.000") 因为咱们的时间戳是从 1970-1-1 08:00:00 开始计算的&#xff0c;所以需要对咱们的列处理&#xff1a; 28800 是代表 1970年1月1号的8点&#xff0c; 8个小时是28800秒&#xff…

python爬虫:从12306网站获取火车站信息

代码逻辑 初始化 (init 方法)&#xff1a; 设置请求头信息。设置车站版本号。 同步车站信息 (synchronization 方法)&#xff1a; 发送GET请求获取车站信息。返回服务器响应的文本。 提取信息 (extract 方法)&#xff1a; 从服务器响应中提取车站信息字符串。去掉字符串末尾的…

OpenCV图像分割(1)图像分割函数grabCut()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 运行 GrabCut 算法。 该函数实现了 GrabCut 图像分割算法 OpenCV 中的 grabCut() 函数是一种用于图像分割的技术&#xff0c;它可以帮助用户从图…

stable diffusion这个插件牛,高清【图片换脸】,高清【视频换脸】 一键完成!

前言 最近发现一个很不错的sdwebui的插件&#xff0c;不仅能完成图片换脸&#xff0c;还能进行视频换脸&#xff0c;而且效果比之前的 faceid和reactor要好很多&#xff0c;更像更高清&#xff0c;哈哈&#xff0c;废话不多说&#xff0c;直接上干货~插件是 easyPhoto&#xff…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 9月24日,星期二

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年9月24日 星期二 农历八月廿二 1、 外卖新规征求意见&#xff1a;规范外卖满减、起送费等机制&#xff0c;剑指餐饮浪费。 2、 发改委&#xff1a;预计全年将实现200万辆低排放标准乘用车退出。 3、 商务部&#xff1a;中…

高通平台Android源码下载

1&#xff09;、打开&#xff1a;Android releases | CodeLinaro Wiki&#xff0c;选择相应的硬件版本Android系统 2&#xff09;、repo 源码 repo init --depth1 -u https://git.codelinaro.org/clo/la/platform/manifest.git -b release -m LA.UM.8.6.2.c31-03300-89xx.0.xm…

智算中心动环监控:构建高效、安全的数字基础设施@卓振思众

在当今快速发展的数字经济时代&#xff0c;智算中心作为人工智能和大数据技术的核心支撑设施&#xff0c;正日益成为各行业实现智能化转型的重要基石。为了确保这些高性能计算环境的安全与稳定&#xff0c;卓振思众动环监控应运而生&#xff0c;成为智算中心管理的重要组成部分…

论文复现| Free-Form Image Inpainting with Gated Convolution

论文地址具有上下文注意的生成图像修复 论文代码:GitHub 01配置环境 根据原文代码中read me中要求&#xff0c;进行环境配置以及包的安装。 Run 安装python3。 安装tensorflow(在1.3.0,1.4.0,1.5.0,1.6.0,1.7.0版本上进行了测试)。 安装tensorflow工具包neuralgym(运行pi…

【零基础入门AI:83%的文本推荐系统都在用的算法 TF-IDF】

什么是推荐系统&#xff1f; 在如今这个信息爆炸的时代&#xff0c;推荐系统是根据用户的信息或者行为&#xff0c;向用户推荐用户可能会感兴趣的内容。其中基于文本的推荐系统&#xff0c;比如搜索引擎&#xff0c;头条、微信这类资讯类应用的搜索功能&#xff0c;就是在一个…

图表示学习中的Transformer:Graphormer的突破

人工智能咨询培训老师叶梓 转载标明出处 在自然语言处理和计算机视觉等领域&#xff0c;Transformer架构已经成为主导选择。然而&#xff0c;在图级别的预测任务中&#xff0c;它的表现并不如主流的图神经网络&#xff08;GNN&#xff09;变体。这一现象引发了一个思考&#x…

轻松重置 MySQL 8.0 Root 密码的简便方法!

在Windows环境下安装MySQL数据后&#xff0c;如果忘记了 MySQL 8.0 的 root 密码&#xff0c;不必担心&#xff01;通过 --skip-grant-tables 和 named-pipe 模式登录后&#xff0c;只需几步简单的 SQL 命令即可重置密码&#xff1a;刷新权限表、修改密码、再刷新权限&#xff…

SpringBoot | Maven快速上手

文章目录 一、Maven1.1 Maven 简介&#xff1a;1.2 Maven 的核心功能&#xff1a;1.2.1 项目构建&#xff1a;1.2.2 依赖管理&#xff1a; 1.3 Maven 仓库&#xff1a;1.3.1 本地仓库&#xff1a;1.3.2 中央仓库&#xff1a;1.3.3 私服&#xff1a; 二、第一个 SpringBoot 程序…

数据处理与统计分析篇-day09-数据透视表与日期时间处理

一. 数据透视表 概述 数据透视表&#xff08;Pivot Table&#xff09;是一种交互式的表&#xff0c;可以进行某些计算&#xff0c;如求和与计数等。 所进行的计算与数据跟数据透视表中的排列有关。之所以称为数据透视表&#xff0c;是因为可以动态地改变它们的版面布置&#…

智慧水利采砂船在线监控平台:构建高效、智能的河道采砂监管体系

随着科技的不断发展&#xff0c;水利行业的智慧化转型也日益受到重视。智慧水利采砂船在线监控平台便是这一转型的重要成果之一。该平台主要服务于水政执法人员&#xff0c;针对取得河道采砂许可证的采砂公司及采砂船&#xff0c;实施在线自动监控&#xff0c;旨在提高监管效率…