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

C语言文件操作:标准库与系统调用实践

目录

1、C语言标准库文件操作

1.1.题目要求:

1.2.函数讲解:

fopen

函数原型

参数

常用的打开模式

返回值

fwrite函数

函数原型

参数

返回值

注意事项

fseek函数

函数原型

参数

返回值

fread函数

函数原型

参数

返回值

fclose 函数

函数原型

参数

返回值

1.3.代码:

2、系统调用文件操作

2.1.作业内容

2.2.函数讲解

open 函数

函数原型

参数

返回值

write函数

函数原型

参数

返回值

read 函数

1. 函数原型

2. 参数

3. 返回值

2.3.代码:

运行效果:

1、C语言标准库文件操作

1.1.题目要求:

1.考察fopen, fread, fwrite, fseek, fclose等函数的使用

2.要求:

2.1使用代码打开当前路径下的“bite”文件(如果文件不存在在创建文件),向文件当中写入“linux so easy!”.

2.2 在从文件当中读出文件当中的内容, 打印到标准输出当中; 关闭文件流指针

1.2.函数讲解:

fopen

fopen 是 C 语言标准库中的一个函数,用于打开文件,并返回一个指向 FILE 结构的指针,该指针用于后续的文件操作。如果文件打开失败,fopen 会返回 NULL

函数原型

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

参数

  • filename:要打开的文件的名称(包括路径,如果文件不在当前目录下)。
  • mode:打开文件的模式,决定了文件是以只读、只写、读写、追加等哪种方式被打开。模式字符串还可以包含字符 b,表示以二进制模式打开文件(在 Windows 上很重要,因为 Windows 默认以文本模式打开文件,可能会对换行符进行转换)。

常用的打开模式

  • "r":只读模式。文件必须存在。
  • "w":只写模式。如果文件存在,其内容会被清空;如果文件不存在,会创建新文件。
  • "a":追加模式。如果文件存在,写入的数据会被追加到文件末尾;如果文件不存在,会创建新文件。
  • "r+":读写模式。文件必须存在。
  • "w+":读写模式。如果文件存在,其内容会被清空;如果文件不存在,会创建新文件。
  • "a+":读写模式。如果文件存在,写入的数据会被追加到文件末尾,同时允许读取文件;如果文件不存在,会创建新文件。

返回值

  • 成功时,返回一个指向 FILE 结构的指针,该指针用于后续的文件操作。
  • 失败时,返回 NULL,并设置全局变量 errno 以指示错误类型。

fwrite函数

fwrite 函数是 C 语言标准库中的一个函数,用于将数据从内存写入到文件中。它是文件 I/O(输入/输出)操作的一部分,常用于二进制文件的写入。

函数原型

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

参数

  • ptr:指向要写入文件的数据的指针。这通常是一个数组或内存块的地址。
  • size:每个数据项的大小(以字节为单位)。
  • nmemb:要写入的数据项的数量。
  • stream:指向 FILE 结构的指针,该指针标识了目标文件流。这个指针通常是通过 fopen 函数获得的。

返回值

  • 成功时,返回实际写入的数据项的数量。这个值通常与 nmemb 相同,除非在写入过程中发生了错误或到达了文件末尾(对于非阻塞 I/O 或某些特殊设备文件,这可能会发生)。
  • 失败时,返回一个小于 nmemb 的值,并且会设置全局变量 errno 以指示错误类型。然而,对于普通的文件写入操作,fwrite 通常要么成功写入所有请求的数据项,要么在遇到不可恢复的错误时返回 0。

注意事项

  • fwrite 并不保证将数据实际写入到物理存储设备上;它只是将数据写入到文件系统的缓冲区中。为了确保数据被持久化,你可能需要调用 fflush 函数来刷新输出缓冲区,或者在文件关闭后依赖操作系统的自动刷新机制。
  • 在写入二进制文件时,使用 "wb" 模式打开文件是很重要的,其中 "b" 表示二进制模式。这可以防止在某些操作系统(如 Windows)上对换行符进行不必要的转换。
  • 如果 fwrite 返回的值小于 nmemb,你应该检查 errno 来确定是否发生了错误,并采取相应的错误处理措施。

fseek函数

fseek 函数是 C 语言标准库中的一个函数,用于在文件中定位流的位置。它允许你根据指定的起始点和偏移量来移动文件内部的位置指针,从而实现对文件的随机访问。

