C und Konfigurationsfile ?
Chris
- programmiertechnik
Hallo zusammen,
ich suche nach einer Möglichkeit von aussen Variablen in mein C Programm zu holen.
Dazu habe ich mir einen File angelegt "config.cfg" diesen lasse ich dann von meinem Programm includen "include "config.cfg"; ...
Die Werte in der Datei config.cfg schauen so aus:
user = "test";
pass = "test";
Nur weiss ich nicht wie ich die eingelesenen Werte in Variablen umwandeln kann.
Kann mir da jemand weiterhelfen ?
Viele Grüße und danke,
Chris
Nachtrag,
Dazu habe ich mir einen File angelegt "config.cfg" diesen lasse ich dann von meinem Programm includen "include "config.cfg"; ...
Ich habe gerade bemerkt das meine Variante nutzlos ist ;-)
Er Kompiliert die config.cfg direkt fest mit ein, was mir dann nicht wirklich weiterhilft.
Kann mir jemand veraten wie ich es hinbekomme einen normalen Konfigfile der von den Werten her Variable bleibt in ein C Programm einzubinden ?
So wie man es auch in PHP, PERL, BASH etc... machen kann um halt die Datenbank Zugangsdaten festzulegen oder ähnlich.
Viele Grüße & danke,
Chris
Hi,
Dazu habe ich mir einen File angelegt "config.cfg" diesen lasse ich dann von meinem Programm includen "include "config.cfg"; ...
Ich habe gerade bemerkt das meine Variante nutzlos ist ;-)
Nicht vollkommen nutzlos, aber in Deinem Fall schon ;-)
Er Kompiliert die config.cfg direkt fest mit ein, was mir dann nicht wirklich weiterhilft.
Kann mir jemand veraten wie ich es hinbekomme einen normalen Konfigfile der von den Werten her Variable bleibt in ein C Programm einzubinden ?
Klar:
Du baust einen einfachen Automaten, der die einliest.
Datei öffnen.
Detie (zeilenweise) einlesen
mit z.B. strtok() key von value trennen
in eine linked list o.ä. speichern
fertig
Allerdings standen schon andere Leute vor Deinem Problem, deshalb git es das schon vorgefertigt, schau mal bei Freshmeat vorbei oder Sourceforge.
BTW: wie bist Du eigentlich mit Deiner C-Frage hierhin gekommen?
so short
Christoph Zurnieden
Hi,
Klar:
Du baust einen einfachen Automaten, der die einliest.Datei öffnen.
Detie (zeilenweise) einlesen
mit z.B. strtok() key von value trennen
in eine linked list o.ä. speichern
fertig
mit sowas habe ich gerechnet ;-)
BTW: wie bist Du eigentlich mit Deiner C-Frage hierhin gekommen?
Gute Frage, mein Anlaufpunkt bei Fragen ist eigentlich immer hier, heute war es mal eine C-Frage ... Kannst du bessere Foren/Hilfeseiten für das Thema C empfehlen ?
Danke & Gruß,
Chris
Hi,
Klar:
Du baust einen einfachen Automaten, der die einliest.Datei öffnen.
Detie (zeilenweise) einlesen
mit z.B. strtok() key von value trennen
in eine linked list o.ä. speichern
fertigmit sowas habe ich gerechnet ;-)
Deshalb ja auch meine Frage weiter unten, wie Du auf die Idee kamst, so eine Frage ausgerechnet hier zu stellen ;-)
Aber weil ich ja heute meinen gutmütigen habe, etwas bräsig vor dem Rechner sitze und rein gar keine Lust habe etwas für meinen Lebensunterhalt zu tun ... äh ... was wollt' ich jetzt sagen? - ach ja: hier ein kurzes Snippet:
Gegeben sei eine simplifizierte INI-Datei wie sie vor rund 30 Jahren mal erfunden wurde (Ja, auch das ist nicht auf dem Mist von MS gewachsen ;-)
---config.data---
key1=value1;
key2 = value2,value3;
key3= value4,value5;
key4=;
---snap---
---parse.c---
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>
#include <unistd.h>
#include <ctype.h>
#include <string.h>
#include <errno.h>
typedef struct _config_t{
char *key;
char *value;
struct _config_t *next;
} *config_t;
char *strtrim(char *s){
char *last;
if(s){
while(isspace(*s))
s++;
last = s+strlen(s);
while (last > s){
if(!isspace(*(last - 1)))
break;
last--;
}
*last = '\0';
}
return s;
}
extern char *strdup(const char *s);
int main(){
char buffer[BUFSIZ];
FILE *configp;
config_t conf, start_conf;
uint8_t i = 0;
char *tmpp;
configp = fopen("config.file","r");
if(!configp){
fprintf(stderr,"fopen() failed: %s\n",strerror(errno));
exit(EXIT_FAILURE);
}
conf = malloc(sizeof(struct _config_t));
if(!conf){
fprintf(stderr,"malloc(1) failed: %s\n",strerror(errno));
exit(EXIT_FAILURE);
}
start_conf = conf;
while(fgets(buffer,BUFSIZ,configp) != NULL){
if(conf->next == NULL){printf("222 i = %d\n",i);
conf->next = malloc(sizeof(struct _config_t));}
if(!conf){
fprintf(stderr,"malloc(2) failed: %s\n",strerror(errno));
exit(EXIT_FAILURE);
}
conf->key = strdup(strtok(buffer,"="));
conf->value = strdup(strtok(NULL,"=;"));
conf = conf->next;
printf("i = %d\n",i++);
}
conf->next = NULL;
conf = start_conf;
/* TEST */
while(conf->next != NULL){
printf("KEY = %s ",strtrim(conf->key));
free(conf->key);
tmpp = strtok(conf->value,",");
i=1;
do{
printf("Value[%d] = %s, ",i++,strtrim(tmpp));
tmpp = strtok(NULL,",");
}while(tmpp != NULL);
putc('\n',stdout);
free(conf->value);
start_conf = conf->next;
free(conf);
conf = start_conf;
}
putc('\n',stdout);
exit(EXIT_SUCCESS);
}
---snap---
strdup() ist nicht in C99, aber schnell selber gebaut.
so short
Christoph Zurnieden
Hi,
danke für Deine Hilfe, da habe ich ja heute noch was vor mir ;-)
Gruß,
Chris
Hi,
danke für Deine Hilfe, da habe ich ja heute noch was vor mir ;-)
Das schaffst Du heut' nicht mehr ;-)
Aber wie der Zufall so spielt ist libconfparse auf 1.0 vorgerückt:
http://freshmeat.net/releases/170570/
Ist allerdings GPL, falls Du das gegen ein kommerzielles Programm linken willst ist's natürlich schlecht.
BTW: hättest Du eine Email-Adresse hinterlassen hätte ich Dir auch einen sorgfältig kommentierten Automaten schicken können. Der ist leider zu lang für diese Seite und ich habe nirgendwo mehr Webspace frei.
so short
Chjristoph Zurnieden