经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
C++提取文件名与提取XML文件的方法详解
来源:jb51  时间:2022/3/7 11:13:01  对本文有异议

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

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

总结

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

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号