Unix: A C++ Configuration Reader
By admin on Feb 27, 2008 in C/C++, Programming
This a C++ configuration reader I wrote long time back to read a properties file. Some one asked me for some code recently. So I posted the source code here.
You can see the functions from the header file.
class ConfigReader : public std::map<std::string, std::string> { public: // Constructor ConfigReader(const std::string& initFileName); // Destructor ~ConfigReader(); // static methods static ConfigReader* getInstance (const std::string& initFileName = CONFIG_FILE_NAME) ; void refresh() ; void load(const std::string& initFileName) throw (ConfigureFailure); void save(const std::string& outputFileName) throw (ConfigureFailure); int getInt(const std::string& property, int defaultValue = 0); bool getBool(const std::string& property, bool defaultValue = false); std::string getString(const std::string& property, const char* defaultValue = ""); protected: // Singleton object static ConfigReader* _instance ; #if defined(__MULTITHREAD__) static pthread_mutex_t _lock ; #endif };
It is a Singleton class and make use of the Standard Template Library.
Alastair Taylor | Apr 15, 2008 | Reply
Works nicely, thanks.
Added a spaces trim to allow ‘property = value’, ‘property=value’ etc..
if(length != std::string::npos)
{
leftSide = command.substr(0, length);
rightSide = command.substr(length + 1, command.size() – length);
/* remove trailing spaces */
/* remove leading spaces */
/* allows for property = stuff, property=stuff etc…. */
TrimSpaces(leftSide);
TrimSpaces(rightSide);
}
Alastair Taylor | Apr 15, 2008 | Reply
void TrimSpaces(string &str)
{
size_t startpos = str.find_first_not_of(” \t”); // Find the first character position after excluding leading blank spaces
size_t endpos = str.find_last_not_of(” \t”); // Find the first character position from reverse af
// if all spaces or empty return an empty string
if((string::npos == startpos) || (string::npos == endpos))
{
str = “”;
}
else
{
str = str.substr(startpos, endpos – startpos + 1);
}
}
Benjamin Jackson | Nov 11, 2008 | Reply
That you much for posting this. I found it a great starting point and it reduced the work of getting a property reader up and running by a lot.
Also thanks for the previous comment.
I changed it up just a bit to allow multiple files to
reside in the program at once:
…
static std::map instances ;
…
ConfigReader* ConfigReader::getInstance(const std::string& initFileName) {
if (instances.find(initFileName) == instances.end())
instances[initFileName] = new ConfigReader(initFileName);
return instances[initFileName] ;
}