[solved] wczytywanie pliku konfiguracyjnego

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
dcm_Marecheq
Piegowaty Guziec
Piegowaty Guziec
Posty: 16
Rejestracja: 06 lut 2007, 20:59
Płeć: Mężczyzna
Wersja Ubuntu: 15.10
Środowisko graficzne: Unity
Architektura: x86_64
Kontakt:

[solved] wczytywanie pliku konfiguracyjnego

Post autor: dcm_Marecheq »

Napisałem program, który wczytuje ustawienia z pliku konfiguracyjnego. Program otwiera plik i wczytuje kolejno wiersze. Przypisuje wartości zmiennych łańcuchowych, znakowych i liczbowych (typu int). Załączam cały kod źródłowy i przykładowy plik konfiguracyjny. W załączonym pliku jest dodatkowo spakowany plik wykonywalny. Może się komuś przyda.

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");
  }
}
Przykładowa funkcja main:

Kod: Zaznacz cały

int main()
{wczytaj_config();
return 0;}
Przykładowy plik config.cfg:

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
Załączniki
wczytaj_config.tar.gz
(8.07 KiB) Pobrany 69 razy
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 69 gości