Dane naszego programu możemy zapisać do plików INI. Zapewne nie raz, widziłeś taki plik. Klika plików ini powinniśmy mieć w folderze "WINDOWS", system przechowuje w nich niektóre swoje konfiguracje. Budowa pliku z rozszerzeniem *.ini, przypomina budowę rejestru, plik podzielony jest na sekcje, w tych sekcjach są klucze, a w każdym kluczu jest jedna wartość. Wygląda to mniej więcej tak:

[sekcja 1]
klucz1=wartosc klucza
klucz2=wartosc klucza

[sekcja 2]
klucz1=wartosc klucza
klucz2=wartosc klucza

Jako wartości możemy zapisywać liczby i łańcuchy znaków.

W msdn możemy przeczytać, że Microsoft odradza stosowania plików INI, a wszelkie informacje nakazuje zapisywać w rejestrze. W tym wypadku jednak się nie zgodzę, bo pliki ini, są czasem wygodniejsze niż rejestr, a narazie się nie zanosi, żeby usunęli pliki ini z windowsa, zwłaszcza, że windows zanim zładuje rejestr, sam korzysta z konfiguracji w plikach ini.

Deklaracje funkcji do obsługi plików INI są w pliku: winbase.h

No to do rzeczy.

1. Zapis do pliku INI - WritePrivateProfileString

Do pliku zapisujemy dane funckją WritePrivateProfileString. Zapisuje ona dowolny tekst do danego klucza w danej sekcji. Gdy chcemy zapisać liczbę jako wartość, musimy najpierw ją skonwertować na tekst, gdyż plik ini jest w rzeczywistości tekstem i tylko w takiej postaci są przechowywane także liczby.

BOOL WritePrivateProfileString(LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpString, LPCSTR lpFileName);

LPCSTR lpAppName
Nazwa sekcji do której ma być zapisana wartość. Jeżeli sekcja nie będzie istniała zostanie utworzona.

LPCSTR lpKeyName
Nazwa klucza do którego będzie zapisana dana wartość. Jeżeli klucz nie istnieje zostanie utworzony, jeżeli istnieje wartość zostanie nadpisana. Jeżeli w tym parametrze podamy 0, możemy usunąć całą sekcję.

LPCSTR lpString
Wartość, która jest zapisywana do klucza. Jeżeli podamy tu 0, klucz, jeżeli istniał zostanie usunięty. Dodatkowo w msdn mamy godną uwagi informację, że w windowsach 9x/Me, znak tabulatora(/t) nie jest obsługiwany.

LPCSTR lpFileName
Ścieżka do modyfikowanego pliku INI, jeżeli plik nie będzie istniał zostanie utworzony.

Wartość zawacana przez fucnkję
Jeżeli fucnkja się powiedzie, zostanie zwrócona wartość 1 (TRUE).

Oto przykładowe użycie funkcji WritePrivateProfileString, program stworzy na na dysku C: plik o nazwie "plik INI.ini":

#include <windows.h>

INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR lStart,INT nShow)
{
  WritePrivateProfileString(
"Sekcja pliku"
,
"Klucz"
,
"zapisywany_tekst"
,
"C:\\plik INI.ini"
);
  return
0
;
}

2. Odczyt tekstu z pliku INI - GetPrivateProfileString

Funkcja odczytuje ciąg znaków z danego pliku INI i umieszcza go w zmiennej.

DWORD GetPrivateProfileString(LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpDefault, LPSTR lpReturnedString, DWORD nSize, LPCSTR lpFileName);

LPCSTR lpAppName
Nazwa sekcji z której ma być wczytana wartość. Jeżeli podamy wartość 0, funkcja sprawdzi wszystkie sekcje.

LPCSTR lpKeyName
Nazwa klucza, z którego zostanie skopiowana wartość. Jeżeli podamy 0, zawrócone zostaną wartości ze wszystkich kluczy z całej sekcji, jako jeden ciąg znaków.

LPCSTR lpDefault
Domyślna wartość, która zostanie umieszczona w zmiennej, w razie niepowodzenia odczytania danych.

LPSTR lpReturnedString
Tablica znaków, w której umieszczony zostanie ciąg odczytanych znaków.

DWORD nSize
Długość odczytywanej wartości(w znakach, bajtach).

LPCSTR lpFileName
Ścieżka do odczytywanego pliku INI. Jeżeli nie podamy tu pełnej ścieżki, windows sprawdzi jedynie systemowe foldery.

Wartość zawacana przez funkcję
Funkcja zwraca ilość odczytanych znaków(bajtów).

#include <windows.h>

INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR lStart,INT nShow)
{
  CHAR wartosc[
256
];
//zmienna na odczytany tekst

  GetPrivateProfileString(
"Sekcja pliku"
,
"Klucz"
,
"Odczytywana_wartość_nie_istnieje!"
,wartosc,
256
,
  
"C:\\plik INI.ini"
);
  MessageBox(
0
,wartosc,
"Plik INI"
,MB_OK);
  return
0
;
}

3. Odczyt liczby z pliku INI - GetPrivateProfileInt

Funkcja odczytuje ciąg znaków z pliku INI, a nastepnie zwraca go jako liczba.

UINT GetPrivateProfileInt(LPCSTR lpAppName, LPCSTR lpKeyName, INT nDefault, LPCSTR lpFileName);

LPCSTR lpAppName
Nazwa sekcji z której odczytywana będzie wartość.

LPCSTR lpKeyName
Klucz z którego będzie odczytywana wartość.

INT nDefault
Domyślna wartość, która zostanie zwróca w razie niepowodzenia odczytywania.

LPCSTR lpFileName
Ścieżka do odczytywanego pliku INI.

Wartość zawacana przez funkcję
Funkcja zwraca odczytaną wartość.