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

Linux:基础IO

一:理解文件

1-1 狭义理解

文件存储在磁盘中,由于磁盘是永久性存储介质,因此文件在磁盘上的存储是永久性的;磁盘也是外设,因此磁盘上对文件的所有操作本质是对外设的输入和输出

1-2 广义理解

Linux下一切皆文件(键盘,显示器,网卡......)

1-3 文件操作的归类认知

  • 对应0KB的空文件是占用磁盘空间的
  • 文件是文件属性和文件内容的集合(文件 = 内容 + 属性)
  • 所有的文件操作本身是对文件内容和文件属性的操作

1-4 系统角度

  • 对文件的操作本质是进程对文件的操作
  • 磁盘的管理者是操作系统
  • 文件的读写本质不是通过C语言/C++的库函数来操作的,而是通过文件相关的系统调用接口来实现的

二 :C语言接口

2-1 fopen

函数原型:

#include<stdio.h>

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

参数说明: 

  • filename:要打开的文件名称
  • mode:文件打开模式 
模式说明文件不存在时文件存在时
"r"只读模式,从文件头部开始读取打开失败正常打开
"w"写入模式,清空原内容或创建新文件创建新文件清空原内容
"a"追加模式,在文件末尾添加内容创建新文件保留原有内容
"r+"读写模式,从文件头部开始读写打开失败正常打开
"w+"读写模式,清空原内容或创建新文件创建新文件清空原内容
"a+"读写模式,在文件末尾添加内容创建新文件保留原有内容

“w”写入模式:

  1 #include<stdio.h>2 #include<string.h>3 4 int main()5 {6     FILE* fp = fopen("log.txt","w");7     if(fp == NULL)8     {9         perror("fopen");10         return 1;11     }12 13     fclose(fp);14     return 0;15 }

如上面代码所示,我们在myfile.c中使用写入模式打开log.txt文件,然后往文件写入了内容,文件大小为65,然后我们再次运行该可执行文件myfile,log.txt文件大小就被清空为0了。因此以写入模式“w”打开以存在的文件会将文件内容情况

 

 

 “a”追加模式:

  1 #include<stdio.h>2 #include<string.h>3 4 int main()5 {6     FILE* fp = fopen("log.txt","a");7     if(fp == NULL)8     {9         perror("fopen");10         return 1;11     }12 13     const char* msg = "hello world\n";14     fprintf(fp,"%s",msg);15 16     fclose(fp);17     return 0;18 }

如上面代码所示:我们以“a”追加模式打开文件log.txt,并且我们将字符串msg(hello world)写入到fp指向的文件中,即log.txt。因此第一次打印log.txt文件中的内容为hello world,然后我们执行了三次可执行文件myfile,由于我们使用追加模式打开log.txt,因此会再次执行三次将字符串写入到log.txt文件的操作

 返回值:

  • 成功:返回一个指向FILE对象的指针
  • 失败:返回NULL,并设置全局变量errno以指示错误类型 

2-2 fwrite 

 函数原型:

#include<stdio.h>

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

参数说明:

  • ptr:指向要写入数据的内存地址,类型为const void*,可接受任意类型的指针类型
  • size:要写入数据项的最小单元大小(以字节为单位)
  • count:要写入的数据项的个数
  • stream:文件指针,指向已打开的文件

返回值:

  • 成功:返回实际写入的数据项个数,即count
  • 失败:返回值小于count

2-3 fclose 

函数原型:

#include<stdio.h>

int fclose(FILE* stream);

参数说明:

  • stream:指向已打开的文件的FILE指针

返回值:

  • 成功:返回0
  • 失败:返回EOF(通常为-1),并设置全局变量errno以指示错误类型

例子:

  1 #include<stdio.h>2 #include<string.h>3 4 int main()5 {6     FILE* fp = fopen("log.txt","w");7     if(fp == NULL)8     {9         perror("fopen");10         return 1;11     }12 13     const char* msg = "hello world";14     int cnt = 1;15     while(cnt <= 5)16     {17         char buffer[1024];18         snprintf(buffer,sizeof(buffer),"%s%d\n",msg,cnt++);19         fwrite(buffer,strlen(buffer),1,fp);20     }21 22     fclose(fp);23     return 0;24 }