函数原型

c复制代码

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

参数

  • stream:指向 FILE 结构的指针,该指针标识了目标文件流。这个指针通常是通过 fopen 函数获得的。
  • offset:要移动的字节数。整数表示正向移动,负数表示负向移动。
  • whence:指定起始位置的参数,决定了 offset 是相对于哪个位置进行移动的。它可以是以下三个常量之一:
    • SEEK_SET:文件的开头。此时 offset 应为正数或零。
    • SEEK_CUR:文件的当前位置。此时 offset 可以是正数(向前移动)或负数(向后移动)。
    • SEEK_END:文件的末尾。此时 offset 通常为负数(向前移动),因为文件末尾之后没有数据可以正向移动。

返回值

  • 成功时,返回 0。
  • 失败时,返回非零值,并设置全局变量 errno 以指示错误类型。常见的错误包括无效的流指针、无效的起始点参数,或试图移动到一个无效的文件位置(如负位置或超出文件大小的位置)。

fread函数

fread 函数是 C 语言标准库中的一个函数,用于从文件中读取数据到内存中。它是文件 I/O(输入/输出)操作的一部分,常用于二进制文件的读取。

函数原型

c

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

参数

  • ptr:指向内存块的指针,该内存块用于存储从文件中读取的数据。这通常是一个数组的地址。
  • size:每个数据项的大小(以字节为单位)。
  • nmemb:要读取的数据项的数量。
  • stream:指向 FILE 结构的指针,该指针标识了源文件流。这个指针通常是通过 fopen 函数获得的。

返回值

  • 成功时,返回实际读取的数据项的数量。这个值可能小于 nmemb,如果到达了文件末尾或发生了其他读取错误(尽管对于普通的文件读取操作,fread 通常要么成功读取所有请求的数据项,要么在遇到文件末尾时返回实际读取的项数,要么在发生不可恢复的错误时返回 0)。
  • 失败时(即返回 0 且不是由于到达文件末尾),返回 0,并设置全局变量 errno 以指示错误类型。

fclose 函数

是 C 语言标准库中的一个函数,用于关闭一个打开的文件流,并释放与该文件流相关的资源。它是文件 I/O(输入/输出)操作的一部分,通常在完成对文件的读写操作后调用。

函数原型

c复制代码

int fclose(FILE *stream);

参数

  • stream:指向 FILE 结构的指针,该指针标识了要关闭的文件流。这个指针通常是通过 fopenfreopen 或 tmpfile 函数获得的。

返回值

  • 成功时,返回 0。
  • 失败时,返回 EOF(通常定义为 -1),并设置全局变量 errno 以指示错误类型。常见的错误包括无效的流指针或底层 I/O 错误。

1.3.代码:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>int main() {// 文件指针FILE *file;// 要写入文件的内容const char *contentToWrite = "linux so easy!";// 分配一个缓冲区来存储从文件中读取的内容char buffer[256];// 2.1 打开(或创建)文件file = fopen("bite", "w+"); // "w+" 模式表示读写,如果文件不存在则创建if (file == NULL) {perror("Error opening file");return EXIT_FAILURE;}// 写入内容到文件size_t bytesWritten = fwrite(contentToWrite, sizeof(char), strlen(contentToWrite), file);if (bytesWritten != strlen(contentToWrite)) {perror("Error writing to file");fclose(file);return EXIT_FAILURE;}// 将文件指针重置到文件开头,以便读取if (fseek(file, 0, SEEK_SET) != 0) {perror("Error seeking in file");fclose(file);return EXIT_FAILURE;}// 从文件中读取内容size_t bytesRead = fread(buffer, sizeof(char), sizeof(buffer) - 1, file);if (ferror(file)) {perror("Error reading from file");fclose(file);return EXIT_FAILURE;}// 确保字符串以null字符结尾buffer[bytesRead] = '\0';// 打印读取到的内容到标准输出printf("Read from file: %s\n", buffer);// 关闭文件if (fclose(file) != 0) {perror("Error closing file");return EXIT_FAILURE;}return EXIT_SUCCESS;
}

2、系统调用文件操作

2.1.作业内容

1.考察open, read, write, lseek, close等函数的使用。同时理解文件描述符

2.要求:

