Variabeln aus Text dateien auslesen.
-
Der titel sollte alles sagen.
naja ich hab es wie folgt gelöst um einzellne variablen(können aber nur eine char bzw. zeichen auslesen)
Das hier ist die datei aus der gelesen wird:
/////////////////myconfig.dat////////////////////
<resolution>
screen = *b*
fullscreen = *FALSE*
</resolution>
<driver>
driver = *o*
</driver>
<player>
team = *1*
</player>
////////////////////////////////////////////////7
und das hier ist der code mit dem dann die variablen ausgelesen werden.
bool resolution;
bool driver;
bool player;
void CReader::LoadConfig(char* File = "Data/Myconfig.dat")
{
resolution = false;
driver = false;
player = false;fstream f(File, /*ios::out|ios::binary|*/ios::in);
while (!f.eof())
{
f.getline(cstring, sizeof(cstring));if(cstring[0] == '<' && cstring[1]== 'r')
{
resolution = true;
}
if(cstring[0] == '<' && cstring[1]== '/' && cstring[2]== 'r')
{
resolution = false;
}
if(cstring[0] == '<' && cstring[1]== 'd')
{
driver = true;
}
if(cstring[0] == '<' && cstring[1]== '/' && cstring[2]== 'd')
{
driver = false;
}
if(cstring[0] == '<' && cstring[1]== 'p')
{
player = true;
}
if(cstring[0] == '<' && cstring[1]== '/' && cstring[2]== 'p')
{
player = false;
}if(player && cstring[0] == 't')
{
int i = 0;
while(cstring[i] != '')
{
i++;
}
i++;
switch(cstring[i])
{
case '1':
config.team = 1;
break;
case '2':
config.team = 2;
break;
case '3':
config.team = 3;
break;
case '4':
config.team = 4;
break;
}
}
if(driver && cstring[0] == 'd')
{
int i = 0;
while(cstring[i] != '')
{
i++;
}
i++;
switch(cstring[i])
{
case 'o':
config.driver = "EDT_OPENGL";
break;
case 's':
config.driver = "EDT_SOFTWARE";
break;
}
}if(resolution && cstring[0] == 's')
{
int i = 0;while(cstring[i] != '*')
{
i++;
}
i++;
switch(cstring[i])
{
case 'a':
config.x = 640;
config.y = 480;
break;
case 'b':
config.x = 800;
config.y = 600;
break;
case 'c':
config.x = 1024;
config.y = 768;
break;
}
}
if(resolution && cstring[0] == 'f')
{
int i = 0;while(cstring[i] != '*')
{
i++;
}
i++;
switch(cstring[i])
{
case 'T':
config.fullscreen = true;
break;
case 'F':
config.fullscreen = false;
break;
}
}
}
f.close();
}
Naja mit der methode werden leider immer nur die ersten zeichen geprüft da ichs anders nicht hinbekommen habe aber solange keine tags mit gleichen anfangsbuchstaben da sind geht das so.
Nunja jetzt hab ich aber das problem das ich jetzt ganze strings und längere zahlen auslesen muss aus meiner dat datei(binär dateien kommen nicht in frage da ich dann einen leveleditor schreiben müsste)auslesen muss um einen level zu laden und da funtzt das prinzip von oben nicht mehr.
hat da einer ne idee wie ich das machen könnte die level datei sieht so aus:
///////////////////////////////////level.map///////////////////////////
<Map>
MapName = **
file = *.dmf
</Map><SkyMap>
A = **
C = **
D = **
E = **
F = **
G = **
</SkyMap>/////////////////////////////////Only 8 lights allowed and minimum 1/////////////////////////////////////////////////////
<Light>
x = **
y = **
z = **
color = **
</Light>usw........
////////////////////////////////////////////////////////////////////////
-
hast du es schonmal mit std::string versucht - ist viel sicherer als char* (und hat einen operator==, mit dem du Strings vergleichen kannst)
PS: cpp-Tags wären auch hilfreich

-
Ja wollte ich aber ich kann irgendwie nicht mit getline in einen std::string copieren....kann er nicht konvertieren.
hätte die frage ja sonst nicht gepostet...aber vielleicht kannst du mir ja sagen wie ich das machen kann das ich in einen std::string mit geline schreiben kann.
-
etwa so
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { string s; ifstream in("data.txt"); if ( in ) { getline( in, s); cout << s << endl; } return 0; }Kurt
BTW Ich tu mir das nicht an unformattierten code zu lesen.