|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
[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... ![]() |
![]() |
![]() |
![]() |
#2 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
mi si è accesa una lampadina
![]() devo usare fscanf con delle espressioni regolari che mi permettano di verificare la sintassi chiave=valore ? ![]() |
![]() |
![]() |
![]() |
#3 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
up
![]() |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
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.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19148
|
non conosco funzioni già pronte, che per leggere dei file di configurazione usiamo codice fatto da noi.
si perde un po' di tempo purtroppo... |
![]() |
![]() |
![]() |
#6 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
riesumo questo topic per dire che alla fine ho fatto così:
Codice:
#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); } } |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7249
|
questa libreria non sembrava male.. http://www.hyperrealm.com/libconfig/libconfig.html
ma forse fa anche troppo ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:32.