Kod: Zaznacz cały
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* deklaracje zmiennych, których wartości będą przypisywane */
char zmienna_string[20]; /* w nawiasie maksymalna długość */
char zmienna_char;
int zmienna_int;
Kod: Zaznacz cały
void podziel(char* wiersz)
{
int i= 0;
int dzielto = 0;
while (wiersz[i]!= '\n')
{
if (wiersz[i] == '=')
{dzielto= 1;}
i++;
/* jeśli w wierszu występuje znak równości */
}
if (wiersz[0] == '#')
{dzielto= 0;
/* jeśli wiersz NIE zaczyna się od hasza */
}
if (dzielto== 1)
{/* jeśli obydwa warunki są spełnione to funkcja dzieli wczytaną linię na nazwę zmiennej i jej wartość */
char* zmienna= strtok (wiersz,"=");
char* wartosc= strtok (NULL, "=");
przytnij(wartosc);
przypisz(zmienna, wartosc);
}
else
{printf ("%s", wiersz);}/* jeśli we wczytanej linii niema znaku równości lub zaczyna się ona od hasza to jest jedynie wyświetlana */
}
Kod: Zaznacz cały
void przytnij(char* wartosc)
{/* obcina spacje i znaki tabulacji na początku ciągu znaków */
if (wartosc[0] == ' ' || wartosc[0] == '\t')
{/* jeśli pierwszym znakiem ciągu jest spacja lub znak tabulacji */
while (wartosc[0] == ' ' || wartosc[0] == '\t')
{/* powtarza zagnieżdżoną pętlę dopóki nie napotka znaku innego niż spacja lub znak tabulacji */
int i= 0;
while (wartosc[i]!= '\n')
{
wartosc[i]= wartosc[i+1];/* przypisuje i-temu znakowi wartość znaku i+1 przesuwając wiersz w lewo */
i++;
}
wartosc[i-1]= '\0';
/* zamyka ciąg znaków */
}
}
else
{
int i= 0;
while (wartosc[i]!= '\n')
{i++;}
wartosc[i]= '\0';
/* zamyka ciąg znaków */
}
}
Kod: Zaznacz cały
void przypisz(char* zmienna, char* wartosc)
/* przypisuje zmiennej występującej w pliku konfiguracyjnym pod nazwą "zmienna" odpowiednią wartość */
/* nazwa zmiennej w kodzie programu może być identyczna z tą w pliku lub różnić się */
{
/* sprawdza kolejno czy wczytana z pliku nazwa zmiennej jest identyczna z nazwą
którejś ze zmiennych, których wartości ma przypisywać */
if (strcmp(zmienna,"zmienna_lancuchowa")==0) /* czy zmienna z pliku ma nazwę zmienna_lancuchowa */
{printf ("?");
/* UWAGA! znak "ptaszka" wyświetlają się poprawnie tylko gdy terminal ma ustawione kodowanie UTF-8 */
strcpy(zmienna_string, wartosc); /* przypisuje zmiennej wartość z pliku */
printf (" %s %s\n", zmienna, zmienna_string);} /* wyświetla nazwę zmiennej z pliku */
/*else {printf ("nie przypisuje wartości zmiennej łańcuchowej\n");}*/
if (strcmp(zmienna,"zmienna_znakowa")==0)
{printf ("?");
zmienna_char= wartosc[0];/* zmienna znakowa przyjmuje wartość pierwszego znaku na prawo od znaku równości (innego niż spacja czy znak tabulacji) */
printf (" %s %c", zmienna, zmienna_char); /* wyświetla deskryptor oraz jego numer */
if( strlen(wartosc) > 1)
{printf (" (Uwaga! wartość w pliku ma długość %hd znaków!)", strlen(wartosc));}
/* program ostrzega jeśli wartość zmiennej w pliku jest dłuższa niż jeden znak */
printf ("\n");
/* i dopiero wtedy przechodzi do nowego wiersza */
}
/*else {printf ("nie przypisuję karty wartości zmiennej znakowej\n");}*/
if (strcmp(zmienna,"liczba_calkowita")==0)
{printf ("?");
zmienna_int = atoi(wartosc); /* funkcja atoi z biblioteki stdlib zamienia ciąg znaków składający się z cyfr na liczbę typu int */
printf (" %s %hd\n", zmienna, zmienna_int); /* wyświetla deskryptor oraz jego numer */
}
/*else {printf ("nie przypisuję wartości zmiennej liczbowej\n");}*/
/* tutaj można wstawić przypisywanie kolejnych wartości zmiennym */
}
Kod: Zaznacz cały
void wczytaj_config()
{
FILE *filepointer;
filepointer = fopen("./config.cfg","r");
if(filepointer == NULL)
{
puts("? Nie można otworzyć pliku z ustawieniami!\nPrzypisywanie wartości domyślnych.");
/* jeśli w katalogu z którego został uruchomiony program niema pliku konfiguracyjnego */
/* to program przypisuje zmiennym wartości domyślne */
strcpy(zmienna_string, "domyślna wartość");
/* przypisywanie wartości zmiennej łańcuchowej */
zmienna_char= 'N';
/* przypisywanie wartości zmiennej typu char */
zmienna_int= 16;
/* przypisywanie wartości zmiennej typu int */
}
else
{
printf("Otwarcie pliku z ustawieniami\n");
char * wiersz = NULL;
size_t rozmiar= 0;
ssize_t bufor;
while ((bufor= getline(&wiersz, &rozmiar, filepointer)) != -1)
{
podziel(wiersz);/* wczytuje kolejne linie i wywołuje funkcję podziel */
}
fclose(filepointer);
printf("Zamknięcie pliku z ustawieniami\n");
}
}
Kod: Zaznacz cały
int main()
{wczytaj_config();
return 0;}
Kod: Zaznacz cały
zmienna_lancuchowa= /home/msuma
zmienna_znakowa= T
liczba_calkowita= 666
# po znaku równości mogą być spacje lub znaki tabulacji
# wszystko na prawo od ostatniego ostępu jest wartością
# puste linie, linie nie zawierające znaku "="
# oraz linie zaczynające się od "#" są tylko wyświetlane
# jeśli wartość zmiennej znakowej jest dłuższa niż jeden znak
# to przypisywany jest tylko pierwszy znak