2.1 使用代码打开当前路径下的“bite”文件(如果文件不存在在创建文件),向文件当中写入“i like linux!”.

2.2 在从文件当中读出文件当中的内容, 打印到标准输出当中; 关闭文件描述符

2.2.函数讲解

open 函数

是 Unix 和类 Unix 操作系统(如 Linux 和 macOS)中用于打开和可能创建文件的系统调用或库函数。在 C 语言编程中,它通常通过 <fcntl.h> 头文件声明,并用于返回一个文件描述符,该描述符用于后续的文件操作,如读取、写入和文件定位。

函数原型

在 POSIX 标准中,open 函数的原型如下:

c复制代码

#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int open(const char *pathname, int flags, mode_t mode);

参数

  • pathname:要打开或创建的文件的路径名。
  • flags:用于指定打开文件时的行为的一组标志。这些标志可以单独使用,也可以通过按位或(|)运算符组合使用。常见的标志包括:
    • O_RDONLY:以只读方式打开文件。
    • O_WRONLY:以只写方式打开文件。
    • O_RDWR:以读写方式打开文件。
    • O_CREAT:如果文件不存在,则创建文件。使用此标志时,必须提供 mode 参数。
    • O_TRUNC:如果文件已存在且为写模式打开,则将其长度截断为 0。
    • O_APPEND:以追加模式打开文件。写入的数据将添加到文件末尾,而不是覆盖现有数据。
    • 其他标志,如 O_EXCL(与 O_CREAT 一起使用时,如果文件已存在,则调用失败)和 O_NONBLOCK(用于非阻塞 I/O 操作)等。
  • mode:设置文件权限(当使用 O_CREAT 标志时)。这是一个 mode_t 类型的值,通常使用八进制数表示,如 0644(用户读写,组读,其他读)。

返回值

  • 成功时,open 返回一个非负的文件描述符。
  • 失败时,返回 -1,并设置全局变量 errno 以指示错误类型。

write函数

write 函数是 Unix 和类 Unix 操作系统(例如 Linux 和 macOS)中用于向文件或设备写入数据的系统调用。在 C 语言编程中,它通常通过 <unistd.h> 头文件声明,并接受一个文件描述符、一个指向要写入数据的指针以及要写入的数据量作为参数。

函数原型

c复制代码

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);

参数

  • fd:要写入的文件的文件描述符,该描述符是通过 openduppipesocket 等系统调用获得的。
  • buf:指向要写入数据的缓冲区的指针。
  • count:要写入的数据的字节数。

返回值

  • 成功时,write 返回实际写入的字节数。这个值可能小于请求写入的字节数(例如,如果磁盘已满或达到了文件大小限制)。
  • 失败时,返回 -1,并设置全局变量 errno 以指示错误类型。

read 函数在不同的编程环境中具有不同的实现和用途,但通常都用于从某种数据源(如文件、套接字或内存缓冲区)读取数据。以下是关于 read 函数的一些通用信息和示例:

read 函数

在Unix和类Unix操作系统(如Linux)的C语言编程中,read 函数是一个系统调用,用于从文件描述符指向的文件或设备中读取数据。

1. 函数原型

解释

c复制代码

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
2. 参数
  • fd:文件描述符,表示要读取的文件或设备。
  • buf:指向缓冲区的指针,用于存储读取的数据。
  • count:要读取的字节数。
3. 返回值
  • 成功时,返回实际读取的字节数(可能小于请求的字节数,特别是在读取到文件末尾时)。
  • 失败时,返回 -1,并设置全局变量 errno 以指示错误类型。

2.3.代码:
 

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define BUFFER_SIZE 1024int main()
{int fd;ssize_t bytesRead, bytesWritten;char buffer[BUFFER_SIZE];const char *text = "i like linux!";// 打开(或创建)“bite”文件,使用O_WRONLY | O_CREAT | O_TRUNC标志fd = open("bite", O_WRONLY | O_CREAT | O_TRUNC, 0666);if (fd == -1){perror("打开文件失败");exit(EXIT_FAILURE);}// 写入文本到文件bytesWritten = write(fd, text, strlen(text));if (bytesWritten == -1){perror("写入文件失败");close(fd);exit(EXIT_FAILURE);}// 关闭并重新打开文件以读取close(fd);fd = open("bite", O_RDONLY);if (fd == -1){perror("重新打开文件失败");exit(EXIT_FAILURE);}// 读取文件内容并打印到标准输出bytesRead = read(fd, buffer, BUFFER_SIZE - 1);if (bytesRead == -1){perror("读取文件失败");close(fd);exit(EXIT_FAILURE);}// 确保字符串以null字符结尾buffer[bytesRead] = '\0';printf("文件内容: %s\n", buffer);// 关闭文件close(fd);return 0;
}

