Inhalt
Einführung
Lesen:
Text einlesen
Ganzzahlen einlesen
Kommazahlen einlesen
Schreiben:
Text schreiben
Ganzzahlen schreiben
Kommazahlen schreiben
Relativer Pfad
Unicode
Ini-Dateien erlauben, auf einfache Art und Weise kleinere Datenmengen schnell abzuspeichern oder zu laden. Eine Ini-Datei ist ganz normale Textdatei mit der Endung *.ini.
Aufbau einer Ini-Datei:
[Sektion] Schluessel = Wert
Ein Beispiel:
[Einstellungen] Titel = Ultra Super Mega High Definition Game Version = 234.34 [Gegner_1] Name = Terminator TZ Leben = 150 Angriff = 75.5 Verteidigung = 40
Die Funktion zum Einlesen von Strings aus einer Ini-Datei lautet GetPrivateProfileString.
DWORD GetPrivateProfileString(LPCTSTR Sektion, LPCTSTR Schluessel, LPCTSTR Standard_Wert, LPTSTR Puffer, DWORD Size, LPCTSTR Datei_Name);

LPCTSTR = const char*
LPTSTR = char*
Die ersten zwei Parameter sollten klar sein. Der dritte Parameter ist ein String der in den Puffer geschrieben wird, wenn die Ini-Datei nicht gefunden wird oder die Sektion oder der Schlüssel nicht existieren.
Puffer ist ein Zeiger auf ein char-Array.
Size ist die Größe/Länge des Puffers.
Datei_Name ist der Name der Ini-Datei.
Beispiel:
Ini-Datei – „c:/game/gegner.ini“:
// Inhalt einer Ini-Datei [Gegner_1] Name = Terminator TZ ...
// String einlesen const unsigned long puffer_size = 255; char puffer[puffer_size]; char ini[] = "c:/game/gegner.ini"; GetPrivateProfileString("Gegner_1", "Name", "error", puffer, puffer_size, ini); // Zum Test den Puffer auf den Bildschirm ausgeben std::cout<<"Name des Gegners: "<<puffer<<std::endl;
Die Funktion ist nicht case-sensitive, d.h. es ist egal ob Sie „Name“ oder „NAME“ oder „nAmE“ schreiben.
Wenn die Funktion die Datei im angegebenen Verzeichnis nicht findet, so wird sie es im Windows-Ordner versuchen.
Um Zahlen einzulesen gibt es eine ähnliche Funktion wie für Strings.
UINT GetPrivateProfileInt(LPCTSTR Sektion, LPCTSTR Schluessel, INT Standard_Wert, LPCTSTR Datei_Name);

UINT = unsigned int
Der Rückgabewert der Funktion ist der Wert der benötigt wird. Wird die Sektion, der Schlüssel oder die ganze Datei nicht gefunden, so wird der Standard-Wert zurückgegeben.
Beispiel:
Ini-Datei – „c:/game/gegner.ini“:
// Inhalt [Gegner_1] Leben = 150 ...
// Integer einlesen char ini[] = "c:/game/gegner.ini"; unsigned int leben = GetPrivateProfileString("Gegner_1", "Leben", 0, ini); // Zum Test die Lebenspunkte ausgeben std::cout<<"Lebenspunkte: "<< leben <<std::endl
Um Fliesskommazahlen einzulesen gibt es keine fertige Funktion, doch das ist kein Problem. Man liest einfach die Zahl als Text ein und konvertiert diesen zu einer Kommazahl.
Beispiel:
Ini-Datei – „c:/game/gegner.ini“:
// Inhalt [Gegner_1] Angriff = 75.5 ...
// Kommazahl einlesen const unsigned long puffer_size = 255; char puffer[puffer_size]; char ini[] = "c:/game/gegner.ini"; GetPrivateProfileString("Gegner_1", "Angriff", "error", puffer, puffer_size, ini); // double atof(const char* str) konvertiert einen string // zu einem double Wert double angriff = atof(puffer); // Zum Test den Puffer auf den Bildschirm ausgeben std::cout<<"Angriffspunkte: "<<angriff<<std::endl;
Um Daten in eine Ini-Datei abzulegen gibt es nur eine Funktion.
BOOL WritePrivateProfileString(LPCTSTR Sektion, LPCTSTR Schluessel, LPCTSTR Wert, LPCTSTR Datei_Name);
Beispiel: String in eine Ini-Datei schreiben
char ini[] = "c:/game/gegner.ini"; WritePrivateProfileString ("Gegner_2", "Name", "Barbar", ini);
Um Zahlen in eine Ini-Datei zu schreiben, müssen diese zuerst in ein String umgewandelt werden. Funktion itoa wandelt einen Integer in ein String um.
char* itoa(int zahl, char* string, int basis);
zahl ist die Zahl, die umgenadelt werden soll.
string ist der String in dem die Zahl abgelegt wird.
basis ist die Basis des Zahlensystems, das verwendet wird. Wir verwendet dezimales System – die Basis ist also 10.
Beispiel: Integer in eine Ini-Datei schreiben
char ini[] = "c:/game/gegner.ini"; int leben = 100; char wert[8]; itoa(leben, wert, 10); WritePrivateProfileString ("Gegner_2", "Leben", wert, ini);
Beim Schreiben von Fliesskommazahlen, muss die Zahl, wie auch bei Integern, in ein String umgewandelt. Die Funktion dazu lautet _gcvt.
char *_gcvt( double zahl, int nachkommastellen, char *string );
zahl ist die Kommazahl, die umgenadelt werden soll.
nachkommastellen gibt an, wie viele Nachkommastellen bei der Konvertierung berücksichtigt werden sollen.
string ist der Stringpuffer, in dem die Zahl abgelegt wird.
Beispiel: Floating-Point Zahl in Ini schreiben
char ini[] = "c:/game/gegner.ini"; double angriff = 30.25; char wert[8]; _gcvt (angriff, 2, wert); WritePrivateProfileString ("Gegner_2", "Angriff", wert, ini);
Oft weiß man nicht in welchem Verzeichnis das Programm später liegen wird. Somit ist praktisch, wenn man den Pfad zu der Datei nicht absolut, also nicht „c:/….“, sondern relativ zu der ausführbaren Datei angibt z.B. „einstellungen/gegner.ini“ wenn „einstellungen“ ein Ordner im Hauptverzeichnis des Programms ist.
In diesem Zusammenhang wäre auch die Funktion _getcwd hilfreich, welche den Pfad zu dem aktuellen Arbeitsverzeichnis zurückgibt.
char *_getcwd(char *buffer, int buffer_size );
Wenn Sie in Unicode programmieren, dann brauchen sie auch entsprechende unicodefähige Funktionen:
ANSI | Unicode |
---|---|
GetPrivateProfileString | GetPrivateProfileStringW |
GetPrivateProfileInt | GetPrivateProfileIntW |
WritePrivateProfileString | WritePrivateProfileStringW |
atof | _wtof |
atoi | _wtoi |
itoa | _itow |
_gcvt | ??? |
_getcwd | _wgetcwd |
Viel Spaß ;)
Finde ich mal richtig gut . Danke.