在上面代码中,我们以写入模式("w")打开log.txt文件,如果该文件不存在则创建,存在则清空内容,检查文件是否成功打开,失败是通过perror输出错误信息并退出程序。接下来每次循环将msg和计数器cnt组合成新字符串,存入buffer数组中。fwrite会将buffer里的字符串内容写入到fp所指向的文件中,即将buffer起始开始的,长度为strlen(buffer)字节的数据写入文件,最后关闭文件

三:系统文件IO

3-1 open

函数原型:

#include<sys/types.h>

#include<sys/sta.h>

#include<fcntl.h>

int open(const char* pathname,int flags);//打开以存在的文件

int open(const char* pathname,int flags,mode_t mode);//新建文件

参数说明:

  • pathname:文件路径(绝对路径或相对路径)
  • flags:打开模式,常用选项可通过 | 组合      
  • mode:创建文件时的权限位   

 常见选项:

  1.  O_RDONLY:只读模式
  2. O_WRONLY:只写模式
  3. O_RDWR:读写模式
  4. O_CREAT:文件不存在需要新建时表示新建文件
  5. O_APPEND:追加模式
  6. O_TRUNC:情况文件内容

返回值: 

  • 成功:返回文件描述符
  • 失败:返回-1,并设置errno指示错误原因 
例子1: 
  1 #include<stdio.h>2 #include<sys/types.h>3 #include<sys/stat.h>4 #include<fcntl.h>5 6 int main()7 {8     int fd = open("log.txt",O_CREAT | O_WRONLY,0666);9     if(fd < 0)10     {11         perror("open");12         return 1;13     }14 15     return 0;16 }

如上面代码所示:我们使用open函数新建(O_CREAT)并以写入模式(O_WRONLY)打开一个名为log.txt的文件,由于文件新建所以必须设置权限位,我们设置的为0666(读写权限)。

如上图所示,我们可以看到log.txt的权限位为0664而不是我们设置的0666,这是因为存在权限掩码umask

例子2:
  1 #include<stdio.h>2 #include<sys/types.h>3 #include<sys/stat.h>4 #include<fcntl.h>5 #include<unistd.h>6 #include<string.h>7 8 int main()9 {   10     int fd = open("log.txt",O_CREAT | O_WRONLY,0666);11     if(fd < 0)12     {   13         perror("open");14         return 1;15     }16     printf("fd:%d\n",fd);17     18     const char* msg = "hello world\n";19     int cnt = 5;20     while(cnt)21     {   22         write(fd,msg,strlen(msg));23         cnt--;24     }25     26     close(fd);27     return 0;28 }

在上面代码中,使用open函数新建(O_CREAT)并以写入模式(O_WRONLY)打开一个名为log.txt的文件并设置权限位为0666,接着我们往fd指向的文件log.txt中写入五条hello world语句,结果如下图:

将18行和19行改成如下所示:

  

结果如上图所示:我们可以看到第一行的hello world已经变成了abcdo world了,这是因为我们打开文件的模式只是新建和写入模式,没有传入选项O_TRUNC(清空),所以每次打开文件都从起始位置以覆盖式写入,如果我们想要达到在文件原有内容进行写入就需要加上O_TRUNC选项,而想要在文件末尾处进行追加写入,就可以加上O_APPEND(追加)选项

3-2 write 

函数原型:

#include<unistd.h>

ssize_t write(int fd,const void* buf,size_t count);

参数说明:

  •  fd:目标文件描述符
  • buf:指向要写入数据的缓冲区指针
  • count:要写入的字节数

3-3 read

函数原型:

#include<unistd.h>

ssize_t read(int fd,void* buf,size_t count);

参数说明:

  • fd:文件描述符
  • buf:指向用于存储读取数据的缓冲区指针,即输入的内容
  • count:读取的字节数,即输入内容的大小

返回值:

  •  成功:返回实际读取的字节数,0表示读到文件末尾
  • 失败:返回-1,并设置errno

例子: 

  1 #include<stdio.h>2 #include<sys/types.h>3 #include<unistd.h>4 #include<fcntl.h>5 6 int main()7 {8     int fd = open("log.txt",O_RDONLY);9     if(fd < 0)10     {11         perror("open");12         return 1;13     }14     printf("fd:%d\n",fd);15  16     while(1)17     {18         char buffer[64];19         int n = read(fd,buffer,sizeof(buffer)-1);20         if(n > 0)21         {22             buffer[n] = 0;23             printf("%s\n",buffer);24         }25         else if(n == 0)26         {27             break;28         }29     }30     31     close(fd);32     return 0;33 }

