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
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;
}