最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C/C++實(shí)現(xiàn)獲取完整路徑下的文件名及后綴

 更新時(shí)間:2025年11月26日 09:24:34   作者:南城花隨雪。  
這篇文章主要為大家詳細(xì)介紹了C/C++實(shí)現(xiàn)獲取完整路徑下的文件名及后綴的完整方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

一、項(xiàng)目背景詳細(xì)介紹

在文件系統(tǒng)操作中,程序經(jīng)常需要從一個(gè)“完整路徑”字符串中提?。?/p>

  • 文件名(不含目錄)
  • 文件名(不含路徑和后綴)
  • 文件后綴(擴(kuò)展名)

例如:/home/user/images/cat.png

應(yīng)能提?。?/p>

  • 完整文件名:cat.png
  • 文件名:cat
  • 后綴名:png

該功能在許多系統(tǒng)中十分重要:

  • 批量改名
  • 掃描文件列表并分類
  • 根據(jù)后綴決定如何處理文件(如 PNG 讀取、MP4 解碼等)
  • 數(shù)據(jù)預(yù)處理、機(jī)器學(xué)習(xí)數(shù)據(jù)集加載
  • 文檔管理系統(tǒng)
  • 資源管理器、構(gòu)建工具(如根據(jù)后綴分類 C/CPP/H 文件)
  • 備份工具(根據(jù)后綴排除某些文件)
  • 配置文件讀?。ㄈ?.ini/.json 判斷)

C 語(yǔ)言作為底層系統(tǒng)開發(fā)語(yǔ)言,不像 Python、C++ STL 有直接函數(shù),需要程序員手動(dòng)處理字符串,包括:

  • 路徑分隔符:Windows \ vs Linux /
  • 文件名提取
  • 后綴提取
  • 邊界條件:無(wú)后綴、隱藏文件、無(wú)路徑、純后綴文件等

因此,本項(xiàng)目將實(shí)現(xiàn)一個(gè) 跨平臺(tái)可靠的 C 語(yǔ)言文件名與后綴解析庫(kù),并滿足你要求的完整教學(xué)結(jié)構(gòu)。

二、項(xiàng)目需求詳細(xì)介紹

本項(xiàng)目需要實(shí)現(xiàn)以下能力:

1. 輸入完整路徑,提取文件名

支持多種場(chǎng)景:/home/user/a.txt → a.txt C:\Users\User\b.jpg → b.jpg a.png → a.png

2. 提取文件純文件名(無(wú)后綴)

a.txt → a cat.jpeg → cat Makefile → Makefile(無(wú)后綴) 

3. 提取文件后綴名

要求:

  • 不帶 .
  • 若沒有后綴返回空字符串
  • 支持多后綴,如 .tar.gz → 返回最后一個(gè)后綴 gz

4. 必須支持 Windows + Linux

路徑分隔符不同:

  • Linux:/
  • Windows:\

許多路徑可能混用,如:C:/images/cat.png

必須兼容。

5. 必須處理邊界情況

  • /home/user/.config(隱藏文件,無(wú)后綴)
  • /a/b/c/(目錄,不應(yīng)當(dāng)返回文件)
  • .gitignore(文件,但無(wú)后綴)
  • abc(無(wú)路徑、無(wú)后綴)
  • ...abc...txt(多個(gè) .)

6. 結(jié)構(gòu)化代碼,包含

  • path_utils.h
  • path_utils.c
  • main.c

并全放在一個(gè)代碼塊中。

三、相關(guān)技術(shù)詳細(xì)介紹

解析路徑涉及三個(gè)核心技術(shù)點(diǎn)。

1. 字符串掃描與反向搜索(strrchr)

我們要找:

  • 最后一次出現(xiàn)路徑分隔符 /\
  • 最后一次出現(xiàn) .

例如:/a/b/c/d.txt

文件名是:從最后一個(gè) / 到字符串末尾 

后綴名是:最后一個(gè) . 之后的內(nèi)容 

使用:

char* strrchr(const char* s, int ch); 

2. 操作系統(tǒng)差異

Windows 路徑分隔符為 \,Linux 為 /,但現(xiàn)代軟件往往混用。