在上面代码中,我们使用O_RDONLY(只读模式)打开一个已存在的文件log.txt,如果打开文件失败则退回程序,然后通过在while循环中,定义了一个大小为64字节的数组buffer,从fd指向的文件(即log.txt)中读取内容存放在buffer中,读取的大小不超过63字节,如果读取成功则在数组buffer最后一个位置加上0并打印buffer的内容,如果读取到0(即读取到文件末尾)则跳出循环

3-4close

函数原型:

#include<unistd.h>

int close(int fd);

参数:

fd:要关闭的文件描述符

返回值:

  • 成功:返回0
  • 失败:返回-1,并设置errno

3-5 文件描述符

  1 #include<stdio.h>2 #include<sys/types.h>3 #include<unistd.h>4 #include<fcntl.h>5 6 int main()7 {8     printf("stdin:%d\n",stdin->_fileno);9     printf("stdout:%d\n",stdout->_fileno);10     printf("stderr:%d\n",stderr->_fileno);11 12     int fd = open("log.txt",O_RDONLY);13     if(fd < 0)14     {15         perror("open");16         return 1;17     }18     printf("fd:%d\n",fd);19 20     close(fd);21     return 0;22 }

在上面代码中, 我们先分别打印了标准输入,标准输出,标准错误的文件描述符,_fileno的FILE结构体内部的一个成员,内部存储了文件描述符;然后已只读模式(O_RDONLY)模式打开一个已存在的文件log.txt,接着打印log.txt的文件描述符fd,结果如下图:

如上图所示,我们可以看到标准输入(stdin),标准输出(stdout),标准错误(stderr)的文件描述符分别为0,1,2;而对于其他文件的文件描述符一般都是从3开始计数,如本例中log.txt的文件描述符为3

例子1:

  1 #include<stdio.h>2 #include<sys/types.h>3 #include<unistd.h>4 #include<fcntl.h>5 6 int main()7 {8     close(0);9     int fd = open("log.txt",O_CREAT | O_WRONLY | O_TRUNC,0666);10     if(fd < 0)11     {12         perror("open");13         return 1;14     }15     printf("fd:%d\n",fd);16 17 18     close(fd);19     return 0;20 }

 如上图所示,我们先关闭标准输入(stdin),接着我们以清空写入的模式新建一个权限位为0666的文件log.txt,接着判断是否创建成功并打印log.txt的文件描述符,最后关闭文件。由下图可知,log.txt的文件描述符为0

例子2:

  1 #include<stdio.h>2 #include<sys/types.h>3 #include<unistd.h>4 #include<fcntl.h>5 6 int main()7 {8     close(1);9     int fd = open("log.txt",O_CREAT | O_WRONLY | O_TRUNC,0666);10     if(fd < 0)11     {12         perror("open");13         return 1;14     }15     printf("fd:%d\n",fd);16 17     return 0;18 }

如上图所示,我们先关闭标准输出(stdout),接着我们以清空写入的模式新建一个权限位为0666的文件log.txt,接着判断是否创建成功并打印log.txt的文件描述符,注意这里不用关闭文件。由下图可知,打印log.txt的文件描述符没有任何输出,而打印log.txt文件中的内容时将fd打印出来并且fd为1,也就是说将原本打印在显示器上的内容输出重定向到了log.txt文件中。而在底层,文件描述表中的文件描述符从标准输出指向到 log.txt ,因此从原本输出到显示器上转向为输出到 log.txt中

例子3:

  1 #include<stdio.h>2 #include<sys/types.h>3 #include<unistd.h>4 #include<fcntl.h>5 6 int main()7 {8     close(2);9     int fd = open("log.txt",O_CREAT | O_WRONLY | O_TRUNC,0666);10     if(fd < 0)11     {12         perror("open");13         return 1;14     }15     printf("fd:%d\n",fd);16 17 18     close(fd);19     return 0;20 }

 如上图所示,我们先关闭标准错误(stderr),接着我们以清空写入的模式新建一个权限位为0666的文件log.txt,接着判断是否创建成功并打印log.txt的文件描述符,最后关闭文件。由下图可知,log.txt的文件描述符为2

