Prototyp für die "language.csv"

Moderatoren: Zarewitsch_YOURVOICE, Fußballfreak, Registrierte_Wahl_möglich, Karneval, Verbot_Politikforum, Gamershall, Erweitertes Postfach (300)

Gesperrt
Benutzeravatar
Wilhelm von Preußen
Rang 14
Beiträge: 2130
Registriert: Mi 07.11.2001, 12:00
SI-VerdienstkreuzGroßkreuz des Veteranenorden

Prototyp für die "language.csv"

Beitrag von Wilhelm von Preußen »

Edle Herren, ich habe mal einen Prototypen erstellt, wie wir aus unserer language.csv lesen werden. (paradox text.csv).
Ich habe es so programmiert, dass kommentare in c/c++ Stil ( /* ... */) eingefügrt werden können, ohne den readin zu beeinträchtigen. Bei falscher Syntax gibts fehlermeldungen wie die genaue Zeile des Syntaxfehlers des externen files. in diesem Prototyp habe ich simple Fehlermeldungen angegeben, habe meine Prototypen zur exception behandlung noch nicht eingebunden.
Zeilenvorschübe sind ebenfals legal, man könnte also theoretisch das file ab Zeile 1000 schreiben. Das ganze wird dynamisch ausgelesen und in eine map<string,string> eingetragen, im programm selbst würden strings als beispeil dann so verknüpft(ich mach mal jetzt hie ken DIRECTX sondern mit cout ;) )

cFileManager TXTCSV(LANGUAGE_CSV); /*Konstruktor wird mit einem enum initialisiert, der sämtliche DAteiformate beinhalten wird*/

cout << TXTCSV.Read("FRA") << " erklaert " << TXTCSV.Read("GER") << " den Krieg!" << endl;

Das gute an der ganzen sache ist, unsere lang.csv ist längst nicht so starr wie die von paradox, selbst neue Staaten, neue Religionen etc liessen sich mit dieser Technik und einem weiteren externen file, wo user ihre selbstdefinierten staaten/religionen etc näher definieren, bewerkstelligen. Es sind "beliebig" viele Zuweisungen in der lang.csv möglich :D , gott danke der dynamischen speicherverwaltung und stl hehehe.
Nun gut diesen prototypen werde ich noch ein wenig verfeinern, mehr switch case anweisungen machen damit das ganze nicht so wirr rüberkommt. Habt ihr noch Vorschläge dazu?

Hier der code: (sry wegen der grauenvollen Farben)

Code: Alles auswählen

#include "cFileManager.h"
#pragma warning(disable:4786)


void cFileManager::Init(FILETYPE filetype)
{

	switch(filetype)
	{
	case InitText_csv:
		string string1; //readin string
		string string2; //readin string
		
		char ch; //readin char
		char ch2; //readin char

		int newline = 1; // line counter


    	ifstream fin(INITTEXT_CSV);
		if(!fin)
		{
			logEntry("InitText.csv could not be opened", "INITTEXT_CSV", INITTEXT_CSV,
				     __FILE__, __LINE__);
			assert(fin);
		} //close if




		ch = fin.get(); //read first char
		do
		{
		if(ch == '/') //checks if ch is comment
		{
			ch = fin.get();
			if(ch != '*')
			{
				SyntaxErrorExternCSVFile("Missing '*' after '/'", InitText_csv, newline); 
				assert(ch == '*');
			}

			if( (ch = fin.get()) == '/')
			{
				SyntaxErrorExternCSVFile("Missing '*' forwards '/'", InitText_csv, newline);
				assert(ch != '/');
			}
			// Comment loop, exit if EOF, comment ended or Syntax Error
			while(ch != EOF) 
			{
				//c++ comment syntax can be put in quotes "/*" without getting a syntax error
				if(ch == '"')
					while( (ch = fin.get()) != '"') {}

				ch = fin.get();
				if(ch == '/' && ch2 == '*')
				{
					ch2 = '0';
					ch = fin.get();
					break;
				}
				if(ch == '\n')
					newline++;

				if(ch == EOF)
					break;

				if(ch == '*')
				{
					ch = fin.get();
					ch2 = ch;
					if(ch == '\n')
						newline++;

					if(ch == '/')
					{
						ch = fin.get();
						break;
					}
					else
						continue;
				}
				if(ch == '/')
				{
				SyntaxErrorExternCSVFile("Missing '*' forwards '/'", InitText_csv, newline);
				assert(ch != '/');
				}
			} // end while
		} // end if


		if(ch == ' ' || ch == '\n')
		{
			while(ch  == ' ' || ch == '\n')
			{
			if(ch == '\n')
			  newline++;
			if(ch == EOF)
				break;
			ch = fin.get();
			}
		}

		if(ch == EOF)
			break;

		if(ch == '/')
			continue;

		while( true )
		{
			if(ch == EOF)
				break;

			if(ch == '/')
				break;

			if(ch == '\n')
			{
				newline++;
				ch = fin.get();
				continue;
			}

			while(ch != ';')
			{
				string1 += ch;
				ch = fin.get();
			}

			//reserve big data chunk for second value text
            string2.reserve(1500);

			//read out the data
			while( (ch = fin.get()) != ';')
			{
				if(ch == '\n')
				{
					newline++;
					ch = fin.get();
				}
					
				string2 += ch;
			}

			m_mINITTEXT_CSV[string1] = string2;


			string1 = "";
			string2 = "";


			//get new sign
			ch = fin.get();

			if(ch == '\n')
			{
				newline++;
				ch = fin.get();
			}
		} //end while(true)
	} // end do
	while( ch != EOF );
	} // end switch
} //end fkt






