C语言文件长度获取:fseek/ftell与stat方法详解与实战对比

news2026/5/16 4:50:35
1. 项目概述为什么文件长度获取是基础却关键的操作在C语言开发中处理文件是家常便饭。无论是读取配置文件、解析日志还是处理二进制数据我们经常需要知道一个文件到底有多大。这个看似简单的需求——“获取文件长度”——背后却直接关系到内存分配是否合理、数据读取是否完整、乃至程序运行的健壮性。新手可能会想这不就是打开文件然后读一下大小吗但实际动手时就会发现C标准库并没有一个直接的getFileSize()函数。这就需要我们根据不同的场景和需求选择合适的方法。今天要聊的两种主流方法是每个C程序员都应该掌握的看家本领。它们分别利用了文件指针的定位功能和文件系统的元数据信息各有各的适用场景和“坑点”。比如你用第一种方法去获取一个正在被其他进程写入的日志文件大小结果可能就不准而第二种方法在操作某些特殊文件比如管道时可能会失败。理解这些细节不仅能帮你写出正确的代码更能让你对文件I/O和操作系统有更深的认识。接下来我们就深入这两种方法的原理、实现和那些教科书上不会写的实战经验。2. 核心思路拆解两种方法的设计哲学与适用边界获取文件长度本质上就是询问系统“这个文件占了多少字节”。在C语言的语境下我们有两种截然不同的询问路径。2.1 方法一基于文件指针偏移量fseek/ftell流操作这种方法的核心思想是模拟测量过程。想象一下你要量一根绳子的长度但没有尺子。你可以把绳子拉直记下起点然后走到终点再看自己走了多远。fseek和ftell或fgetpos/fsetpos这对组合干的就是这个事。设计哲学它工作在标准I/O流FILE*的抽象层上。标准I/O库通常会进行缓冲以提高效率。这个方法通过将文件指针移动到文件末尾fseek然后查询当前指针相对于文件开头的偏移量ftell来间接得到长度。它的最大特点是与流抽象紧密耦合你操作的是经过库缓冲的“流视图”。适用边界常规文件文本文件、二进制文件等存储在磁盘上的普通文件效果最好。可查找seekable流这是关键前提。流必须支持随机访问即fseek操作。需要跨平台一致性fseek/ftell是C标准库函数在不同操作系统上行为一致可移植性高。潜在陷阱文件大小限制ftell的返回值类型是long。在32位系统或某些环境下long可能只有32位这意味着它能表示的最大文件大小约为2GB2^31 - 1字节。对于超过这个大小的文件ftell的返回值可能会溢出或无法正确表示。不适用于所有FILE*对于非真实文件的FILE*流比如标准输入stdin、管道popen打开的流或网络套接字某些系统可能支持fdopen转换为FILE*fseek到末尾的行为是未定义的或会失败。2.2 方法二基于文件描述符与系统调用stat/lseek这种方法的核心思想是直接查询文件系统元数据。就好比你直接去查看物品的出厂标签上面明确写着尺寸。stat系列函数就是用来读取这个“标签”文件的状态信息即inode信息的。设计哲学它绕过了标准I/O库的流抽象直接使用更底层的文件描述符int fd和系统调用。它直接向操作系统内核询问文件的元信息获取的是磁盘上文件的真实、静态的属性。适用边界任何类型的文件包括特殊文件只要文件系统能提供元数据stat就能工作。这对于设备文件、符号链接等也有效需要注意stat和lstat的区别。大文件支持使用stat结构体中的st_size成员其类型通常是off_t这是一个被设计用来表示大文件偏移量的类型在支持大文件的系统上通过定义_FILE_OFFSET_BITS64可以轻松处理数TB大小的文件。无需打开文件stat函数只需要文件路径你甚至可以不打开文件就获取其大小这在某些只需检查元信息的场景下非常高效。潜在陷阱符号链接如果你使用stat函数追踪一个符号链接它返回的是链接指向的目标文件的大小而不是链接文件本身的大小链接文件本身只存储一个路径字符串很小。如果需要获取链接文件自身的信息需使用lstat。实时性stat获取的是调用那一瞬间文件系统元数据缓存中的信息。对于正在被快速写入的文件你可能拿到一个稍旧的长度值。虽然方法一也有类似问题但stat的查询更直接延迟可能略有不同。权限你需要对目标文件的父目录有执行搜索权限对文件本身有读权限或者对目录有权限取决于系统配置才能成功调用stat。选择心法简单记需要操作文件内容时用方法一只需知道大小或处理大文件/特殊文件时用方法二。如果已经用fopen打开了文件用方法一顺手如果只是检查大小或者文件可能很大方法二是更稳健的选择。3. 方法一详解基于fseek与ftell的标准流操作让我们先深入第一种方法这是大多数C语言教材会首先介绍的方式。3.1 函数原型与基本用法#include stdio.h int fseek(FILE *stream, long offset, int whence); long ftell(FILE *stream);fseek用于移动文件指针。whence参数决定偏移量offset的起始点它可以是SEEK_SET从文件开头开始。SEEK_CUR从当前位置开始。SEEK_END从文件末尾开始。ftell返回当前文件指针相对于文件开头的偏移量字节数。获取长度的标准代码模板如下long get_file_size_v1(const char *filename) { FILE *fp fopen(filename, rb); // 以二进制读模式打开 if (fp NULL) { perror(fopen failed); return -1L; // 返回-1表示错误 } if (fseek(fp, 0L, SEEK_END) ! 0) { // 将指针移动到文件末尾 perror(fseek failed); fclose(fp); return -1L; } long size ftell(fp); // 获取当前位置即文件长度 if (size -1L) { perror(ftell failed); } // 可选将指针移回文件开头以便后续读取 // rewind(fp); 或 fseek(fp, 0L, SEEK_SET); fclose(fp); return size; }3.2 关键细节与参数解析打开模式必须是“rb”使用二进制模式“rb”打开至关重要。在文本模式“r”下某些系统如Windows会对换行符\r\n进行转换导致ftell返回的字节数与文件实际物理字节数不符。fseek/ftell在文本模式下的行为是平台相关的甚至可能不支持SEEK_END。始终用二进制模式进行文件定位操作这是铁律。错误处理必须完整fopen、fseek、ftell都可能失败。fopen失败可能因为文件不存在或权限不足fseek失败可能因为流不可查找ftell失败可能因为内部错误。每一步都必须检查返回值并做好资源清理fclose。ftell返回值的含义成功时它返回从文件开头到当前指针的字节数。对于空文件移动到SEEK_END后ftell返回0。失败时它返回-1L并设置errno。3.3 大文件问题与fgetpos/fsetpos如前所述long类型的大小限制是此方法的阿喀琉斯之踵。C标准提供了另一对更具可移植性的函数来处理可能的大文件位置#include stdio.h int fgetpos(FILE *stream, fpos_t *pos); int fsetpos(FILE *stream, const fpos_t *pos);fpos_t是一个可以容纳任何文件位置的不透明类型。用它来获取大文件尺寸的代码如下#include stdio.h #include stdlib.h long long get_file_size_v1_large(const char *filename) { FILE *fp fopen(filename, rb); if (!fp) return -1LL; fpos_t start_pos, end_pos; // 获取当前位置通常是开头 if (fgetpos(fp, start_pos) ! 0) { fclose(fp); return -1LL; } // 移动到末尾 if (fseek(fp, 0, SEEK_END) ! 0) { fclose(fp); return -1LL; } // 获取末尾位置 if (fgetpos(fp, end_pos) ! 0) { fclose(fp); return -1LL; } // 注意fpos_t不能直接做算术运算。我们需要回到开头用ftell这有矛盾。 // 实际上对于大文件更常见的做法是使用_stat或直接使用ftell的扩展。 // 这里演示一个技巧使用ftell但将其返回值提升到long long。 // 但ftell本身可能已在内部受long限制。所以这不是根本解决方案。 // 更可靠的方法是使用方法二stat。此处代码仅为展示fgetpos用法不解决根本问题。 fsetpos(fp, start_pos); // 恢复位置 long long size; // 模拟计算这依赖于fpos_t的具体实现不可移植。 // 因此对于确切的、可移植的大文件支持请跳转到方法二。 fclose(fp); // 强调此函数演示fgetpos但获取大文件尺寸应优先选用方法二。 printf(Warning: For large file support, use stat() instead.\n); return -2LL; // 特殊返回值表示应使用其他方法 }核心提示fgetpos/fsetpos主要用于保存和恢复复杂的文件位置状态例如在多字节字符流的中间位置而不是为了直接计算大小。对于超过2GB的文件最直接、最可移植的方案是放弃方法一转而使用方法二stat。不要试图用fseek/ftell和类型强转来 hack那会引入不可移植性和潜在错误。4. 方法二详解基于stat系列函数的系统元数据查询这是更强大、更直接的方法也是工业级代码中的首选。4.1 函数原型与结构体解析#include sys/stat.h // 头文件 int stat(const char *pathname, struct stat *statbuf); int fstat(int fd, struct stat *statbuf); int lstat(const char *pathname, struct stat *statbuf);stat通过路径名获取文件信息。fstat通过已打开的文件描述符fd获取文件信息。如果你已经用open打开了文件用这个更高效。lstat对于符号链接文件lstat返回的是链接文件本身的信息而stat返回的是链接指向的目标文件的信息。struct stat结构体包含了文件的丰富信息我们只关心st_size成员。struct stat { dev_t st_dev; /* 设备ID */ ino_t st_ino; /* inode号 */ mode_t st_mode; /* 文件类型和权限 */ nlink_t st_nlink; /* 硬链接数 */ uid_t st_uid; /* 所有者用户ID */ gid_t st_gid; /* 所有者组ID */ dev_t st_rdev; /* 设备ID如果是特殊文件 */ off_t st_size; /* 总大小字节数 */ blksize_t st_blksize; /* 文件系统I/O块大小 */ blkcnt_t st_blocks; /* 分配的512B块数量 */ time_t st_atime; /* 最后访问时间 */ time_t st_mtime; /* 最后修改时间 */ time_t st_ctime; /* 最后状态改变时间 */ };4.2 基础实现与错误处理基础版本的实现非常简洁#include sys/stat.h #include stdio.h #include errno.h long long get_file_size_v2(const char *filename) { struct stat file_stat; if (stat(filename, file_stat) -1) { // stat失败 perror(stat failed); return -1LL; } // 成功返回文件大小。注意类型转换。 return (long long)file_stat.st_size; }错误处理要点stat返回-1表示失败并设置全局变量errno。常见错误有ENOENT文件不存在。EACCES对路径的某个部分没有搜索权限。ENOMEM内核内存不足。ENOTDIR路径中的某个部分不是目录。使用perror或strerror(errno)可以打印出可读的错误信息。4.3 处理大文件与符号链接1. 大文件支持off_t类型用于表示文件大小和偏移量。为了确保它能处理大文件2GB你需要在包含头文件之前定义宏_FILE_OFFSET_BITS64。这通常通过编译器命令行参数-D_FILE_OFFSET_BITS64或在代码最开头定义来实现。#define _FILE_OFFSET_BITS 64 #include sys/stat.h // ... 其他代码在现代的64位系统和大多数32位Linux系统上这样定义后off_t将成为64位类型即long long可以处理高达8EB2^63字节的文件。这是处理大文件的标准且必须的步骤。2. 符号链接处理 如果你需要获取符号链接本身的大小即存储的路径字符串的长度请使用lstat。long long get_link_size(const char *linkpath) { struct stat link_stat; if (lstat(linkpath, link_stat) -1) { perror(lstat failed); return -1LL; } // 检查是否为符号链接 (S_ISLNK 宏) if (S_ISLNK(link_stat.st_mode)) { return (long long)link_stat.st_size; // 链接本身的大小 } else { // 如果不是链接lstat的行为和stat一样返回文件大小 return (long long)link_stat.st_size; } }3. 使用fstat 如果你已经有一个打开的文件描述符例如通过open系统调用获得使用fstat是最高效的因为它避免了根据路径名再次查找文件的系统开销。#include sys/stat.h #include fcntl.h #include unistd.h long long get_file_size_by_fd(int fd) { if (fd 0) return -1LL; struct stat file_stat; if (fstat(fd, file_stat) -1) { perror(fstat failed); return -1LL; } return (long long)file_stat.st_size; } // 使用示例 int fd open(largefile.bin, O_RDONLY); if (fd ! -1) { long long size get_file_size_by_fd(fd); close(fd); // 使用size... }5. 两种方法的对比与实战场景选择为了更直观地做出选择我将两种方法的核心差异总结如下表特性维度方法一fseek/ftell(标准I/O流)方法二stat/fstat(系统调用)操作对象FILE*(标准I/O流)路径名 (const char*) 或 文件描述符 (int fd)抽象层级标准库流抽象带缓冲直接系统调用无缓冲主要函数fopen,fseek,ftell,fclosestat,fstat,lstat获取信息间接通过指针偏移计算直接读取文件系统元数据 (st_size)大文件支持受long类型限制通常 2GB通过_FILE_OFFSET_BITS64支持超大文件 (64位off_t)符号链接跟随链接打开的是目标文件stat跟随链接lstat不跟随性能开销较高需打开、关闭文件涉及流缓冲较低特别是fstat无需路径解析是否需要打开文件是stat不需要fstat需要已打开的fd典型失败场景流不可查找如管道、stdin、文本模式、文件被独占打开路径无权限、文件不存在、文件系统错误可移植性C标准所有平台一致POSIX标准绝大多数Unix-like系统Linux, macOS, BSD和WindowsMinGW, Cygwin支持实战选择指南场景一你已经用fopen打开了文件并且文件不大2GB后续还要进行流式I/O。选择使用方法一。代码逻辑连贯fseek/ftell后可以立即用rewind或fseek回到开头进行读取。示例读取一个配置文件先获取大小以分配缓冲区然后读入整个文件。场景二你需要处理可能的大文件如视频、数据库文件、日志归档。选择无条件选择方法二。定义_FILE_OFFSET_BITS64使用stat。示例备份程序需要统计待备份文件的总大小。场景三你只需要快速检查文件大小而不需要读取其内容。选择方法二stat。它避免了打开和关闭文件的额外开销速度更快。示例监控日志文件是否增长到需要轮转的阈值。场景四你操作的是符号链接并且需要知道链接本身的大小。选择方法二lstat。方法一无法区分链接和目标。示例文件系统工具需要列出目录下所有条目及其精确大小。场景五你正在编写一个需要高度可移植性包括一些非POSIX的嵌入式环境的代码且确定文件很小。选择方法一。纯C标准库依赖最少。注意即便如此也要警惕文本模式和二进制模式的区别。6. 常见问题、陷阱与调试技巧实录即使知道了方法在实际编码中还是会踩坑。下面是我和同事们多年总结下来的“血泪教训”。6.1 方法一的典型陷阱陷阱1文本模式与二进制模式的混淆这是最经典的错误。在Windows上用“r”打开文本文件fseek到SEEK_ENDftell返回的值可能比文件实际字节数小因为\r\n被当作一个\n读入。永远使用“rb”模式进行文件定位操作。陷阱2忽略ftell的返回值类型和错误检查long size ftell(fp);之后如果文件为空size是0如果出错size是-1。但ftell成功时也可能返回-1吗C标准说成功时返回当前文件位置失败时返回-1L并设置errno。对于空文件位置是0不是-1。所以必须检查ftell是否返回-1并且通过errno或ferror(fp)来确认是否真的出错。一个健壮的写法是long size ftell(fp); if (size -1L) { if (ferror(fp)) { perror(ftell failed); // 处理错误 } else { // size可能就是-1但这不是错误这很罕见通常意味着未知状态。 // 最安全的做法是视作错误或使用方法二重试。 } }陷阱3对已关闭或无效的流调用ftell在fclose(fp)之后fp就成了悬空指针。再调用ftell(fp)会导致未定义行为通常是程序崩溃。确保操作顺序正确。6.2 方法二的典型陷阱陷阱1未定义_FILE_OFFSET_BITS64导致大小截断在32位系统上如果你忘记定义这个宏off_t可能是32位的。当你stat一个3GB的文件时st_size的值会被截断导致得到一个错误的大小可能是负数。在包含任何系统头文件之前定义此宏应成为你的肌肉记忆。陷阱2混淆stat和lstat写一个遍历目录的程序用stat获取每个条目的大小。如果遇到一个符号链接stat会返回目标文件的大小。这可能导致你统计的“目录总大小”远远超出预期因为一个指向/usr的链接会被算作/usr目录下所有文件的大小。在需要区分链接本身时务必想清楚该用stat还是lstat。陷阱3路径权限问题stat需要路径中所有目录的执行搜索权限。如果你对/home/user/private没有执行权限即使你知道文件/home/user/private/file.txt存在且可读stat(“/home/user/private/file.txt”, …)也会失败错误码为EACCES。错误提示“Permission denied”常常让人误以为是文件本身的读权限问题其实可能是路径上某个目录的权限不足。6.3 调试与排查技巧打印errno任何时候系统调用或库函数失败立即用perror(“function_name”)或printf(“Error: %s\n”, strerror(errno))打印错误信息。这是定位问题的第一把钥匙。检查返回类型对于stat确保你用来接收st_size的变量类型足够大如long long。打印出来看看是否合理。对于一个几K的文件如果打印出负数或巨大的数很可能是类型不匹配或数据损坏。使用ls -l和du命令验证在Unix-like系统上ls -l filename会显示stat得到的st_size。du -b filename显示文件实际占用的磁盘字节数对于稀疏文件这个值可能小于st_size。当你程序计算的大小和系统命令不一致时用这些命令做交叉验证。处理特殊文件写一个健壮的函数可以先用lstat检查文件类型。如果是普通文件S_ISREG或符号链接S_ISLNKst_size有意义。如果是目录S_ISDIRst_size通常只是文件系统记录目录内容所用的空间并非目录下所有文件的总和。获取目录总大小需要递归遍历。关于“文件长度”与“磁盘占用”stat得到的st_size是文件的逻辑大小即“文件内容有多少字节”。而st_blocks * 512st_blocks单位是512字节块给出了文件实际占用了多少磁盘空间由于块分配、稀疏文件等原因后者可能更小或更大。如果你关心磁盘用量应该使用后者。7. 进阶应用封装一个健壮的获取文件大小的函数结合以上所有经验我们可以封装一个在生产环境中更健壮、功能更全面的函数。它应该支持大文件。能处理符号链接按需选择是跟随还是查看本身。提供清晰的错误码。易于使用。/** * brief 获取文件大小健壮版 * param path 文件路径 * param follow_link 如果路径是符号链接是否跟随链接。1跟随(获取目标大小)0不跟随(获取链接本身大小) * param[out] size 成功时存储文件大小字节 * return 成功返回0失败返回-1并设置errno。 */ int robust_get_file_size(const char *path, int follow_link, long long *size) { if (path NULL || size NULL) { errno EINVAL; return -1; } struct stat st; int ret; if (follow_link) { ret stat(path, st); // 跟随符号链接 } else { ret lstat(path, st); // 不跟随符号链接 } if (ret -1) { // stat/lstat 失败错误信息已在 errno 中 return -1; } // 检查文件类型普通文件、符号链接的大小信息是明确的。 // 目录的大小通常不是我们想要的“内容总大小”。 // 设备文件等特殊文件的st_size可能为0或无意义。 if (!S_ISREG(st.st_mode) !S_ISLNK(st.st_mode)) { // 如果不是普通文件也不是符号链接我们可以认为“大小”概念不适用或非预期。 // 这里返回成功但size设置为0并设置特定的errno可选。 // 更严格的做法是返回错误。这里我们选择返回0大小并告知调用者类型。 // 我们设置一个自定义的错误码例如ENOTSUP但errno是全局的可能干扰。 // 更好的设计是让函数返回不同的错误码或增加一个输出参数表示文件类型。 // 为了简化这里如果非普通文件/链接我们仍返回成功size0。 // 调用者应通过其他方式如S_ISDIR判断类型。 *size 0; // 你可以选择不修改errno或者设置一个如ENOTSUP的值。 // errno ENOTSUP; // 注意这可能会覆盖之前的成功状态。 // 更安全的做法是如果调用者关心类型应该先自己检查。 // 因此本函数约定成功获取到大小时返回0size有效。 // 对于目录等stat成功但size0。调用者需知悉。 } else { *size (long long)st.st_size; } return 0; } // 使用示例 int main() { long long size; const char *file_path test.dat; // 获取普通文件或链接目标的大小 if (robust_get_file_size(file_path, 1, size) 0) { printf(Size of %s (following links): %lld bytes\n, file_path, size); } else { perror(Failed to get file size); } // 获取符号链接本身的大小 if (robust_get_file_size(/usr/bin/python, 0, size) 0) { printf(Size of link itself: %lld bytes\n, size); } // 对于目录 if (robust_get_file_size(., 1, size) 0) { printf(Size returned for directory: %lld bytes (likely not total content size)\n, size); } return 0; }这个函数仍然有简化之处。在生产代码中你可能还需要考虑错误码的细化区分“文件不存在”、“权限不足”、“不是普通文件”等。对于目录提供递归计算总大小的选项但这会是一个完全不同的、更耗时的函数。在多线程环境中errno的使用需要注意虽然stat本身是线程安全的但错误返回后操作errno需要谨慎。最后记住没有银弹。fseek/ftell简单直观适合小文件快速操作stat强大可靠是处理文件元信息的工业标准。理解它们的原理和局限根据实际场景做出选择这才是资深C程序员应有的素养。在实际项目中我通常默认使用stat除非代码上下文已经持有一个需要流式处理的FILE*且文件不大。对于文件操作多写几行错误检查的代码永远比事后调试数小时来得划算。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…