View Full Version : [C, Linux] lettura file di inizializzazione
esiste qualche routine da "man 3" (per così dire) per la lettura di files di inizializzazione in un formato del tipo chiave=valore ?
in altre parole, speravo ci fosse qualcosa di analogo a queste qua:
http://msdn2.microsoft.com/en-us/library/ms724345.aspx
http://msdn2.microsoft.com/en-us/library/ms724353.aspx
eccetera eccetera.
non mi dite che un povero programmatore C per leggersi uno straccio di file di inizializzazione deve scriversi le sue routines tutte le sante volte... :mc:
mi si è accesa una lampadina :D
devo usare fscanf con delle espressioni regolari che mi permettano di verificare la sintassi chiave=valore ? :idea:
esiste qualche routine da "man 3" (per così dire) per la lettura di files di inizializzazione in un formato del tipo chiave=valore ?In effetti non mi sembra che su Linux ci siano funzioni equivalenti già implementate (e standard) per gestire file .ini (a meno di usare librerie specifiche).
Una soluzione semplice è quella di gestirsi da sé il file .ini, che non è affatto difficile. Solita apertura con fopen(), lettura con fgets(), ricerca del '=' con strchr() e separazione della chiave dal valore (eventualmente si può fare un trimming degli spazi se non si vuole essere così rigorosi sul formato).
Poi cosa farne di questi dati, dipende esclusivamente da cosa devi fare di preciso. Una buona cosa sarebbe mettere questi dati in una hash-table, sempre che si voglia fare una gestione "generica". In C++ puoi usare STL, in "C" puro una hash-table te la devi fare tu ... mi sa.
Io per lavoro avevo dovuto sviluppare una applicazione portabile win/linux e c'era da gestire un file di configurazione di questo tipo chiave-valore (adesso non mi ricordo se avevo usato = o : come separatore).
Comunque avevo fatto proprio come ho detto, con l'unica particolarità che essendo una cosa molto specifica non l'ho fatta "generica".
Una volta presi chiave e valore, testavo la chiave con una catena di if-else-if usando strcmp() e in base alla chiave mettevo il valore in un determinato campo di una struttura.
non conosco funzioni già pronte, che per leggere dei file di configurazione usiamo codice fatto da noi.
si perde un po' di tempo purtroppo...
riesumo questo topic per dire che alla fine ho fatto così:
#define MAX_FIELD_LEN 60
char key[MAX_FIELD_LEN + 1];
char value[MAX_FIELD_LEN + 1];
while (1) {
int res = fscanf(config, " %60[_a-zA-Z] = %60[_a-zA-Z0-9] ", key, value);
if (res == EOF) {
break;
}
if (res != 2) {
printf("invalid config file format\n");
break;
}
if (!strcasecmp(key, "opzione1")) {
.
.
.
}
else if (!strcasecmp(key, "opzione2")) {
.
.
.
}
.
.
.
else {
printf("unknown option: \"%s\"\n", key);
}
}
questa libreria non sembrava male.. http://www.hyperrealm.com/libconfig/libconfig.html
ma forse fa anche troppo :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.