因此,應(yīng)統(tǒng)一處理:

path_sep = ('/' 或 '\\') 

3. 字符串拷貝與安全性

需使用:

  • snprintf
  • strncpy
  • 邊界檢查

避免:

  • 緩沖區(qū)溢出
  • 空指針
  • 字符串未結(jié)束

四、實(shí)現(xiàn)思路詳細(xì)介紹

1. 統(tǒng)一處理路徑分隔符

掃描路徑中最后一個(gè)出現(xiàn):

if (path[i] == '/' || path[i] == '\\') 

2. 找到文件名指針

例如:/abc/def/xyz.txt

最后一個(gè)分隔符之后的內(nèi)容即文件名。

3. 找到最后一個(gè) .

文件后綴通常是最后一個(gè)點(diǎn)之后的內(nèi)容:

xyz.txt → txt a.b.c.gz → gz 

4. 判斷特殊情況

  • .bashrc(隱藏文件)
  • .gitignore(無(wú)后綴)
  • abc.(無(wú)后綴)
  • ...(特殊目錄)

5. 封裝三個(gè)函數(shù)

const char* get_filename_from_path(const char* path); 
void get_filename_no_ext(const char* filename, char* out); 
void get_extension(const char* filename, char* out); 

6. 提供統(tǒng)一測(cè)試樣例

五、完整實(shí)現(xiàn)代碼

/************************************************************
 * file: path_utils.h
 ************************************************************/
#ifndef PATH_UTILS_H
#define PATH_UTILS_H

/* 獲取完整路徑中的文件名(帶后綴) */
const char* get_filename_from_path(const char* path);

/* 獲取文件名(不含后綴) */
void get_filename_without_ext(const char* filename, char* out);

/* 獲取文件的擴(kuò)展名(不含 .) */
void get_extension(const char* filename, char* out);

#endif




/************************************************************
 * file: path_utils.c
 ************************************************************/
#include "path_utils.h"
#include <string.h>
#include <stdio.h>

/************************************************************
 * 功能:從完整路徑中提取文件名(帶后綴)
 * 說(shuō)明:
 *   輸入:/home/user/pic/cat.png
 *   輸出:cat.png(返回指針指向原字符串內(nèi)部)
 ************************************************************/
const char* get_filename_from_path(const char* path)
{
    if (!path) return "";

    const char* p1 = strrchr(path, '/');   /* Linux 分隔符 */
    const char* p2 = strrchr(path, '\\');  /* Windows 分隔符 */

    const char* pos = p1;
    if (p2 && (!p1 || p2 > p1)) pos = p2;

    /* 未找到分隔符,傳入的就是文件名 */
    if (!pos)
        return path;

    return pos + 1;
}

/************************************************************
 * 功能:獲取文件名(不含后綴)
 * 輸入:filename = "cat.png"
 * 輸出:out = "cat"
 ************************************************************/
void get_filename_without_ext(const char* filename, char* out)
{
    if (!filename || !out) return;

    /* 找到最后一個(gè) '.' */
    const char* dot = strrchr(filename, '.');

    /* 沒有后綴,例如:Makefile、README */
    if (!dot || dot == filename) {
        strcpy(out, filename);
        return;
    }

    /* 拷貝 '.' 前面的內(nèi)容 */
    size_t len = (size_t)(dot - filename);
    strncpy(out, filename, len);
    out[len] = '\0';
}

/************************************************************
 * 功能:獲取文件的擴(kuò)展名(不含 .)
 * 輸入:filename = "cat.png"
 * 輸出:out = "png"
 ************************************************************/
void get_extension(const char* filename, char* out)
{
    if (!filename || !out) return;

    const char* dot = strrchr(filename, '.');

    /* 無(wú)后綴 */
    if (!dot || dot == filename) {
        out[0] = '\0';
        return;
    }

    strcpy(out, dot + 1);
}




/************************************************************
 * file: main.c
 ************************************************************/
#include <stdio.h>
#include "path_utils.h"

