Jump to content

Recommended Posts

Posted

 

 

EasyConfig C++ Class

 

 

Config files such as *.ini You'll see it's not hard at all to use it.

Please note that there are 2 constructors, an empty one that doesn't require any argument and another one that takes the file name.

If you declare an object without any file name, you'll have to use the SetFileName method.

 

Here's an exemple:

(

cpp):
#include "stdafx.h"

using namespace std;

int main(int argc, char* argv[])
{
ConfigFile myIni;

myIni.SetFileName("C:\\Hax.txt");

cout << myIni.ReadStringValue("LOL", "value1").c_str() << endl;

    cout << "Writing int into value2..." << endl;

    myIni.WriteValue("LOL", "value2", 1337);
    cout << myIni.ReadIntValue("LOL", "value2") << endl;

    cout << "Writing float into value3..." << endl;

    myIni.WriteValue("LOL", "value3", 3.14f);
    cout << myIni.ReadFloatValue("LOL", "value3") << endl;

    return 0;
}

 

 

 

WriteValue is an overloaded function that works with float, int and strings which is actually what I needed.

The code launches a ConfigFileException when shit happens.

 

For exemple:

 

(cpp):
ConfigFile myIni;

cout << myIni.ReadStringValue("LOL", "value1").c_str() << endl;

 

 

In this code, we didn't set a file name. The code will launch an exception that contains,