运行效果:

成功,并且也成功创建了文件bite

相关文章:

C语言文件操作:标准库与系统调用实践

目录 1、C语言标准库文件操作 1.1.题目要求&#xff1a; 1.2.函数讲解&#xff1a; fopen 函数原型 参数 常用的打开模式 返回值 fwrite函数 函数原型 参数 返回值 注意事项 fseek函数 函数原型 参数 返回值 fread函数 函数原型 参数 返回值 fclose 函数…...

代码随想录 栈与队列 test 7

347. 前 K 个高频元素 - 力扣&#xff08;LeetCode&#xff09; 首先想到哈希&#xff0c;用key来存元素&#xff0c;value来存出现次数&#xff0c;最后进行排序&#xff0c;时间复杂度约为o(nlogn)。由于只需求前k个&#xff0c;因此可以进行优化&#xff0c;利用堆来维护这…...

C语言练习(21)

有一行电文&#xff0c;已按下面规律译成密码&#xff1a; A→Za→Z B→Yb→y C→Xc→X 即第1个字母变成第26个字母&#xff0c;第2个字母变成第25个字母&#xff0c;第i个字母变成第&#xff08;26-i十1&#xff09;个字母。非字母字符不变。假如已知道密码是Umtorhs&…...

智能手机“混战”2025:谁将倒下而谁又将突围?

【潮汐商业评论原创】 “去年做手机比较艰难&#xff0c;几乎每个品牌都在调价、压货&#xff0c;像华为这种以前都不给我们分货的厂商&#xff0c;也开始成为我的主要库存。不过今年开头比较好&#xff0c;20号国补一开始&#xff0c;店里的人流和手机销量就明显涨了不少&…...

计算机图形学:实验一 OpenGL基本绘制

1.OpenGL的环境配置&#xff1a; 集成开发环境Visual Studio Community 2019的安装&#xff1a; 在Windows一栏选择使用C的桌面开发&#xff1b;再转到“单个组件”界面&#xff0c;在“编译器、生成工具和运行时”一栏选择用于“Windows的C CMake工具”&#xff1b;然后转到…...

二分查找题目:快照数组

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;快照数组 出处&#xff1a;1146. 快照数组 难度 7 级 题目描述 要求 实现支持下列接口的快照数组&#xff1a; SnapshotArray(int length) \textt…...

深度学习|表示学习|卷积神经网络|参数共享是什么?|07

如是我闻&#xff1a; Parameter Sharing&#xff08;参数共享&#xff09;是卷积神经网络&#xff08;CNN&#xff09;的一个重要特性&#xff0c;帮助它高效地处理数据。参数共享的本质就是参数“本来也没有变过”。换句话说&#xff0c;在卷积层中&#xff0c;卷积核的参数&…...

基于相机内参推导的透视投影矩阵

基于相机内参推导透视投影矩阵&#xff08;splatam&#xff09;&#xff1a; M c a m [ 2 ⋅ f x w 0.0 ( w − 2 ⋅ c x ) w 0.0 0.0 2 ⋅ f y h ( h − 2 ⋅ c y ) h 0.0 0 0 f a r n e a r n e a r − f a r 2 f a r ⋅ n e a r n e a r − f a r 0.0 0.0 − 1.0 0.0 ] M_…...

浅析Dubbo 原理:架构、通信与调用流程

一、Dubbo 简介 Dubbo 是阿里巴巴开源的高性能、轻量级的 Java RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;框架&#xff0c;旨在实现不同服务之间的远程通信和调用。在分布式系统中&#xff0c;不同服务可能部署在不同的服务器上&#xff0c;D…...

03垃圾回收篇(D3_垃圾收集器的选择及相关参数)

目录 学习前言 一、收集器的选择 二、GC日志参数 三、垃圾收集相关的常用参数 四、内存分配与回收策略 1. 对象优先在Eden分配 2. 大对象直接进入老年代 3. 长期存活的对象将进入老年代 4. 动态对象年龄判定 5. 空间分配担保 学习前言 本章主要学习垃圾收集器的选择及…...