int main()
{
    const char* path = "/home/user/images/cat.jpeg";

    const char* filename = get_filename_from_path(path);
    printf("文件名(含后綴):%s\n", filename);

    char name_no_ext[256];
    get_filename_without_ext(filename, name_no_ext);
    printf("文件名(無(wú)后綴):%s\n", name_no_ext);

    char ext[64];
    get_extension(filename, ext);
    printf("文件后綴:%s\n", ext);

    return 0;
}

六、代碼詳細(xì)解讀

1. get_filename_from_path()

作用:

  • 掃描路徑中最后一個(gè) /\
  • 指向其后半部分的字符串即為 文件名

特點(diǎn):

  • 原始字符串內(nèi)部返回指針,不產(chǎn)生額外拷貝
  • 兼容 Windows 和 Linux 路徑格式
  • 輸入本身是文件名時(shí)直接返回原字符串

2. get_filename_without_ext()

作用:

  • 找到最后一個(gè) .
  • 之前的部分即為“無(wú)后綴文件名”

邊界處理:

  • 沒有點(diǎn) → 返回原文件名
  • .gitignore 這種隱藏文件,不進(jìn)行后綴拆分

3. get_extension()

作用:取最后一個(gè)點(diǎn)后的內(nèi)容作為后綴

邊界處理:

  • 無(wú)點(diǎn) → 返回空字符串
  • 隱藏文件 .bashrc → 無(wú)后綴

七、項(xiàng)目詳細(xì)總結(jié)

本項(xiàng)目采用 C 語(yǔ)言構(gòu)建了一個(gè)跨平臺(tái)可靠的“路徑解析工具庫(kù)”,提供:

  • 從完整路徑中解析文件名
  • 從文件名中解析無(wú)后綴名
  • 解析文件后綴

在工程應(yīng)用中極為常見,可以用于:

  • 文件掃描器
  • 批量文件重命名工具
  • 資源管理器
  • 日志分析
  • 數(shù)據(jù)預(yù)處理工具
  • 構(gòu)建工具(按后綴分類源碼文件)
  • 備份工具

代碼極其輕量、零依賴、跨平臺(tái)、可直接集成到任意項(xiàng)目中。

八、項(xiàng)目常見問(wèn)題及解答

1. 支持多級(jí)后綴(如 .tar.gz)嗎?

默認(rèn)只返回最后一個(gè) .gz

如果你希望返回完整后綴 tar.gz,我可以擴(kuò)展一個(gè)函數(shù)。

2. 如果路徑是目錄怎么辦?

/home/user/docs/

  • 得到文件名為空字符串
  • 可通過(guò)檢測(cè)路徑最后字符是否為 / 來(lái)區(qū)分目錄

3. 支持 UTF-8 中文路徑嗎?

完全支持,只要操作系統(tǒng)支持 UTF-8。

Windows 下需使用 char 路徑即可。

4. 能否解析 Windows 盤符路徑C:\abc\def.txt?

支持,因?yàn)榇a同時(shí)處理了 \。

5. 能否封裝為庫(kù)文件?

可以,我可以繼續(xù)幫你寫:

  • CMakeLists.txt
  • 動(dòng)態(tài)庫(kù) / 靜態(tài)庫(kù)(.so / .dll / .a)

九、擴(kuò)展方向與性能優(yōu)化

1. 增加判斷路徑是否為目錄的函數(shù)

可檢測(cè):

  • 是否以 / 結(jié)尾
  • 是否經(jīng)過(guò) stat 判斷為目錄

2. 增加解析路徑中的目錄部分

例如:/home/user/a/b/c.txt ↓ /home/user/a/b/

我可以幫你擴(kuò)展函數(shù):

void get_directory_from_path(const char* path, char* out); 

3. 增加多級(jí)后綴解析(tar.gz)

4. 增加跨平臺(tái)路徑標(biāo)準(zhǔn)化(把 \ 換成 /)

5. 增加文件類型自動(dòng)判斷(圖片/視頻/音頻等)

通過(guò)后綴映射判斷文件類型。