The file name (In this case, it's ) And the error description To avoid unhandled...

Exceptions:

(cpp):
ConfigFile myIni;

try
{
cout << myIni.ReadStringValue("LOL", "value1").c_str() << endl;
}
catch( ConfigFileException e )
{
cout << "*** EXCEPTION CAUGHT ***"<< endl;
cout << e.fileName << endl;
cout << e.errMessage<< endl;
}

 

 

 

I added the exceptions stuff today, so if you find anything i could add/correct, just say And now, the file you're all waiting for:

EasyCfg.cpp:

(cpp):
#pragma once

#define FILE_NOT_EXISTING        "The file you tried to open doesn't exist"
#define FILENAME_NOT_DEFINED    "You didn't declare a file name"
#define NO_FILE_NAME            "<no File Name>"

class ConfigFileException
{
public:
std::string errMessage;
std::string fileName;

ConfigFileException( std::string tmpErrMessage, std::string tmpFileName )
{
	fileName = tmpFileName;
	errMessage = tmpErrMessage;
}
};

class ConfigFile
{
std::string FileName;

public:
////////////////////////////////////
ConfigFile( std::string strFile ) {
	this->FileName = strFile;

	if(!FileExists())
	{
	ConfigFileException e(FILE_NOT_EXISTING, this->FileName);

	throw e;
	}
}

ConfigFile( ) {
}

~ConfigFile( ) {
}
////////////////////////////////////


////////////////////////////////////
void SetFileName( std::string newFileName )
{
	this->FileName = newFileName;

	if(!FileExists())
	{
		ConfigFileException e(FILE_NOT_EXISTING, this->FileName);

		throw e;
	}
}

std::string GetFileName()
{
	if(this->FileName.size() < 1 )
	{
		ConfigFileException e(FILENAME_NOT_DEFINED, NO_FILE_NAME);

		throw e;    

		return false;
	}

	return this->FileName;
}

bool FileExists() //If no file specified, just check if the FileName file exists
{
	if(this->FileName.size() < 1 )
	{
		ConfigFileException e(FILENAME_NOT_DEFINED, NO_FILE_NAME);

		throw e;    

		return false;
	}

	bool retVal = false;
	std::fstream tmpFile;

	tmpFile.open(this->FileName.c_str(), std::ios::in);

	if( tmpFile.is_open() )
		retVal = true;

	tmpFile.close();

	return retVal;
}

bool FileExists( std::string fileName )
{
	bool retVal = false;
	std::fstream tmpFile;

	tmpFile.open(fileName.c_str(), std::ios::in);

	if( tmpFile.is_open() )
		retVal = true;

	tmpFile.close();

	return retVal;
}

int ReadIntValue( std::string section, std::string option )
{
	if(!FileExists())
	{
		ConfigFileException e(FILE_NOT_EXISTING, this->FileName);

		throw e; //Have fun
	}

	return GetPrivateProfileIntA(section.c_str(), option.c_str(), -1, this->FileName.c_str());
}

float ReadFloatValue( std::string section, std::string option )
{
	if(!FileExists())
	{
		ConfigFileException e(FILE_NOT_EXISTING, this->FileName);

		throw e; //Have fun
	}

	char tmpStr[16] = {'\0'};

	GetPrivateProfileStringA(section.c_str(), option.c_str(), NULL, tmpStr, 15, this->FileName.c_str());

	return (float)atof(tmpStr);
}

std::string ReadStringValue( std::string section, std::string option )
{
	if(!FileExists())
	{
		ConfigFileException e(FILE_NOT_EXISTING, this->FileName);

		throw e;
	}

	char tmpStr[256] = {'\0'};

	GetPrivateProfileStringA(section.c_str(), option.c_str(), NULL, tmpStr, 255, this->FileName.c_str());

	return std::string(tmpStr);
}

void WriteValue( std::string section, std::string option, std::string val )
{
	if(this->FileName.size() < 1 )
	{
		ConfigFileException e(FILENAME_NOT_DEFINED, NO_FILE_NAME);

		throw e;
	}

	WritePrivateProfileStringA(section.c_str(), option.c_str(), val.c_str(), this->FileName.c_str());
}

void WriteValue( std::string section, std::string option, int val )
{
	if(this->FileName.size() < 1 )
	{
		ConfigFileException e(FILENAME_NOT_DEFINED, NO_FILE_NAME);

		throw e;    
	}

	char tmpResult[10] = {'\0'};
	_itoa_s (val, tmpResult, 9, 10);
	WritePrivateProfileStringA(section.c_str(), option.c_str(), tmpResult, this->FileName.c_str());
}

void WriteValue( std::string section, std::string option, float val )
{
	if(this->FileName.size() < 1 )
	{
		ConfigFileException e(FILENAME_NOT_DEFINED, NO_FILE_NAME);

		throw e;    
	}

	char tmpResult[16] = {'\0'};
	sprintf(tmpResult, "%f", val);
	WritePrivateProfileStringA(section.c_str(), option.c_str(), tmpResult, this->FileName.c_str());
}
};

 

"Download" EasyCfg.cpp

 

 

by Lightness

  • 3 weeks later...
  • 2 months later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Posts

    • ⚔️ L2Origins – Season 1 High Five Classic Welcome to L2Origins, a project built for players who miss the authentic High Five experience while enjoying carefully designed quality-of-life improvements that preserve the original gameplay. Every system has been created with one goal in mind: long-term progression, balanced PvP, and a competitive community. Server Highlights ⚔️ High Five Classic Gameplay 📈 Rates: x5 Adena / x5 Drop & Spoil / x15 Skill EXP 👥 Up to 3 game clients per PC 🏰 Siege & Territory War Rewards ⚔️ Party and Solo Instances 🏆 Advanced Ranking System 🎯 Global Teleport & NPC Buffer 🛡️ Active Anti-Bot Protection 💬 All-In-One Community Board 🎁 Daily Login Rewards 🌎 English Project with an international community. Exclusive L2Origins Systems 🏆 Achievement Skills Unlock permanent passive skills by progressing through: PvP Achievements Olympiad Participation Achievements Every milestone rewards your character with unique passive bonuses, encouraging long-term progression. ⚔️ Faction System Choose one of 7 unique factions, each offering its own permanent bonuses and balanced penalties. 🛡️ The Knights ⚔️ Dark Legion 🔮 Arcane Council 🏹 Hunters Guild 💰 Merchants Union 🗡️ Shadow Assassins 🌿 Guardians of Nature Your choice defines your playstyle and creates a new layer of PvP strategy. 👕 DressMe System Customize your character with classic High Five armor appearances. Each DressMe appearance also grants its own exclusive passive bonuses, allowing players to personalize both their look and combat style. 🏅 Olympiad & PvP Olympiad Participation Rewards PvP Ranking Faction Ranking Event Ranking Arena Ranking Compete against other players and climb multiple leaderboards throughout the season. Why L2Origins? Our philosophy is simple: Preserve the original High Five feeling. Introduce meaningful progression instead of power creep. Keep PvP competitive and rewarding. Deliver unique custom content without losing the Lineage II identity. If you're looking for a fresh High Five server that respects the classic experience while introducing exclusive systems built from the ground up, L2Origins is ready for you. 🌐 Website: https://l2origins.org/ See you on the battlefield!  
    • Well, make it free for everyone to use.
    • Those tools that those guys are selling, you put them in Claude Code and they do everything for you; in fact, I made one exactly like the one this guy is selling.
  • Topics

×
×
  • Create New...

Important Information

This community uses essential cookies to function properly. Non-essential cookies and third-party services are used only with your consent. Read our Privacy Policy and We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue..