INI – Dateien: Lesen, Schreiben

Inhalt

Einführung
Lesen:
        Text einlesen
        Ganzzahlen einlesen
        Kommazahlen einlesen
Schreiben:
        Text schreiben
        Ganzzahlen schreiben
        Kommazahlen schreiben
Relativer Pfad
Unicode

Einführung.

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

Lesen:

Text einlesen

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);
birneDWORD = unsigned long
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.

Ganzzahlen einlesen

Um Zahlen einzulesen gibt es eine ähnliche Funktion wie für Strings.

UINT GetPrivateProfileInt(LPCTSTR Sektion,
                          LPCTSTR Schluessel,
                          INT Standard_Wert,
                          LPCTSTR Datei_Name);
birneINT = int
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

Kommazahlen einlesen

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;

Schreiben:

Text schreiben

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

Ganzzahlen schreiben

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

Kommazahlen schreiben

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

Relativer Pfad

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

Unicode

Wenn Sie in Unicode programmieren, dann brauchen sie auch entsprechende unicodefähige Funktionen:

Funktion zur Handhabung von Ini-Dateien
ANSI Unicode
GetPrivateProfileString GetPrivateProfileStringW
GetPrivateProfileInt GetPrivateProfileIntW
WritePrivateProfileString WritePrivateProfileStringW
atof _wtof
atoi _wtoi
itoa _itow
_gcvt ???
_getcwd _wgetcwd

Viel Spaß ;)

1 Gedanke zu „INI – Dateien: Lesen, Schreiben“

Schreibe einen Kommentar