📄 inifile.cpp
字号:
#include "StdAfx.h"
#include ".\inifile.h"
CIniFile::CIniFile(void) // Default constructor
{
}
CIniFile::~CIniFile(void)
{
}
// A function to trim whitespace from both sides of a given string
void Trim(std::string& str, const std::string & ChrsToTrim = " \t\n\r", int TrimDir = 0)
{
size_t startIndex = str.find_first_not_of(ChrsToTrim);
if (startIndex == std::string::npos){str.erase(); return;}
if (TrimDir < 2) str = str.substr(startIndex, str.size()-startIndex);
if (TrimDir!=1) str = str.substr(0, str.find_last_not_of(ChrsToTrim) + 1);
}
//inline void TrimRight(std::string& str, const std::string & ChrsToTrim = " \t\n\r")
//{
// Trim(str, ChrsToTrim, 2);
//}
//inline void TrimLeft(std::string& str, const std::string & ChrsToTrim = " \t\n\r")
//{
// Trim(str, ChrsToTrim, 1);
//}
// A function to transform a string to uppercase if neccessary
//void UCase(string& str, bool ucase)
//{
// if(ucase) transform(str.begin(), str.end(), str.begin(), toupper);
//}
bool CIniFile::Load(string FileName, vector<Record>& content)
{
string s; // Holds the current line from the ini file
string CurrentSection; // Holds the current section name
ifstream inFile (FileName.c_str()); // Create an input filestream
if (!inFile.is_open()) return false; // If the input file doesn't open, then return
content.clear(); // Clear the content vector
string comments = ""; // A string to store comments in
while(!std::getline(inFile, s).eof()) // Read until the end of the file
{
Trim(s); // Trim whitespace from the ends
if(!s.empty()) // Make sure its not a blank line
{
Record r; // Define a new record
if((s[0]=='#')||(s[0]==';')) // Is this a commented line?
{
if ((s.find('[')==string::npos)&& // If there is no [ or =
(s.find('=')==string::npos)) // Then it's a comment
{
comments += s + '\n'; // Add the comment to the current comments string
} else {
r.Commented = s[0]; // Save the comment character
s.erase(s.begin()); // Remove the comment for further processing
Trim(s);
}// Remove any more whitespace
} else r.Commented = ' '; // else mark it as not being a comment
if(s.find('[')!=string::npos) // Is this line a section?
{
s.erase(s.begin()); // Erase the leading bracket
s.erase(s.find(']')); // Erase the trailing bracket
r.Comments = comments; // Add the comments string (if any)
comments = ""; // Clear the comments for re-use
r.Section = s; // Set the Section value
r.Key = ""; // Set the Key value
r.Value = ""; // Set the Value value
CurrentSection = s;
}
if(s.find('=')!=string::npos) // Is this line a Key/Value?
{
r.Comments = comments; // Add the comments string (if any)
comments = ""; // Clear the comments for re-use
r.Section = CurrentSection; // Set the section to the current Section
r.Key = s.substr(0,s.find('=')); // Set the Key value to everything before the = sign
r.Value = s.substr(s.find('=')+1); // Set the Value to everything after the = sign
}
if(comments == "") // Don't add a record yet if its a comment line
content.push_back(r); // Add the record to content
}
}
inFile.close(); // Close the file
return true;
}
bool CIniFile::Save(string FileName, vector<Record>& content)
{
ofstream outFile (FileName.c_str()); // Create an output filestream
if (!outFile.is_open()) return false; // If the output file doesn't open, then return
for (int i=0;i<(int)content.size();i++) // Loop through each vector
{
outFile << content[i].Comments; // Write out the comments
if(content[i].Key == "") // Is this a section?
outFile << content[i].Commented << "["
<< content[i].Section << "]" << endl; // Then format the section
else
outFile << content[i].Commented << content[i].Key
<< "=" << content[i].Value << endl; // Else format a key/value
}
outFile.close(); // Close the file
return true;
}
string CIniFile::Content(string FileName)
{
string s=""; // Hold our return string
vector<Record> content; // Holds the current record // Holds the current record
if (Load(FileName, content)) // Make sure the file loads
{
for (int i=0;i<(int)content.size();i++) // Loop through the content
{
if(content[i].Comments != "") s += content[i].Comments; // Add the comments
if(content[i].Commented != ' ') s += content[i].Commented; // If this is commented, then add it
if((content[i].Key == "")) // Is this a section?
s += '[' + content[i].Section + ']'; // Add the section
else s += content[i].Key + '=' + content[i].Value; // Or the Key value to the return srting
if (i != content.size()) s += '\n'; // If this is not the last line, add a CrLf
}
return s; // Return the contents
}
return "";
}
vector<string> CIniFile::GetSectionNames(string FileName)
{
vector<string> data; // Holds the return data
vector<Record> content; // Holds the current record // Holds the current record
if (Load(FileName, content)) // Make sure the file is loaded
{
for (int i=0;i<(int)content.size();i++) // Loop through the content
{
if(content[i].Key =="") // If there is no key value, then its a section
data.push_back(content[i].Section); // Add the section to the return data
}
}
return data; // Return the data
}
vector<CIniFile::Record> CIniFile::GetSection(string SectionName, string FileName)
{
vector<Record> data; // Holds the return data
vector<Record> content; // Holds the current record // Holds the current record
if (Load(FileName, content)) // Make sure the file is loaded
{
for (int i=0;i<(int)content.size();i++) // Loop through the content
{
if((content[i].Section == SectionName) && // If this is the section name we want
(content[i].Key != "")) // but not the section name itself
data.push_back(content[i]); // Add the record to the return data
}
}
return data; // Return the data
}
bool CIniFile::RecordExists(string KeyName, string SectionName, string FileName)
{
vector<Record> content; // Holds the current record // Holds the current record
if (Load(FileName, content)) // Make sure the file is loaded
{
vector<Record>::iterator iter = std::find_if(content.begin(),
content.end(),
CIniFile::RecordSectionKeyIs(SectionName,KeyName)); // Locate the Section/Key
if (iter == content.end()) return false; // The Section/Key was not found
}
return true; // The Section/Key was found
}
bool CIniFile::SectionExists(string SectionName, string FileName)
{
vector<Record> content; // Holds the current record // Holds the current record
if (Load(FileName, content)) // Make sure the file is loaded
{
vector<Record>::iterator iter = std::find_if(content.begin(),
content.end(),
CIniFile::RecordSectionIs(SectionName)); // Locate the Section
if (iter == content.end()) return false; // The Section was not found
}
return true; // The Section was found
}
vector<CIniFile::Record> CIniFile::GetRecord(string KeyName, string SectionName, string FileName)
{
vector<Record> data; // Holds the return data
vector<Record> content; // Holds the current record // Holds the current record
if (Load(FileName, content)) // Make sure the file is loaded
{
vector<Record>::iterator iter = std::find_if(content.begin(),
content.end(),
CIniFile::RecordSectionKeyIs(SectionName,KeyName)); // Locate the Record
if (iter == content.end()) return data; // The Record was not found
data.push_back (*iter); // The Record was found
}
return data; // Return the Record
}
string CIniFile::GetValue(string KeyName, string SectionName, string FileName)
{
vector<Record> content = GetRecord(KeyName,SectionName, FileName); // Get the Record
if(!content.empty()) // Make sure there is a value to return
return content[0].Value; // And return the value
return ""; // No value was found
}
bool CIniFile::SetValue(string KeyName, string Value, string SectionName, string FileName)
{
vector<Record> content; // Holds the current record // Holds the current record
if (Load(FileName, content)) // Make sure the file is loaded
{
if(!SectionExists(SectionName,FileName)) // If the Section doesn't exist
{
Record s = {"",' ',SectionName,"",""}; // Define a new section
Record r = {"",' ',SectionName,KeyName,Value}; // Define a new record
content.push_back(s); // Add the section
content.push_back(r); // Add the record
return Save(FileName,content); // Save
}
if(!RecordExists(KeyName,SectionName,FileName)) // If the Key doesn't exist
{
vector<Record>::iterator iter = std::find_if(content.begin(),
content.end(),
CIniFile::RecordSectionIs(SectionName)); // Locate the Section
iter++; // Advance just past the section
Record r = {"",' ',SectionName,KeyName,Value}; // Define a new record
content.insert(iter,r); // Add the record
return Save(FileName,content); // Save
}
vector<Record>::iterator iter = std::find_if(content.begin(),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -