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)
#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文件

tinyxml2::XMLDocument doc

讀取xml文件

doc.LoadFile("demo.xml")

獲取頭節點

XMLElement *root = doc.RootElement();

頭結點的兄弟節點

XMLElement *root1 = root->NextSiblingElement()

獲取節點的id的屬性

root1->Attribute("id");

獲取節點的name的屬性

head->Attribute("name")

獲取節點的文本內容

root1->GetText();

獲取頭結點下的head節點

XMLElement *head = root->FirstChildElement("head")
#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文件。

本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!                

推薦閱讀: