服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++提取文件名与提取XML文件的方法详解

C++提取文件名与提取XML文件的方法详解

2022-10-13 13:47deepython C/C++

这篇文章主要为大家详细介绍了C++提取文件名与提取XML文件的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

1、提取文件名

  • 查找容器内子序列的最后一次出现的位置

std::find_end(str.begin(), str.end(), pattern.begin(), pattern.end())

  • 查找容器内子序列的第一次出现的位置

std::search()

  • find函数主要实现的是在容器内查找指定的元素,并且这个元素必须是基本数据类型的。查找成功返回一个指向指定元素的迭代器,查找失败返回end迭代器。

std::find()

  • 返回两个迭代器之间的距离,也可以理解为计算两个元素 first 和 last 之间的元素数

std::distance(str.begin(), result)

  • substr()截取字符串子序列,第一个参数为开始索引,第二参数是子序列长度
  • substring() 截取字符串子序列,第一个参数为开始索引,第二参数是结束索引
  • str.substr(0, std::distance(str.begin(), result) + 1)
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <string>
# include  <algorithm> //注意要包含该头文件
using namespace std;
std::string ExtractFileName(std::string path)
{
   //不带后缀名的文件名
   std::string fileBaseName;
   //文件目录
   std::string str = path;
   //待匹配的子序列
   std::string pattern = "/";
   //查找容器内子序列的最后一次出现的位置,在[str.begin(),str.end ())内搜索由[pattern.begin(), pattern.end())
   //组成的子序列,然后将迭代器返回到其第一个元素,即pattern.begin(),若没有发现,返回-1
   // 与std::search()类似,后者返回子序列第一次出现的位置
   auto result = std::find_end(str.begin(), str.end(), pattern.begin(), pattern.end());
   if (result != str.end())
   {
    //substr()截取字符串子序列,第一个参数为开始索引,第二参数是子序列长度
    //substring(截取字符串子序列,第一个参数为开始索引,第二参数是结束索引
    //目录
    auto dirName = str.substr(0, std::distance(str.begin(), result) + 1);
    //带后缀名的文件名
    auto fileName = str.substr(std::distance(str.begin(), result) + 1);
    //不带后缀名的文件名
    fileBaseName = fileName.substr(0, fileName.size() - 4);
   }
   return fileBaseName;
}

2、提取XML文件

首先要引入tinyxml2的头文件,tinyxml2.h和tinyxml2.cpp

xml文件内容:

<?xml version="1.0" encoding="UTF-8"?> MD5123

声明XMLDocument变量,存放xml文件

?
1
tinyxml2::XMLDocument doc

读取xml文件

?
1
doc.LoadFile("demo.xml")

获取头节点

?
1
XMLElement *root = doc.RootElement();

头结点的兄弟节点

?
1
XMLElement *root1 = root->NextSiblingElement()

获取节点的id的属性

?
1
root1->Attribute("id");

获取节点的name的属性

?
1
head->Attribute("name")

获取节点的文本内容

?
1
root1->GetText();

获取头结点下的head节点

?
1
XMLElement *head = root->FirstChildElement("head")
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#include <iostream>
#include <Windows.h>
#include <string>
#include "tinyxml2-master/tinyxml2.h"
using namespace std;
using namespace tinyxml2;
void readXML()
{
//声明XMLDocument变量
    tinyxml2::XMLDocument doc;
    //读取xml文件
    doc.LoadFile("demo.xml");
    //判断是否读取成功
    if (doc.Error())
    {
        printf("Load XML failed!");
        return;
    }
    //获取头节点
    XMLElement *root = doc.RootElement();
//判断头结点有没有兄弟节点
    if (root->NextSiblingElement() != NULL)
    {
        //头结点的兄弟节点
        XMLElement *root1 = root->NextSiblingElement();
        //获取节点的id的属性
        printf("第二个一级节点%s\n", root1->Attribute("id"));
    }
    if (root->GetText() != NULL)
    {
        string rootStr = root->GetText();
        printf("第一个一级节点的内容%s\n", rootStr);
    }
    XMLElement *head = root->FirstChildElement("head");
    //获取节点的内容
    printf("head的内容%s\n", head->GetText());
    printf("head的id%s\n", head->Attribute("id"));
    printf("head的name%s\n", head->Attribute("name"));
    system("pause");

总结

今天用C++实现了提取文件名与XML文件。

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注服务器之家的更多内容!              

原文链接:https://blog.csdn.net/weixin_44095417/article/details/123296235 

延伸 · 阅读

精彩推荐
  • C/C++C语言的基本语法详解

    C语言的基本语法详解

    本篇文章主要讲解C语言 基本语法,这里提供简单的示例和代码来详细讲解C语言的基本语法,开始学习C语言的朋友可以看一下,希望能够给你带来帮助...

    小途7692022-01-10
  • C/C++C语言二维数组几种常用的表示方法

    C语言二维数组几种常用的表示方法

    今天小编就为大家分享一篇关于C语言二维数组几种常用的表示方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随...

    BLSxiaopanlaile8932021-07-24
  • C/C++C++中关键字 override 的简析

    C++中关键字 override 的简析

    这篇小文来聊聊 C++中的关键字 override,它的含义其实两句话就说完了,但为了叙述的完整性,让我们从虚函数说起。感兴趣的小伙伴可以跟着小编一起学习...

    干燥剂10242022-01-12
  • C/C++解析四则表达式的编译过程及生成汇编代码

    解析四则表达式的编译过程及生成汇编代码

    本篇文章是对四则表达式的编译过程及生成汇编代码进行了详细的分析介绍,需要的朋友参考下...

    C语言教程网5492020-12-16
  • C/C++C++11新特性之智能指针(shared_ptr/unique_ptr/weak_ptr)

    C++11新特性之智能指针(shared_ptr/unique_ptr/weak_ptr)

    这篇文章主要介绍了C++11新特性之智能指针,包括shared_ptr, unique_ptr和weak_ptr的基本使用,感兴趣的小伙伴们可以参考一下 ...

    一根笨茄子9062021-04-12
  • C/C++C++ 在堆上开辟与释放二维、三维指针详细解析

    C++ 在堆上开辟与释放二维、三维指针详细解析

    一维指针其实就相当于一维数组,不用去看书上所说的数组在内存中的首地址这些晦涩的话,以此类推 二维指针就相当于二维数组,新手对一维数组的开辟...

    C++教程网8972020-12-28
  • C/C++C++类和对象补充

    C++类和对象补充

    类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫类的实例化。每个对象都是类的一个具体实例(...

    蓝乐7072022-02-12
  • C/C++C语言中lseek()函数和fseek()函数的使用详解

    C语言中lseek()函数和fseek()函数的使用详解

    这篇文章主要介绍了C语言中lseek()函数和fseek()函数的使用详解,是C语言入门学习中的基础知识,需要的朋友可以参考下...

    C语言教程网8152021-03-09