到此這篇關(guān)于C/C++實(shí)現(xiàn)獲取完整路徑下的文件名及后綴的文章就介紹到這了,更多相關(guān)C++獲取文件名和后綴內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言16進(jìn)制與ASCII字符相互轉(zhuǎn)換

    C語(yǔ)言16進(jìn)制與ASCII字符相互轉(zhuǎn)換

    大家好,本篇文章主要講的是C語(yǔ)言16進(jìn)制與ASCII字符相互轉(zhuǎn)換,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • C++ 冒泡排序數(shù)據(jù)結(jié)構(gòu)、算法及改進(jìn)算法

    C++ 冒泡排序數(shù)據(jù)結(jié)構(gòu)、算法及改進(jìn)算法

    冒泡排序是一種簡(jiǎn)單排序。這種排序是采用“冒泡策略”將最大元素移到最右邊。在冒泡過(guò)程中,相鄰兩個(gè)元素比較,如果左邊大于右邊的,則進(jìn)行交換兩個(gè)元素。這樣一次冒泡后,可確保最大的在最右邊。然后執(zhí)行n次冒泡后排序即可完畢
    2013-04-04
  • VC++實(shí)現(xiàn)選擇排序算法簡(jiǎn)單示例

    VC++實(shí)現(xiàn)選擇排序算法簡(jiǎn)單示例

    這篇文章主要介紹了VC++實(shí)現(xiàn)選擇排序算法簡(jiǎn)單示例,代碼簡(jiǎn)潔易懂,有助于讀者對(duì)數(shù)據(jù)結(jié)構(gòu)與算法的學(xué)習(xí),需要的朋友可以參考下
    2014-08-08
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)不掛科指南之線性表詳解

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)不掛科指南之線性表詳解

    線性表是由?n(n≥0)個(gè)數(shù)據(jù)元素組成的有窮序列,這篇文章主要來(lái)和大家來(lái)了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)中的線性表,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-09-09
  • C語(yǔ)言文件操作之fread函數(shù)詳解

    C語(yǔ)言文件操作之fread函數(shù)詳解

    fread()函數(shù)用來(lái)從指定文件中讀取塊數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言文件操作之fread函數(shù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Qt 中集成mqtt協(xié)議的使用方法

    Qt 中集成mqtt協(xié)議的使用方法

    文章介紹了如何在工程中引入qmqtt庫(kù),并通過(guò)聲明一個(gè)單例類來(lái)暴露訂閱到的主題數(shù)據(jù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-02-02
  • C語(yǔ)言聯(lián)合體Union特點(diǎn)及運(yùn)用全面講解教程

    C語(yǔ)言聯(lián)合體Union特點(diǎn)及運(yùn)用全面講解教程

    這篇文章主要為大家介紹了C語(yǔ)言聯(lián)合體Union特點(diǎn)及運(yùn)用的全面講解教程有需要深度朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2021-10-10
  • C語(yǔ)言中的狀態(tài)機(jī)設(shè)計(jì)深入講解

    C語(yǔ)言中的狀態(tài)機(jī)設(shè)計(jì)深入講解

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言狀態(tài)機(jī)設(shè)計(jì)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • C/C++宏替換實(shí)現(xiàn)詳解

    C/C++宏替換實(shí)現(xiàn)詳解

    這篇文章主要介紹了C/C++宏替換實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 解析c++中參數(shù)對(duì)象與局部對(duì)象的析構(gòu)順序的詳解

    解析c++中參數(shù)對(duì)象與局部對(duì)象的析構(gòu)順序的詳解

    本篇文章是對(duì)c++中參數(shù)對(duì)象與局部對(duì)象的析構(gòu)順序進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05

最新評(píng)論

桦甸市| 化德县| 辽中县| 青神县| 于都县| 南安市| 新源县| 承德县| 资讯 | 慈溪市| 沧州市| 海城市| 阳西县| 湛江市| 吉木乃县| 大宁县| 西安市| 济源市| 榕江县| 新营市| 疏附县| 临汾市| 涿鹿县| 北安市| 清流县| 涟水县| 凤城市| 河北区| 白山市| 陇西县| 宾川县| 常山县| 曲麻莱县| 丹阳市| 晴隆县| 佛山市| 泰顺县| 大同县| 临沭县| 合作市| 和龙市|