0

0

C++怎么判断后缀 C++检查文件名扩展名【技巧】

尼克

尼克

发布时间:2026-03-11 09:22:02

|

1009人浏览过

|

来源于php中文网

原创

最稳妥提取文件后缀应使用 std::string::rfind("."),检查是否为 npos 或位置为0(如 ".gitignore"),再用 substr(pos+1);注意大小写敏感性依平台而异,std::filesystem::path::extension() 返回带点字符串且对无点文件返回空。

c++怎么判断后缀 c++检查文件名扩展名【技巧】

std::string::rfind 找最后一个点最稳妥

直接用 std::string::find 从头找点,会错判 "archive.tar.gz" 这类多点文件名——它返回第一个点的位置,导致截出 "tar.gz" 而不是真正的后缀 "gz"。必须从末尾往前搜。

实操建议:

立即学习C++免费学习笔记(深入)”;

Q.AI视频生成工具
Q.AI视频生成工具

支持一分钟生成专业级短视频,多种生成方式,AI视频脚本,在线云编辑,画面自由替换,热门配音媲美真人音色,更多强大功能尽在QAI

下载
  • rfind(".") 返回 std::string::npos 表示没点,此时无后缀
  • 找到点后,检查位置是否为 0(即文件名以 "." 开头,如 ".gitignore"),这种通常不算常规后缀,按需跳过
  • 取子串用 substr(pos + 1),别漏掉 +1,否则会把点一起包进去
std::string ext = filename.rfind('.') != std::string::npos
    ? filename.substr(filename.rfind('.') + 1)
    : "";

区分大小写?得看场景和系统

Windows 文件系统默认不区分大小写,"FILE.TXT""file.txt" 是同一个文件;Linux/macOS 默认区分。C++ 标准库不做转换,"JPG""jpg" 就是两个不同字符串。

实操建议:

立即学习C++免费学习笔记(深入)”;

  • 如果只是做简单匹配(比如过滤日志里所有 "log" 文件),用 std::equalstd::tolower 比较更安全
  • 如果后续要打开文件,且目标平台是 Windows,强行转小写反而可能掩盖路径问题(比如某些老旧工具依赖大写扩展名)
  • 别依赖 std::string::compare 的大小写敏感版本去“统一处理”,它不帮你转大小写

std::filesystem::path::extension() 看似方便,但有陷阱

C++17 引入的 std::filesystem::path 确实提供 extension() 方法,但它返回的是包括点的字符串,比如 "txt"".txt",而且对 "makefile""README" 这类无点但有约定含义的文件,它返回空——这和多数人直觉不符。

实操建议:

立即学习C++免费学习笔记(深入)”;

  • 如果项目已用 C++17 且需要跨平台路径操作,可以用 extension().string(),但记得手动去掉开头的点:ext.substr(1)
  • 如果只为了判断后缀,不用整个 std::filesystem,它带额外开销(尤其在嵌入式或性能敏感场景)
  • 注意:某些编译器(如旧版 MSVC)对 std::filesystem 的实现不完整,extension() 在含 Unicode 路径下可能行为异常

别忘了路径分隔符干扰——"C:data eport.pdf" 怎么办

只查点,会把 Windows 路径中的反斜杠当普通字符,rfind(".") 仍能正确找到 "pdf";但若路径含正斜杠(如网络路径 "//server/share/doc.txt")或混合分隔符,逻辑不变。真正的问题是:有人会先用 find_last_of("\/") 提取纯文件名,再查点——这步容易漏掉边界情况。

实操建议:

立即学习C++免费学习笔记(深入)”;

  • 优先用 std::filesystem::path::filename() 提取不含目录的部分(C++17),比手撕字符串可靠
  • 如果不能用 C++17,自己拆时注意:空路径、结尾是分隔符(如 "dir/")、只有分隔符(如 "/")都要单独判断,否则 rfind 可能作用于错误字符串
  • 测试用例至少覆盖:"a.b.c"".hidden""noext""path/to/file""C:\temp\readme.TXT"
事情说清了就结束。最常被忽略的是:没考虑 ".gitignore" 这种点开头的文件名是否算“有后缀”,以及大小写处理时没对齐实际运行环境。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1566

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

649

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1228

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

1184

2024.04.29

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.1万人学习

C 教程
C 教程

共75课时 | 5.3万人学习

C++教程
C++教程

共115课时 | 21.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号