由上面三个例子可知,文件描述符的分配原则是:系统会将最小的没有被使用的文件描述符作为新的文件描述符分配给用户

3-6 dup2系统调用重定向

函数原型:

#include<unistd.h>

int dup2(int oldfd,int newfd);

将输出到newfd重定向输出到oldfd中

  1 #include<stdio.h>2 #include<sys/types.h>3 #include<unistd.h>4 #include<fcntl.h>5 6 int main()7 {8     9     int fd = open("log.txt",O_CREAT | O_WRONLY | O_TRUNC,0666);10     if(fd < 0)11     {12         perror("open");13         return 1;14     }15     dup2(fd,1);16 17     printf("fd:%d\n",fd);18 19     printf("hello world\n");20     printf("hello world\n");21 22     close(fd);23     return 0;24 }

 如上面代码所示:我们以清空写入的模式新建一个权限位为0666的文件log.txt,接着判断是否创建成功,接着使用dup2将输出到显示器上的内容重定向输出到fd指向的文件中,接着在显示器上打印log.txt的文件描述符并在显示器上打印两行hello world,由于前面进行了重定向操作,所以打印在显示器上的内容将会重定向到 log.txt中,最后关闭文件,结果如下图所示:

相关文章:

Linux:基础IO

一&#xff1a;理解文件 1-1 狭义理解 文件存储在磁盘中&#xff0c;由于磁盘是永久性存储介质&#xff0c;因此文件在磁盘上的存储是永久性的&#xff1b;磁盘也是外设&#xff0c;因此磁盘上对文件的所有操作本质是对外设的输入和输出 1-2 广义理解 Linux下一切皆文件&am…...

MySQL 索引优化以及慢查询优化

在数据库性能优化中&#xff0c;索引优化和慢查询优化是两个关键环节。合理使用索引可以显著提高查询效率&#xff0c;而识别和优化慢查询则能提升整体数据库性能。本文将详细介绍MySQL索引优化和慢查询优化的方法和最佳实践。 一、MySQL 索引优化 1.1 索引的基本概念 索引是…...

Leaflet使用SVG创建动态Legend

接前一篇文章&#xff0c;前一篇文章我们使用 SVG 创建了带有动态文字的图标&#xff0c;今天再看看怎样在地图上根据动态图标生成相关的legend&#xff0c;当然这里也还是使用了 SVG 来生成相关颜色的 legend。 看下面的代码&#xff0c;生成了一个 svg 节点&#xff0c;其中…...

使用 Vue Tour 封装一个统一的页面引导组件

项目开发过程中需要实现用户引导功能&#xff0c;经过调研发现一个好用的 Vue 插件 vue-tour&#xff0c;今天就来分享一下我是如何基于 vue-tour 封装一个统一的引导组件&#xff0c;方便后续在多个页面复用的。 &#x1f4e6; 第一步&#xff1a;安装 vue-tour 插件 首先安装…...

OpenResty 深度解析:构建高性能 Web 服务的终极方案

引言 openresty是什么&#xff1f;在我个人对它的理解来看相当于嵌入了lua的nginx; 我们在nginx中嵌入lua是为了不需要再重新编译,我们只需要重新修改lua脚本,随后重启即可; 一.lua指令序列 我们分别从初始化阶段&#xff0c;重写/访问阶段&#xff0c;内容阶段&#xff0c;日志…...

赋能企业级移动应用 CFCA FIDO+提升安全与体验

移动办公与移动金融为企业有效提升业务丰富性、执行便捷性。与此同时&#xff0c;“安全”始终是移动办公与移动金融都绕不开的话题。随着信息安全技术的发展&#xff0c;企业级移动应用中安全与便捷不再是两难的抉择。 中金金融认证中心&#xff08;CFCA&#xff09;作为经国…...

Redis 数据类型与操作完全指南

Redis 是一个开源的、内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。与传统的关系型数据库不同&#xff0c;Redis 提供了丰富的数据类型和灵活的操作方式&#xff0c;这使得它能够高效地解决各种不同场景下的数据存储和处理问题。本文将全面介绍 R…...

ArrayList-集合使用

