INI-Files
-
Kann mir bitte jemand sagen, wie ich in ein ini-file schreiben bzw. es auslesen kann.
Es würde schon reichen, wenn mir jemand nur stichwörter geben könnte.
-
GetProfileString
WriteProfileIntUnd jeweils getauscht.
(Edit: Ups, es ist Get, nicht Read.)
-
char *cBuffer = new char[MAX_PATH]; //AUS INI-FILE AUSLESEN GetPrivateProfileString("Name der Gruppe", "Name des Strings", "Was er zurückgibt wenn es fehlschlägt", cBuffer, MAX_PATH, "Pfad zum Inifile"); //IN INI-FILE SCHREIBEN WritePrivateProfileString("Name der Gruppe", "Name des Strings", cBuffer, "Pfad zum Inifile");
Ist ganz einfach und nützlich...
-
Ein INI-File ist in einzelne Abschnitte eingeteilt, welche durch namen in eckigen klammern beschriftet sind.
In diesen abschnitten können nun beliebig viele verschiedene keys gespeichert werden.
So ein Key ist einfach ein Name für eine Einstellung die nun vom Programm gesetzt oder abgefragt werden kann.
Ein Key besteht normalerweise aus dem Tag (Keyname) dem "=" und der Keyvalue (Keywert)Bsp:
[Einstellung]
Bild=1 ; komentare werden durch das Semikolon eingeleitetIn den Zeilen mit Abschnittsnamen dürfen keine Kommentare stehen !!!
Zugriff auf INI-Files
Die meisten INI-Files sind private Profildaten. Dieser Ausdrauck stammt noch aus Win 3.1, um die INI-Files einer Anwendung von der WIN.INI (Dat war die einzige INI-Datei vor Win 3.1 !!) zu unterscheiden.
MitWritePrivateProfileString
und
WritePrivateProfileInt
werden Werte in das private INI-File gespeichert.
Mit
GetPrivateProfileString
und
GetPrivateProfileInt
können die Werte wieder ausgelesen werden.
Mit
GetPrivateProfileSection
und
WritePrivateProfileSection
können ganze Abschnitte des INI-Files gelesen bzw. geschrieben werden.
Mit
GetPrivateProfileSectionNames
können alle Abschnittsnamen ausgelesen werden.
Normalerweise befinden sich private Profildaten im Verzeichnis der Anwendung oder im Windows-Verzeichnis.
Wenn INI-Files aufgerufen werden, iss es empfehlenswert, immer den vollständingen Pfandnamen anzugeben.Mit
GetProfileString
und
GetProfileInt
werden Werte aus der **WIN.INI[/cpp] ausgelesen.
Mit
WriteProfileString
und
WriteProfileInt
werden Werte in der [b]WIN.INI** gespeichert/geändert.
Mit
GetProfileSection
und
WriteProfileSection
können nun ganze Abschnitte der WIN.INI gespeichert/geändert werden.
Ab Win2000 können diese privaten Profile anstatt der INI-Datei in der Registry gespeichert werden.
Diese Art tritt auf, wenn die INI-Datei und der Initialisierungsabschnitt in der Registry im folgenden Key spezifiziert sind:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Aktuelle Version\IniFileMapping
In diesen Fällen reagieren die privaten Profilfunktionen auf die Informationen der Registry, nicht in den INI-Files.
Die Profilfunktionen von Win32 lokalisieren die INI-Information in folgenden Steps:
1. In der Registry nach dem Namen des INI-Files im Key
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Akutelle Version\IniFileMapping
suchen.
2. Nach dem Abschnittsnamen als Value unter dem Key oder einem Subkey des INI-Files suchen
3. Wenn der Abschnittsname ein bekannter Wert des INI-Files ist, spezifiziert dieser Wert, wo die Keys für den Abschnitt in der Registry zu finden sind.
4. Ist der Abschnittsname ein Subkey des INI-Files, spezifizieren benannte Werte in diesem Subkey, wo in der Registry die Keys für die Abschnitte zu finden sind.
Existiert dieser Key nicht als benannter Wert, dann gibt es einen unbenannten Wert der die Standardposition in der Registry angibt, an der der Key abgelegt ist.
5. Gibt es keinen Subkey für das INI-File, oder keinen Eintrag für den Abschnittsnamen, wird auf das aktuelle INI-File auf der Harddisk zugegriffen.Nachdem die Position in der Registry gefunden wurde, gibt es verschiedene Präfixe, die das Verhalten beim abbilden eines INI-Files ändern.
Diese Präfixe sind Teil des aktuellen Positionsstrings.Präfixe:
! Erzwinget, dass alle Einträge an die Registry UND an das INI-File auf der Harddisk gehen.
# Verursacht, dass der Registry-Wert auf den Wert des INI-Files gesetzt wird, wenn ein sich ein neuer User anmeldet.
@ Verhindert, dass Leseoperationen an das INI-File auf der Harddisk weitergeleitet werden, wenn in der Registry die angeforderten Daten nicht gefunden werden.
SYS Der Text nach dem Präfix ist relativ zum RegistrykeyHKEY_LOCAL_MACHINE\SOFTWARE
USR Der Text nach dem Präfix is relativ zum Registrykey
HKEY_CURRENT_USER
**Zugriffsmethoden:[/cpp]
UINT GetPrivateProfileInt(LPCTSTR lpszSectionName, LPCTSTR lpszKeyName, INT dwDefault, LPCTSTR lpszIniFileName);
Beschreibung:
Gibt einen Zahlenwert zurück, der einem Key im abschnitt es INI-Files zugeordnet ist.Rückgabewert:
UINT
Der Integerwert des Keys, der aus dem angegebenen Abschnitt des INI-Files ermittelt wurde.
Wird dieser Wert nicht gefunden, wird der Defaultwert zurückgegeben, id dieser kleiner als 0, wird 0 zurückgegeben.Parameter:
LPCTSTR lpszSectionName
Ein Zeiger auf einen String mit dem Abschnittsnamen.
LPCTSTR lpszKeyName
Ein Zeiger auf einen String mit dem Keynamen.
INT dwDefault
Defaultwert, der zurückgegebenwird, wenn der angegebene Key nicht gefunden wurde.
LPCTSTR lpszIniFileName
Dateiname und Pfad des INI-Files
DWORD GetPrivatProfileString(LPCSTR lpszSectionName, LPCTSTR lpszKeyName,LPCTSTR lpszDefault, LPTSTR lpszReturnBuffer, DWORD dwBuffer, LPCTSTR lpszIniFileName);
Beschreibung:
Gibt einen String zurück, der einem Key im abschnitt es INI-Files zugeordnet ist.Rückgabewert:
War die Funktion erfolgreich, wird die Anzahl der Zeichen zurückgegeben (ohne Nullterminator).
Ist der Buffer zu klein ist der Rückgabewert dwBuffer-1.Parameter:
Gleiche Parameter siehe GetPrivateProfileInt.LPCTSTR lpszDefault
Zeiger auf einen String mit dem Defaultwert, der zruückgegeben wird, wenn der angeforderte Abschnitt nicht gefunden wurde.
LPCTSTR lpszReturnBuffer
Buffer für die zurückzugebende Zeichenkette.
DWORD dwBuffer
Grösse des Zeichenbuffers
BOOL GetPrivateProfileStruct(LPCTSTR lpszSectionName, LPCTSTR lpszKey, LPVOID lpStruct, UINT uSizeStruct, LPCSTR lpszIniFile);
Beschreibung:
Ermitellt die Daten, die einem bestimmten Key im vorgegebenen Abschnitt eines INI-Files zugeordnet sind.
Beim Ermitteln der Daten wird eine Prüfsumme berechnet und mit der Prüfsumme, die von Write ProfileStruct berechnet wurde.Rückgabewert:
Bei Erfolg TRUE, sonst FALSE.Parameter:
Gleiche Parameter siehe GetPrivateProfileInt.LPVOID lpStruct
Ein Zeiger auf einen Puffer, der die Daten empfängt, die der Datei, dem Abschnitt und dem Keyname zugeordnet sind.
UINT uSizeStruct
Die Grösse des Puffers auf den lpStruct zeigt (in Byte)
UINT GetProfileInt(LPCTSTR lpszSectionName, LPCTSTR lpszKeyName, INT Default);
Siehe GetPrivateProfileInt - hat nur von der [b]WIN.INI**
DWORDGetProfileString(LPCTSTR lpszSectionName, LPCTSTR lpszKeyName, LPCTSTR lpstrDefault, LPCTSTR lpszReturnBuffer, DWORD dwBuffer);
Siehe GetPrivateProfileString - hat nur von der WIN.INI
DWORD GetProfileSection(LPCTSTR lpszSectionName,LPTSTR lpReturnBuffer, DWORD dwBuffer);
Beschreibung:
Füllt einen Buffer mit Schlüsselzuweisungen eine bestimmten Abschnitts der WIN.INI.Rückgabewert:
DWORD
Anzahl der in den Puffer kopierten Zeichen.
Parameter:
Gleiche Parameter siehe GetPrivateProfileInt.LPTSTR lpReturnBuffer
Zeiger auf den Puffer
DWORD dwBuffer
Grösse des Puffers
DWORD GetProfileString(LPCTSTR lpszSectionName, LPCTSTR lpszKeyName, LPCTSTR lpszDefaultValue, LPSTR lpszReturnBuffer, DWORD dwBuffer);
Wie GetPrivatProfileString, halt nur mit der WIN.INI
BOOL WritePrivateProfileSection(LPCTSTR lpszSectionName, LPCTSTR lpszSectionData, LPCTSTR lpszIniFile);
Beschreibung:
Schreibt Schlüsselzuweisungen in einen Abschnitt eines INI-Files.Rückgabewert:
Falls erfolgreich TRUE sonst FALSE.Parameter:
Gleiche Parameter siehe GetPrivateProfileInt.LPCTSTR lpszSectionData
Zeiger auf einen Puffer, der die Keys und Values des Abschnitts enthält.
DWORD WritePrivateProfileString(LPCTSTR lpszSectionName, LPCTSTR lpszKeyName, LPCTSTR lpszStringValue, LPCTSTR lpszIniFileName);
Beschreibung:
Speichert einen Stringwert im INI-FileRückgabewert:
Wenn erfolgreich TRUE, sonst FALSE.Paramter:
Gleiche Parameter siehe GetPrivateProfileInt.LPCTSTR lpszStringValue
Ein Zeiger auf den zu speichernden String.
DWORD WriteProfileString(LPCTSTR lpszSectionName, LPCTSTR lpszKeyName, LPCTSTR lpszStringValue);
siehe Write PrivateProfileString , nur eben mit der WIN.INI
BOOL WritePrivateProfileStruct(LPCTSTR lpszSectionName,LPCTSTR lpszKey, LPVOID lpStruct, UINT uSizeStruct, LPCTSTR lpszIniFile);
Siehe WriteProfileStruct , nur eben mit einem eigenen File.
DWORD WritePrivateProfileStruct(LPCTSTR lpszSection, LPCTSTR lpszKey, LPVOID lpStruct, UINT uSizeStruct, LPCTSTR lpszFile);
Siehe WriteProfileString, nur eben mit einem eigenen INI-File.
Und nun ein kleines beispiel, welches einen string und integer speichert und ausliest und eine messagebox ausgibt:
//************************************************************************************************ #include <afxwin.h> //************************************************************************************************ // cooles mfc-programm ! //************************************************************************************************ void main() { CString strFileName="c:\\test.ini"; CString strSection ="Prefs"; CString strKey1 ="String"; CString strKey2 ="Zahl"; CString strValue1="testeintrag"; CString strValue2=""; DWORD dwValue=10; strValue2.Format("%d",dwValue); WritePrivateProfileString(strSection,strKey1,strValue1,strFileName); WritePrivateProfileString(strSection,strKey2,strValue2,strFileName); strValue1=""; strValue2=""; dwValue=0; GetPrivateProfileString(strSection,strKey1,"Default",strValue1.GetBuffer(20),20,strFileName); strValue1.ReleaseBuffer(); dwValue = GetPrivateProfileInt(strSection,strKey2,1,strFileName); strValue2.Format("%d",dwValue); AfxMessageBox(strValue1+" "+strValue2); } //************************************************************************************************ //************************************************************************************************ //************************************************************************************************
-
Sama spinnst du eigentlich?
Scherz, ich würd das in die FAQ packen.
-
Und wer es gekapselt mag nehme die CINI-Klasse:
http://www.mindcracker.com/mindcracker/c_cafe/mfc/cini.asp
-
Halleluja, was ist den da passiert ??
So genau wollte ich das eigentlich gar nicht wissen !!!!
Wahnsinn.
-
Stimmt, das schreit förmlich nach FAQ !!!!
-
Ganz meine Meinung!
FAQ, FAQ, FAQ...
-
Das mit der Registry ist mir noch unklar...
Ich habe folgende Werte der Registry hinzugefügt und es funktioniert trotzdem nicht:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Aktuelle Version\IniFileMapping\MeinProgramm
Darunter hab ich (Standard) auf folgenden Wert gesetzt:
USR:Software\MeinProgramm
Unter HKEY_CURRENT_USER\Software\MeinProgramm
habe ich einen Schlüssel für jede Gruppe angelegt und darunter die jeweiligen Werte.Funktionien tut das aber nicht...
Kann mir jemand erklären, was ich falsch gemacht habe?
// EDIT:
Das was da oben gepostet wurde ist aus der MSDN übersetzt.
-
...und wenn stört das, dass es die übersetzte MSDN ist ??
-
Hab ich gesagt, dass es stört? Ich meinte nur, dass man das auch in der MSDN nachlesen kann. :p
-
klar, da haste recht, aber manchmal ist doch deutsche hilfe auch nicht schlecht.
es gibt sicher programmierer, die der englischen sprache nicht 100 % mächtig sind. -glaube ich-
mfc-newbie hat das zeugs möglicherweise in der msdn nicht gefunden, keine Ahnung.
-
IMHO ist auf die MSDN ein Copywrite.
Deshalb ist es fraglich ob man das in die FAQ aufnehmen kann.
Als Posting wäre es IMHO ok weil das posting irgendwann verschwindet.
Wenn Ernsti nachweisen kann (den Aufwand kann man aber nicht von ihm verlangen) da ses erlaubt ist weil es in der Nutzungsbed. der MSDN so steht dann kommt es in die FAQ.
Man darf ja auch nicht den Inhalt eines Buches posten.