string cFileManager::ReadMenue(string key)
{

		m_iterINITTEXT_CSV = m_mINITTEXT_CSV.find(key);
		if(m_iterINITTEXT_CSV == m_mINITTEXT_CSV.end())
		{
			logEntry("Error when reading text, maybe not existing key",
				     key, 0, "Unkown", -1);
		}
		else
			return m_mINITTEXT_CSV[key];
	
		return key;
}
Edelste Grüsse, Wilhelm von Preußen

"Ehre, wem Ehre gebührt". Ich verneige mich vor euch, edler Eugen!
Benutzeravatar
Wilhelm von Preußen
Rang 14
Beiträge: 2130
Registriert: Mi 07.11.2001, 12:00
SI-VerdienstkreuzGroßkreuz des Veteranenorden

Beitrag von Wilhelm von Preußen »

Nicht wundern wegen des "neuen" designs :D , hab ich nur gemacht um den code besser zu sehen :) .

update: Hab den code jetzt debugt und in eine Klasse untergebracht, die Klasse wird die Menütexte initialiseiren können, dann wenn der Spieler ein Szenario gewählt hat und das menü verlässt, wird dieser Speicher wieder freigegeben, ist zwar eigentlich gar nicht nötig wegen der starken Rechner heutzutage, aber sicher ist sicher. ausserdem hab ich eine funktion eingeführt die die menütexte aus dem Speicher liest und ausgeben kann, sie gibt einen string zurück. Wenn ein Key nicht vorhanden ist, gibt sie den eingegebenen Key zurück.
Edelste Grüsse, Wilhelm von Preußen

"Ehre, wem Ehre gebührt". Ich verneige mich vor euch, edler Eugen!
Benutzeravatar
Bismarck
Rang 16
Beiträge: 4757
Registriert: Mi 27.03.2002, 12:00
Großkreuz des VeteranenordenPour le Mérite

Beitrag von Bismarck »

kleine Frage: In dem Beispiel wird nur der Ländertag ausgelesen, aber nicht der gesamte Text! Geht das auch?
Otto Eduard Leopold von Bismarck-Schönhausen
Vertrauter des Kaisers

One Vision! One Purpose! Peace through Power!
Kurze Posts wurden nur oberflächlich, lange gar nicht gelesen. Wir richteten uns danach!
In Memoriam Stauffenberg (*20.09.1972 †23.01.2008)
Benutzeravatar
Wilhelm von Preußen
Rang 14
Beiträge: 2130
Registriert: Mi 07.11.2001, 12:00
SI-VerdienstkreuzGroßkreuz des Veteranenorden

Beitrag von Wilhelm von Preußen »

Bismarck hat geschrieben:kleine Frage: In dem Beispiel wird nur der Ländertag ausgelesen, aber nicht der gesamte Text! Geht das auch?
Doch doch :) , ich habs mal in ein kleines Beispiel gepackt, ist zwar noch ein wenig älterer code , aber der funktioniert schon einwandfrei.

http://www.si-games.com/Release.ace

Das textfile nur mit notepad oder einem normalen editor editieren, kein excell!! ich hab dei textfiles mit einem normalen editor erstellt und nicht mit exzzell, daher würde exzell beim speichern das file sehr merkwürdig codieren.
der neue code arbeitet mit exzell files....

Fügt ind das Textfile bliebige Wertepaare ein, aber stets in diesem Format: TAG;TEXT; ... es sollte funktionieren dass euer usertag ausgelesen wird
Edelste Grüsse, Wilhelm von Preußen

"Ehre, wem Ehre gebührt". Ich verneige mich vor euch, edler Eugen!
Gesperrt

Zurück zu „Developers - Coding section“