自动扩容&#xff0c;集合的长度可以变化&#xff0c;而数组长度不变&#xff0c;集合更加灵活。 集合只能存引用数据类型&#xff0c;不能直接存基本数据类型&#xff0c;除非包装 ArrayList会拿[]展示数据...

深入解析Spring Boot与Redis集成:高效缓存实践

深入解析Spring Boot与Redis集成&#xff1a;高效缓存实践 引言 在现代Web应用开发中&#xff0c;缓存技术是提升系统性能的重要手段之一。Redis作为一种高性能的键值存储数据库&#xff0c;广泛应用于缓存、会话管理和消息队列等场景。本文将详细介绍如何在Spring Boot项目中…...

8天Python从入门到精通【itheima】-11~13

目录 11节-PyCharm的安装和基础使用&#xff1a; 1.第三方IDE&#xff08;集成开发工具&#xff09; 2.PyCharm的所属——jetbrains公司 3.进入jetbrains的官网&#xff0c;搜索下载【官网自带中文&#xff0c;太友好了&#xff0c;爱你&#xff08;づ&#xffe3;3&#x…...

day33-网络编程

1. 网络编程入门 1.1 网络编程概述 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算机系统…...

CMake基础及操作笔记

CMake 基础与操作&#xff1a;从入门到精通 前言 CMake 是一个功能强大、跨平台的构建工具&#xff0c;广泛用于 C 项目管理。它通过简洁的配置文件&#xff08;CMakeLists.txt&#xff09;描述编译过程&#xff0c;生成适用于不同平台的构建脚本&#xff08;如 Makefile 或 …...

使用lvm进行磁盘分区

使用lvm进行磁盘分区 目的&#xff1a; 使用/dev/vdb创建一个5g的逻辑卷挂载到/mnt/lvmtest 前提&#xff1a; /dev/vdb是一块干净的空磁盘&#xff0c;数据会被清空&#xff01;&#xff01;&#xff01; 1. 创建物理卷(PV)&#xff1a; pvcreate /dev/sdb2. 验证&#xf…...

Java的线程通信机制是怎样的呢?

核心观点:线程通信本质是状态同步与数据传递的协同控制 (类比测试团队协作:如同测试用例执行需要同步进度,测试数据需要跨线程传递) 一、基础通信机制(附测试验证方法) 1. 共享内存(最常用但最危险) // 测试典型场景:多线程统计测试用例通过率 public class Share…...

线性回归策略

一种基于ATR(平均真实范围)、线性回归和布林带的交易策略。以下是对该策略的全面总结和分析: 交易逻辑思路 1. 过滤条件: - 集合竞价过滤:在每个交易日的开盘阶段,过滤掉集合竞价产生的异常数据。 - 价格异常过滤:排除当天开盘价与最高价或最低价相同的情况,这…...

Sparse4D运行笔记

Sparse4D有三个版本&#xff0c;其中V1和V2版本的官方文档中环境依赖写得比较模糊且依赖库有版本冲突。 1. Sparse4D V1 创建环境 conda create sparse4dv1 python3.8 激活环境 conda activate sparse4dv1 安装torch, torchvision, torchaudio pip install torch1.13.0c…...

Bitmap、Roaring Bitmap、HyperLogLog对比介绍

一、Bitmap(位图)概述 Bitmap 是一种用位(bit)来表示集合元素是否存在的数据结构。每个位代表一个元素的状态(0或1),非常节省空间且支持快速集合操作。 常见Bitmap类型: 普通Bitmap 最简单的位数组,适合元素范围固定且不稀疏的场景。例如,元素范围是0~1000,用1001…...

Rust 数据结构:HashMap

Rust 数据结构&#xff1a;HashMap Rust 数据结构&#xff1a;HashMap创建一个新的哈希映射HashMap::new()将元组变成哈希表 访问哈希映射中的值哈希映射和所有权更新哈希映射重写一个值仅当键不存在时才添加键和值基于旧值更新值 散列函数 Rust 数据结构&#xff1a;HashMap …...

Spring6学习及复习笔记

1、快速入门认识 通过编写xml配置文件来创建对象&#xff0c;读取bean标签的id值和class值来创建。 之后再通过对象调用相关的方法&#xff08;这里实际上用到的是反射机制&#xff09; 对象会存放到Map集合中 大致反射思路如下&#xff1a;&#xff08;这里只是模拟&#x…...

