C++: Textdatei einlesen und nach Zeichen prüfen

Guten Middag, liebe wer-weiß-was-User…

Ich versuche eine Art primitive Konfigurationsdatei zu basteln… nichts großes, einfach nur eine Textdatei… bisher soll da eigentlich nur drinstehen:

„MenuStyle:set1“

Ich weiß wie ich die Zeilen einlesen könnte… Aber ich weiß nicht, wie ich prüfen kann, ob in der gerade eingelesenen Zeile „MenuStyle:“ steht und danach „set1“ in eine Variable speichern kann.

Bisheriger Code:
if( FILE *inFile = fopen( „mainmenu.txt“, „r+t“ ) )
{
char tmp[255];
while( !feof( inFile ) )
{
fgets( tmp, 255, inFile );
if( !feof( inFile ) )
{
// Hier soll nach der Zeichenfolge geprüft werden!
}
}
}

Danke im Vorraus!

Hallo

Ich versuche eine Art primitive Konfigurationsdatei zu
basteln… nichts großes, einfach nur eine Textdatei… bisher
soll da eigentlich nur drinstehen:
„MenuStyle:set1“
Ich weiß wie ich die Zeilen einlesen könnte… Aber ich weiß
nicht, wie ich prüfen kann, ob in der gerade eingelesenen
Zeile „MenuStyle:“ steht und danach „set1“ in eine Variable
speichern kann.

Soll das in C++ sein? Oder in C?

Soll nur ein einziger Name mit Wert
eingelesen werden oder ganz viele?
Wohinein sollen dann die Daten ein-
gelesen werden? Ein Feld?

Grüße

CMБ

Soll das in C++ sein? Oder in C?

Das sollte besser C++ sein, wenn es C ist geht es auch, hauptsache es klappt :wink:

Soll nur ein einziger Name mit Wert
eingelesen werden oder ganz viele?

Mit der Zeit werden es bestimmt mehrere…

Wohinein sollen dann die Daten ein-
gelesen werden? Ein Feld?

Ähm… jetzt bin ich etwas verwirrt… in meinem angegebenem Code wird ein Array initialisiert… den Code hab ich übrigens als Snippet im Internet gefunden. Und in das Array soll erstmal eine Zeile gelesen werden, die nötigen Werte kommen in separate Variablen.

Danke für die Antwort!

MfG DarkDragon-1993

Hallo

Ähm… jetzt bin ich etwas verwirrt… in meinem angegebenem
Code wird ein Array initialisiert… den Code hab ich übrigens
als Snippet im Internet gefunden. Und in das Array soll
erstmal eine Zeile gelesen werden, die nötigen Werte kommen in
separate Variablen.

Wie sieht denn das Array konkret aus? Und
wie sehen die „separaten Variablen“ konkret
aus?

Grüße

CMБ

Hi

Wie sieht denn das Array konkret aus?

Noch sieht das Array so aus:

char tmp[255];

Falls das gemeint ist…

Und wie sehen die „separaten Variablen“ konkret
aus?

Genau genommen sehen die noch garnicht aus… sollen Char Zeiger werden.

Hallo

Wie sieht denn das Array konkret aus?

Noch sieht das Array so aus:

char tmp[255];

Und wie sehen die „separaten Variablen“ konkret
aus?

Genau genommen sehen die noch garnicht aus… sollen Char
Zeiger werden.

Aha. Dann würde ich einfach ein
assoziatives Array verwenden, da
kannst Du dann einfach über:

 ...
 feld["MenuStyle"] = "set1";
 ...

oder so

 ...
 string s1 = feld["MenuStyle"];
 ...

zugreifen. Man würde dazu eine sog. hash-Map
verwenden, das ist aber derzeit in C++ für
Anfänger zu undurchsichtig, daher besser
erstmal eine „normale“ std::map nehmen.

Dann würde ich eine extra-Funktion für
das Einlesen nehmen. Diese öffnet die
Datei und schreibt die Daten in das Feld,
z.B. so etwa (quick hack):

#include 
#include 
#include 
#include 

 typedef std::map Map; 
 using namespace std;

 bool einlesen\_von(const string& fname, Map& feld)
{
 ifstream fh(fname.c\_str()); // Datei oeffnen
 if(! fh) return false; // pruefen
 
 string zeile; // zeilenweise einlesen
 while(getline(fh, zeile)) {
 size\_t pos = zeile.find(':'); // ':' suchen und Position merken
 if(pos != string::npos) { // ist es drin? string::npos =\> nicht
 feld[zeile.substr(0, pos)] = zeile.substr(pos+1); // eintragen
 }
 }
 return true;
}

 int main(int argc, char \*argv) 
{
 Map feld; // da kommt alles rein
 einlesen\_von("daten.txt", feld); // und zwar hier
 
 cout first " second 

Grüße

CMБ

Ah, vielen Dank, klappt wunderbar!

MfG DarkDragon-1993

Hi DarkDragon.
Nur eine kurze Anmerkung.
Wenn das Format deiner Konfigurationsdatei noch nicht festgelegt ist, könntest du das im Stile der Ini-Dateien machen.

[CONFIG] 
MenuStyle=set1

Für diese gibt es bereits eine vorgefertigte API (zumindest für WIN, Linux weiß ich nicht auswendig), und du bräuchtest das Rad nicht nochmal neu zu erfinden.
http://msdn.microsoft.com/en-us/library/ms724875%28V…

Gruß
re-G