一、引论,《组合数学(第4版)》卢开澄 卢华明

零、前言 发现自己数数题做的很烂&#xff0c;重新学一遍组合数学吧。 参考卢开澄 卢华明 编著的《组合数学(第4版)》&#xff0c;只打算学前四章。 通过几个经典问题来了解组合数学所研究的内容。 一、幻方问题 据说大禹治水之前&#xff0c;河里冒出来一只乌龟&#xff0c…...

Vue3+TS 实现批量拖拽文件夹上传图片组件封装

1、html 代码&#xff1a; 代码中的表格引入了 vxe-table 插件 <Tag /> 是自己封装的说明组件 表格列表这块我使用了插槽来增加扩展性&#xff0c;可根据自己需求&#xff0c;在组件外部做调整 <template><div class"dragUpload"><el-dialo…...

二叉树的所有路径(力扣257)

因为题目要求路径是从上到下的&#xff0c;所以最好采用前序遍历。这样可以保证按从上到下的顺序将节点的值存入一个路径数组中。另外&#xff0c;此题还有一个难点就是如何求得所有路径。为了解决这个问题&#xff0c;我们需要用到回溯。回溯和递归不分家&#xff0c;每递归一…...

Python OrderedDict 实现 Least Recently used(LRU)缓存

OrderedDict 实现 Least Recently used&#xff08;LRU&#xff09;缓存 引言正文 引言 LRU 缓存是一种缓存替换策略&#xff0c;当缓存空间不足时&#xff0c;会移除最久未使用的数据以腾出空间存放新的数据。LRU 缓存的特点&#xff1a; 有限容量&#xff1a;缓存拥有固定的…...

LabVIEW项目中的工控机与普通电脑选择

工控机&#xff08;Industrial PC&#xff09;与普通电脑在硬件设计、性能要求、稳定性、环境适应性等方面存在显著差异。了解这些区别对于在LabVIEW项目中选择合适的硬件至关重要。下面将详细分析这两种设备的主要差异&#xff0c;并为LabVIEW项目中的选择提供指导。 ​ 硬件设…...

Ansys Speos | Speos Meshing 网格最佳实践

概述 网格划分是在各种计算应用中处理3D几何的基本步骤&#xff1a; 表面和体积&#xff1a;网格允许通过将复杂的表面和体积分解成更简单的几何元素&#xff08;如三角形、四边形、四面体或六面体&#xff09;来表示复杂的表面和体积。 模拟和渲染&#xff1a;网格是创建离散…...

elasticsearch segment数量对读写性能的影响

index.merge.policy.segments_per_tier 是一个配置选项&#xff0c;用于控制 Elasticsearch 中段&#xff08;segment&#xff09;合并策略的行为。它定义了在每一层的段合并过程中&#xff0c;允许存在的最大段数量。调整这个参数可以优化索引性能和资源使用。 假设你有一个索…...

全同态加密理论、生态现状与未来展望(中2)

《全同态加密理论、生态现状与未来展望》系列由lynndell2010gmail.com和mutourend2010gmail.com整理原创发布&#xff0c;分为上中下三个系列&#xff1a; 全同态加密理论、生态现状与未来展望&#xff08;上&#xff09;&#xff1a;专注于介绍全同态加密理论知识。全同态加密…...

鸿蒙UI(ArkUI-方舟UI框架)-开发布局

返回主章节 → 鸿蒙UI&#xff08;ArkUI-方舟UI框架&#xff09; 开发布局 1、布局概述 1&#xff09;布局结构 2&#xff09;布局元素组成 3&#xff09;如何选择布局 声明式UI提供了以下10种常见布局&#xff0c;开发者可根据实际应用场景选择合适的布局进行页面开发。 …...

RPC是什么?和HTTP区别?

RPC 是什么&#xff1f;HTTP 是什么&#xff1f; 作为一个程序员&#xff0c;假设我们需要从A电脑的进程发送一段数据到B电脑的进程&#xff0c;我们一般会在代码中使用 Socket 进行编程。 此时&#xff0c;可选性一般就是 TCP 和 UDP 二选一&#xff0c;由于 TCP 可靠、UDP 不…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...