开源语音-文本基础模型和全双工语音对话框架 Moshi 介绍

介绍 一、项目背景 Moshi是一种语音-文本基础模型和全双工语音对话框架。它使用了Mimi这一业界领先的流式神经音频编解码器。Mimi能够以完全流式处理的方式&#xff08;80毫秒的延迟&#xff0c;即帧大小&#xff09;&#xff0c;将24千赫兹的音频信号压缩为12.5赫兹的表示形式…...

MATLAB学习笔记(六):MATLAB数学建模

MATLAB 是数学建模的强大工具&#xff0c;其丰富的函数库和可视化能力可以高效解决各类数学建模问题。以下是 MATLAB 数学建模的完整指南&#xff0c;涵盖建模流程、常用方法、代码示例及实际应用。 一、数学建模的基本流程 问题分析 • 明确目标&#xff08;预测、优化、分类等…...

博客打卡-求解流水线调度

题目如下&#xff1a; 有n个作业&#xff08;编号为1&#xff5e;n&#xff09;要在由两台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工&#xff0c;然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi&#xff08;1≤i≤n&#xff09;。 流水…...

【Ragflow】22.RagflowPlus(v0.3.0):用户会话管理/文件类型拓展/诸多优化更新

概述 在历经三周的阶段性开发后&#xff0c;RagflowPlus顺利完成既定计划&#xff0c;正式发布v0.3.0版本。 开源地址&#xff1a;https://github.com/zstar1003/ragflow-plus 新功能 1. 用户会话管理 在后台管理系统中&#xff0c;新增用户会话管理菜单。在此菜单中&…...

深度学习中ONNX格式的模型文件

一、模型部署的核心步骤 模型部署的完整流程通常分为以下阶段&#xff0c;用 “跨国旅行” 类比&#xff1a; 步骤类比解释技术细节1. 训练模型学会一门语言&#xff08;如中文&#xff09;用 PyTorch/TensorFlow 训练模型2. 导出为 ONNX翻译成国际通用语言&#xff08;如英语…...

【机器人】复现 WMNav 具身导航 | 将VLM集成到世界模型中

WMNav 是由VLM视觉语言模型驱动的&#xff0c;基于世界模型的对象目标导航框架。 设计一种预测环境状态的记忆策略&#xff0c;采用在线好奇心价值图来量化存储&#xff0c;目标在世界模型预测的各种场景中出现的可能性。 本文分享WMNav复现和模型推理的过程&#xff5e; 下…...

C++中析构函数不设为virtual导致内存泄漏示例

一、问题示例 #include <iostream> using namespace std;class Base { public:Base() { cout << "Base constructor\n"; }~Base() { cout << "Base destructor\n"; } // 不是 virtual };class Derived : public Base { public:Derived(…...

UDP--DDR--SFP,FPGA实现之模块梳理及AXI读写DDR读写上板测试

模块梳理介绍 在之前的几篇文章中&#xff0c;笔者详细介绍了整个项目的框架结构以及部分关键模块的实现细节。这些模块包括UDP协议栈、UDP指令监测、数据跨时钟域处理、DDR读写控制、内存读取控制以及DDR AXI控制器等。这些模块共同构成了项目的基础架构&#xff0c;每个模块…...

Slidev集成Chart.js:专业数据可视化演示文稿优化指南

引言&#xff1a;为何选择在Slidev中集成Chart.js&#xff1f; 在现代演示文稿中&#xff0c;高效的数据可视化对于清晰传达复杂信息至关重要。Slidev是一款灵活的开源演示文稿工具&#xff0c;基于Web技术构建&#xff0c;但在高级数据可视化方面存在一定局限。本文旨在提供一…...

动态规划(3)学习方法论:构建思维模型

引言 动态规划是算法领域中一个强大而优雅的解题方法,但对于许多学习者来说,它也是最难以掌握的算法范式之一。与贪心算法或分治法等直观的算法相比,动态规划往往需要更抽象的思维和更系统的学习方法。在前两篇文章中,我们介绍了动态规划的基础概念、原理以及问题建模与状…...

NDS3211HV单路H.264/HEVC/HD视频编码器

