#pragma once
#include <list>
#include <string>
#include <vector>
#include <sstream>
class CStdStr
{
public:
CStdStr();
~CStdStr();
//字符操作
static std::string AddSlashIfNeeded(const std::string strDir, const char& cDir = '\');
static std::string GetDirOfDir(const std::string& strDir, const char& cDir = '\');
static std::string GetDirOfFile(const std::string& strFile, const char& cDir = '\');
static std::string GetSuffixOfFile(const std::string& strFile, bool bWithDot = true);
static std::string GetNameOfDir(const std::string& strDir, const char& cDir = '\');
static std::string GetNameOfFile(const std::string& strFile, const bool& bWithSuffix = true, const char& cDir = '\');
static std::string ReplaceSuffix(const std::string& strFilePath, const std::string& strNewSuffix);
static std::string Trim(const std::string& strOri, const char& cToTrim = ' ');
static std::string TrimHead(const std::string& strOri, const char& cToTrim = ' ');
static std::string TrimTail(const std::string& strOri, const char& cToTrim = ' ');
static std::vector<std::string> Split(const std::string& str, const std::string& pattern);
};
class CStdFile
{
public:
CStdFile();
~CStdFile();
//文件操作
static bool CopyAFile(const std::string& strSrcFileName, std::string& strDstFileName, const bool& bFailIfExists);
static bool IfAccessFile(const std::string& strFilePath);
static int ParseTXTFile(const std::string& strFilePath, std::list<std::string>& lContentInFile);
static int ParseTXTFile(const std::string& strFilePath, std::vector<std::string>& vContentInFile);
static int SaveTXTFile(const std::string& strTxtPath, std::list<std::string>& lContent, bool bAppend = false);
static int SaveTXTFile(const std::string& strTxtPath, std::vector<std::string>& vContent, bool bAppend = false);
static int SaveTXTFile(const std::string& strTxtPath, const std::string& strLine, bool bAppend = false);
};
class CStdTpl
{
public:
CStdTpl()
{
}
~CStdTpl()
{
}
template <class T>
static bool VectorContains(std::vector<T>& vTs, const T& value);
template <class T>
static bool VectorContains(std::vector<T>& vTsSum, std::vector<T>& vTsPart);
template <class T>
static int VectorFind(std::vector<T>& vTs, const T& value, bool bPositiveGoing = true);
template <class T>
static int ConvertFromString(T &value, const std::string &s);
template <class T>
static std::string ConvertToString(T value);
};
template <class T>
bool CStdTpl::VectorContains(std::vector<T>& vTs, const T& value)
{
for (int i = 0; i < vTs.size(); ++i)
{
if (vTs[i] == value)
{
return true;
}
}
return false;
}
template <class T>
bool CStdTpl::VectorContains(std::vector<T>& vTsSum, std::vector<T>& vTsPart)
{
for (int i = 0; i < vTsPart.size(); ++i)
{
if (!VectorContains(vTsSum, vTsPart[i]))
{
return false;
}
}
return true;
}
template <class T>
int CStdTpl::VectorFind(std::vector<T>& vTs, const T& value, bool bPositiveGoing /*= true*/)
{
if (bPositiveGoing)
{
for (int i = 0; i < vTs.size(); ++i)
{
if (vTs[i] == value)
{
return i;
}
}
}
else
{
for (int i = int(vTs.size() - 1); i >= 0; --i)
{
if (vTs[i] == value)
{
return i;
}
}
}
return -1;
}
template <class T>
int CStdTpl::ConvertFromString(T &value, const std::string &s)
{
std::stringstream ss(s);
ss >> value;
return 0;
}
template <class T>
std::string CStdTpl::ConvertToString(T value)
{
std::stringstream ss;
ss << value;
return ss.str();
}
std::string ToString(const double& dValue);
#include "StdStrFile.h"
#include <fstream>
CStdStr::CStdStr()
{
}
CStdStr::~CStdStr()
{
}
std::string CStdStr::AddSlashIfNeeded(const std::string strDir, const char& cDir/* = '\'*/)
{
std::string strDirNew(strDir);
if (strDir[strDir.length() - 1] != cDir)
{
strDirNew += cDir;
}
return strDirNew;
}
std::string CStdStr::GetDirOfDir(const std::string& strDir, const char& cDir/* = '\'*/)
{
std::string strDirPath(strDir);
strDirPath = TrimTail(strDirPath, cDir);
int index = (int)strDirPath.rfind(cDir);
if (index != -1)
{
return strDirPath.substr(0, index);
}
else
{
return strDirPath;
}
}
std::string CStdStr::GetDirOfFile(const std::string& strFile, const char& cDir /*= '\'*/)
{
std::string strFilePath(strFile);
strFilePath = TrimTail(strFilePath, cDir);
int index = (int)strFilePath.rfind(cDir);
if (index != -1)
{
return strFilePath.substr(0, index);
}
else
{
return strFilePath;
}
}
std::string CStdStr::GetSuffixOfFile(const std::string& strFile, bool bWithDot /*= true*/)
{
std::string strFileName = GetNameOfFile(strFile);
int index = (int)strFileName.rfind(".");
if (index != -1)
{
if (bWithDot)
{
return strFileName.substr(index);
}
else
{
return strFileName.substr(index + 1);
}
}
else
{
return "";
}
}
std::string CStdStr::GetNameOfDir(const std::string& strDir, const char& cDir /*= '\'*/)
{
std::string strDirPath(strDir);
strDirPath = TrimTail(strDirPath, cDir);
int index = (int)strDirPath.rfind('\');
return strDirPath.substr(index + 1, strDirPath.length() - index - 1);
}
std::string CStdStr::Trim(const std::string& strOri, const char& cToTrim/* = ' '*/)
{
std::string text(strOri);
if (!text.empty())
{
text.erase(0, text.find_first_not_of("
"));
text.erase(text.find_last_not_of("
") + 1);
text.erase(0, text.find_first_not_of(cToTrim));
text.erase(text.find_last_not_of(cToTrim) + 1);
}
return text;
}
std::string CStdStr::TrimHead(const std::string& strOri, const char& cToTrim/* = ' '*/)
{
std::string s(strOri);
size_t i = 0;
for (; i < s.length(); ++i)
{
if (s[i] != ' ' && s[i] != ' '&&s[i] != '
'&&s[i] != '
' && s[i] != cToTrim)
break;
}
s = s.substr(i, s.length() - i);
return s;
}
std::string CStdStr::TrimTail(const std::string& strOri, const char& cToTrim/* = ' '*/)
{
std::string s(strOri);
int i = (int)s.length() - 1;
for (; i > 0; --i)
{
if (s[i] != ' ' && s[i] != ' '&&s[i] != '
'&&s[i] != '
' && s[i] != cToTrim)
break;
}
s = s.substr(0, i + 1);
return s;
}
std::string CStdStr::GetNameOfFile(const std::string& strFile, const bool& bWithSuffix /*= true*/, const char& cDir/* = '\'*/)
{
int index = (int)strFile.rfind(cDir);
std::string strFileName = strFile.substr(index + 1, strFile.length() - index - 1);
if (bWithSuffix)
{
return strFileName;
}
else
{
int nIndexOfDot = (int)strFileName.rfind('.');
if (nIndexOfDot == -1)
{
return strFileName;
}
else
{
return strFileName.substr(0, nIndexOfDot);
}
}
}
std::string CStdStr::ReplaceSuffix(const std::string& strFilePath, const std::string& strNewSuffix)
{
int nIndex = (int)strFilePath.rfind('.');
if (nIndex != -1)
{
return strFilePath.substr(0, nIndex) + strNewSuffix;
}
else
{
return strFilePath + strNewSuffix;
}
}
std::vector<std::string> CStdStr::Split(const std::string& str, const std::string& pattern)
{
std::string strBak(str);
std::string::size_type pos;
std::vector<std::string> result;
//扩展字符串以方便操作
strBak += pattern;
size_t size = strBak.size();
for (size_t i = 0; i < size; i++)
{
pos = strBak.find(pattern, i);
if (pos < size)
{
std::string s = strBak.substr(i, pos - i);
result.push_back(s);
i = (int)pos + (int)pattern.size() - 1;
}
}
return result;
}
CStdFile::CStdFile()
{
}
CStdFile::~CStdFile()
{
}
bool CStdFile::IfAccessFile(const std::string& strFilePath)
{
std::fstream _file;
_file.open(strFilePath, std::ios::in);
bool bRes = (_file != 0);
_file.close();
return bRes;
}
bool CStdFile::CopyAFile(const std::string& strSrcFileName, std::string& strDstFileName, const bool& bFailIfExists)
{
std::ifstream in;
std::ofstream out;
in.open(strSrcFileName, std::ios::binary);//打开源文件
if (in.fail())//打开源文件失败
{
in.close();
out.close();
return false;
}
if (bFailIfExists && IfAccessFile(strDstFileName))
{
out.close();
in.close();
return false;
}
out.open(strDstFileName, std::ios::binary);//创建目标文件
if (out.fail())//创建文件失败
{
out.close();
in.close();
return false;
}
//复制文件
out << in.rdbuf();
out.close();
in.close();
return true;
}
int CStdFile::ParseTXTFile(const std::string& strFilePath, std::list<std::string>& lContentInFile)
{
lContentInFile.clear();
std::ifstream in(strFilePath);
std::string line;
if (in) // 有该文件
{
while (getline(in, line)) // line中不包括每行的换行符
{
lContentInFile.push_back(line);
}
}
in.close();
return (int)lContentInFile.size();
}
int CStdFile::ParseTXTFile(const std::string& strFilePath, std::vector<std::string>& vContentInFile)
{
vContentInFile.clear();
std::ifstream in(strFilePath);
std::string line;
if (in) // 有该文件
{
while (getline(in, line)) // line中不包括每行的换行符
{
vContentInFile.push_back(line);
}
}
in.close();
return (int)vContentInFile.size();
}
int CStdFile::SaveTXTFile(const std::string& strTxtPath, std::list<std::string>& lContent, bool bAppend /*= false*/)
{
std::ofstream file;
if (bAppend)
{
file.open(strTxtPath, std::ios::in | std::ios::out | std::ios::app | std::ios::ate);
}
else
{
file.open(strTxtPath, std::ios::in | std::ios::out | std::ios::trunc);
}
for (std::list<std::string>::iterator it = lContent.begin(); it != lContent.end(); ++it)
{
file << *it;
}
file.close();
return 0;
}
int CStdFile::SaveTXTFile(const std::string& strTxtPath, std::vector<std::string>& vContent, bool bAppend /*= false*/)
{
std::ofstream file;
if (bAppend)
{
file.open(strTxtPath, std::ios::in | std::ios::out | std::ios::app | std::ios::ate);
}
else
{
file.open(strTxtPath, std::ios::in | std::ios::out | std::ios::trunc);
}
for (std::vector<std::string>::iterator it = vContent.begin(); it != vContent.end(); ++it)
{
file << *it;
}
file.close();
return 0;
}
int CStdFile::SaveTXTFile(const std::string& strTxtPath, const std::string& strLine, bool bAppend /*= false*/)
{
std::ofstream file;
if (bAppend)
{
file.open(strTxtPath, std::ios::in | std::ios::out | std::ios::app | std::ios::ate);
}
else
{
file.open(strTxtPath, std::ios::in | std::ios::out | std::ios::trunc);
}
file << strLine;
file.close();
return 0;
}
std::string ToString(const double& dValue)
{
char tmp[256];
sprintf_s(tmp, "%.10lf", dValue);
return std::string(tmp);
}