C++提取文件名與提取XML文件的方法詳解
1、提取文件名
- 查找容器內(nèi)子序列的最后一次出現(xiàn)的位置
std::find_end(str.begin(), str.end(), pattern.begin(), pattern.end())
- 查找容器內(nèi)子序列的第一次出現(xiàn)的位置
std::search()
- find函數(shù)主要實(shí)現(xiàn)的是在容器內(nèi)查找指定的元素,并且這個(gè)元素必須是基本數(shù)據(jù)類型的。查找成功返回一個(gè)指向指定元素的迭代器,查找失敗返回end迭代器。
std::find()
- 返回兩個(gè)迭代器之間的距離,也可以理解為計(jì)算兩個(gè)元素 first 和 last 之間的元素?cái)?shù)
std::distance(str.begin(), result)
- substr()截取字符串子序列,第一個(gè)參數(shù)為開(kāi)始索引,第二參數(shù)是子序列長(zhǎng)度
- substring() 截取字符串子序列,第一個(gè)參數(shù)為開(kāi)始索引,第二參數(shù)是結(jié)束索引
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 = "/";
//查找容器內(nèi)子序列的最后一次出現(xiàn)的位置,在[str.begin(),str.end ())內(nèi)搜索由[pattern.begin(), pattern.end())
//組成的子序列,然后將迭代器返回到其第一個(gè)元素,即pattern.begin(),若沒(méi)有發(fā)現(xiàn),返回-1
// 與std::search()類似,后者返回子序列第一次出現(xiàn)的位置
auto result = std::find_end(str.begin(), str.end(), pattern.begin(), pattern.end());
if (result != str.end())
{
//substr()截取字符串子序列,第一個(gè)參數(shù)為開(kāi)始索引,第二參數(shù)是子序列長(zhǎng)度
//substring(截取字符串子序列,第一個(gè)參數(shù)為開(kāi)始索引,第二參數(shù)是結(jié)束索引
//目錄
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文件內(nèi)容:
<?xml version="1.0" encoding="UTF-8"?> MD5123
聲明XMLDocument變量,存放xml文件
tinyxml2::XMLDocument doc
讀取xml文件
doc.LoadFile("demo.xml")獲取頭節(jié)點(diǎn)
XMLElement *root = doc.RootElement();
頭結(jié)點(diǎn)的兄弟節(jié)點(diǎn)
XMLElement *root1 = root->NextSiblingElement()
獲取節(jié)點(diǎn)的id的屬性
root1->Attribute("id");獲取節(jié)點(diǎn)的name的屬性
head->Attribute("name")獲取節(jié)點(diǎn)的文本內(nèi)容
root1->GetText();
獲取頭結(jié)點(diǎn)下的head節(jié)點(diǎn)
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;
}
//獲取頭節(jié)點(diǎn)
XMLElement *root = doc.RootElement();
//判斷頭結(jié)點(diǎn)有沒(méi)有兄弟節(jié)點(diǎn)
if (root->NextSiblingElement() != NULL)
{
//頭結(jié)點(diǎn)的兄弟節(jié)點(diǎn)
XMLElement *root1 = root->NextSiblingElement();
//獲取節(jié)點(diǎn)的id的屬性
printf("第二個(gè)一級(jí)節(jié)點(diǎn)%s\n", root1->Attribute("id"));
}
if (root->GetText() != NULL)
{
string rootStr = root->GetText();
printf("第一個(gè)一級(jí)節(jié)點(diǎn)的內(nèi)容%s\n", rootStr);
}
XMLElement *head = root->FirstChildElement("head");
//獲取節(jié)點(diǎn)的內(nèi)容
printf("head的內(nèi)容%s\n", head->GetText());
printf("head的id%s\n", head->Attribute("id"));
printf("head的name%s\n", head->Attribute("name"));
system("pause");
總結(jié)
今天用C++實(shí)現(xiàn)了提取文件名與XML文件。
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C++實(shí)現(xiàn)高并發(fā)異步定時(shí)器
這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)高并發(fā)異步定時(shí)器,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11
C語(yǔ)言用函數(shù)指針實(shí)現(xiàn)一個(gè)特別的計(jì)算器
函數(shù)指針是一個(gè)指針變量,它可以存儲(chǔ)函數(shù)的地址,然后使用函數(shù)指針,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言用函數(shù)指針實(shí)現(xiàn)計(jì)算器的方法,需要的朋友可以參考下2022-07-07
C++?重載運(yùn)算符在HotSpot?VM中的應(yīng)用小結(jié)
C++支持運(yùn)算符重載,對(duì)于Java開(kāi)發(fā)者來(lái)說(shuō),這個(gè)可能比較陌生一些,因?yàn)镴ava不支持運(yùn)算符重載,下面介紹一下HotSpot?VM中的運(yùn)算符重載,感興趣的朋友跟隨小編一起看看吧2023-09-09
C++新特性詳細(xì)分析基于范圍的for循環(huán)
C++11這次的更新帶來(lái)了令很多C++程序員期待已久的for?range循環(huán),每次看到j(luò)avascript,?lua里的for?range,心想要是C++能有多好,心里別提多酸了。這次C++11不負(fù)眾望,再也不用羨慕別家人的for?range了。下面看下C++11的for循環(huán)的新用法2022-04-04
C++設(shè)置超時(shí)時(shí)間的簡(jiǎn)單實(shí)現(xiàn)方法
這篇文章主要介紹了C++設(shè)置超時(shí)時(shí)間的簡(jiǎn)單實(shí)現(xiàn)方法,涉及系統(tǒng)函數(shù)setsockopt對(duì)套接口的操作,具有一定的實(shí)用價(jià)值,需要的朋友可以參考下2014-10-10
更優(yōu)雅的C++字符串格式化實(shí)現(xiàn)方法詳解
在用C++編寫代碼時(shí),經(jīng)常需要用到字符串拼接及格式化,尤其是在拼寫sql語(yǔ)句時(shí)。所以本文為大家介紹了更優(yōu)雅的C++字符串格式化實(shí)現(xiàn)方法,希望對(duì)大家有所幫助2023-04-04