1产品概述 NDS3211HV单路高清编码器是一款功能强大的音/视频编码设备&#xff0c;支持2组立体声&#xff0c;同时还支持CC(CVBS)字幕。支持多种音频编码方式。该设备配备了多种音/视频输入接口&#xff1a;HD-SDI数字视频输入、HDMI高清输入&#xff08;支持CC&#xff09;、A…...

GO语言语法---if语句

文章目录 1. 基本语法1.1 单分支1.2 双分支1.3 多分支 2. Go特有的if语句特性2.1 条件前可以包含初始化语句2.2 条件表达式不需要括号2.3 必须使用大括号2.4 判断语句所在行数控制 Go语言的if语句用于条件判断&#xff0c;与其他C风格语言类似&#xff0c;但有一些独特的语法特…...

单细胞转录组(4)Cell Ranger

使用 Cell Ranger 分析单细胞数据 1. 数据转换 BCL2FASTQ 在进行单细胞数据分析之前&#xff0c;需要将 Illumina 测序仪生成的 BCL 格式数据转换为 FASTQ 格式。这一步通常使用 bcl2fastq 软件完成。 1.1 安装 bcl2fastq bcl2fastq 是 Illumina 提供的软件&#xff0c;用于…...

Python爬虫-爬取百度指数之人群兴趣分布数据,进行数据分析

前言 本文是该专栏的第56篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前的文章《Python爬虫-爬取百度指数之需求图谱近一年数据》中,笔者有详细介绍过爬取需求图谱的数据教程。 而本文,笔者将再以百度指数为例子,基于Python爬虫获取指定关键词的人群“兴…...

使用Python和Selenium打造一个全网页截图工具

无论是归档网站、测试页面设计&#xff0c;还是为报告记录网页内容&#xff0c;一个可靠的截图工具都能大大提升效率。本文将介绍如何使用Python、Selenium和wxPython构建一个用户友好的网页截图工具。该工具能在浏览器中显示网页&#xff0c;自动平滑滚动到底部以触发懒加载内…...

自动化脚本开发:Python调用云手机API实现TikTok批量内容发布

在2025年的技术生态下&#xff0c;通过Python实现TikTok批量内容发布的自动化脚本开发需结合云手机API调用、TikTok开放接口及智能调度算法。以下是基于最新技术实践的系统化开发方案&#xff1a; 一、云手机环境配置与API对接 云手机平台选择与API接入 推荐使用比特云手机或丁…...

React Hooks 必须在组件最顶层调用的原因解析

文章目录 前言一、Hooks 的基本概念二、Hooks 的调用规则三、为什么 Hooks 必须在最顶层调用&#xff1f;1. 维护 Hooks 的调用顺序2. 闭包与状态关联3. 实现细节&#xff1a;Hook 的链表结构 四、违反规则的后果五、如何正确使用 Hooks六、示例&#xff1a;正确与错误的用法对…...

西门子 Teamcenter13 Eclipse RCP 开发 1.2 工具栏 开关按钮

西门子 Teamcenter13 Eclipse RCP 开发 1.2 工具栏 开关按钮 1 配置文件2 插件控制3 命令框架 位置locationURI备注菜单栏menu:org.eclipse.ui.main.menu添加到传统菜单工具栏toolbar:org.eclipse.ui.main.toolbar添加到工具栏 style 值含义显示效果push普通按钮&#xff08;默…...

5.27本日总结

一、英语 复习list2list29 二、数学 学习14讲部分内容 三、408 学习计组1.2内容 四、总结 高数和计网明天结束当前章节&#xff0c;计网内容学完之后主要学习计组和操作系统 五、明日计划 英语&#xff1a;复习lsit3list28&#xff0c;完成07年第二篇阅读 数学&#…...

【持续更新中】架构面试知识学习总结

1.分库分表出现冗余数据&#xff1a; ☆分库分表方法&#xff1a;水平和垂直&#xff08;业务场景&#xff0c;数据关联性。逻辑要调查清楚&#xff09; 垂直&#xff1a;将一个表(库)按照列的业务相关性进行拆分&#xff0c;把经常一起使用的列放在一张表(库)&…...

文字溢出省略号显示

一、 单行文字溢出、省略号显示 二、 多行文字溢出&#xff0c;省略号显示 有较大的兼容性问题&#xff0c;适用于Webkit为内核的浏览器软件&#xff0c;或者移动端的&#xff08;大部分也是webkit&#xff09; 此效果建议后端人员开发 三、图片底侧空白缝隙的修复技巧&#…...

力扣-283-移动零

1.题目描述 2.题目链接 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 3.题目代码 class Solution {public void moveZeroes(int[] nums) {int dest-1;int cur0;while(cur<nums.length){if(nums[cur]0){cur;}else if(nums[cur]!0){swap(nums,cur,dest1);cur;dest…...

【001】RenPy打包安卓apk 流程源码级别分析

1. 入口在下图 2. SDK版本及代码入口 &#xff08;renpy-8.3.7-sdk&#xff09; 由于SDK一直在升级&#xff0c;本文采用 标题中的版本进行分析&#xff0c;整体逻辑变化不太大。 实际执行逻辑是调用的rapt 2.1 点击按钮实际执行逻辑 def AndroidIfState(state, needed, acti…...

机器学习-人与机器生数据的区分模型测试-数据处理 - 续

这里继续 机器学习-人与机器生数据的区分模型测试-数据处理1的内容 查看数据 中1的情况 #查看数据1的分布情况 one_ratio_list [] for col in data.columns:if col city or col target or col city2: # 跳过第一列continueelse:one_ratio data[col].mean() # 计算1值占…...

计算机视觉与深度学习 | Python实现EMD-VMD-LSTM时间序列预测(完整源码和数据)

EMD-VMD-LSTM 一、完整代码实现二、代码结构解析三、关键参数说明四、性能优化建议五、工业部署方案以下是用Python实现EMD-VMD-LSTM时间序列预测的完整代码,结合经验模态分解(EMD)、变分模态分解(VMD)与LSTM深度学习模型,适用于复杂非平稳信号的预测任务。代码包含数据生…...

数据结构与算法——双向链表

双向链表 定义链表分类双向链表&#xff1a;带头双向循环链表 初始化打印尾插头插尾删头删查找在pos(指定位置)之后插入结点在pos(指定位置)之前插入结点删除pos(指定位置)的结点销毁顺序表与链表的分析 定义 链表分类 单向和双向 带头和不带头 带头是指存在一个头结点&…...

.NET 中管理 Web API 文档的两种方式

前言 在 .NET 开发中管理 Web API 文档是确保 API 易用性、可维护性和一致性的关键。今天大姚给大家分享两种在 .NET 中管理 Web API 文档的方式&#xff0c;希望可以帮助到有需要的同学。 Swashbuckle Swashbuckle.AspNetCore 是一个流行的 .NET 库&#xff0c;它使得在 AS…...

混合学习:Bagging与Boosting的深度解析与实践指南

引言 在机器学习的世界里&#xff0c;模型的性能优化一直是研究的核心问题。无论是分类任务还是回归任务&#xff0c;我们都希望模型能够在新的数据上表现出色&#xff0c;即具有良好的泛化能力。然而&#xff0c;实际应用中常常遇到模型过拟合&#xff08;高方差&#xff09;…...

基于大疆Mini 3无人机和指定软件工具链的完整3D建模工作

基于大疆Mini 3无人机和指定软件工具链的完整3D建模工作流程关键步骤&#xff1a; 1. 无人机航拍准备 • 设备检查&#xff1a;确保大疆 Mini 3 电量充足&#xff0c;相机设置为 RAW 格式&#xff08;便于后期调色&#xff09;&#xff0c;关闭自动白平衡。 • 飞行规划&…...

开源项目实战学习之YOLO11:12.1 ultralytics-models-sam-blocks.py源码

👉 点击关注不迷路 👉 点击关注不迷路 👉 另外,前些天发现了一个巨牛的AI人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。感兴趣的可以点击相关跳转链接。 点击跳转到网站。 ultralytics-models-sam 1.sam-modules-__init__.py2.sam-modules-blocks.pybl…...

3D个人简历网站 5.天空、鸟、飞机

1.显示天空 models下新建文件Sky.jsx Sky.jsx // 从 React 库中导入 useRef 钩子&#xff0c;用于创建可变的 ref 对象 import { useRef } from "react"; // 从 react-three/drei 库中导入 useGLTF 钩子&#xff0c;用于加载 GLTF 格式的 3D 模型 import { useGLT…...