[Pluto-help] Qualcosa di simile ai file .ini
Marco Cova
giardini a libero.it
Gio 5 Lug 2001 21:55:07 CEST
"Lossani Simone Pietro, IT" wrote:
>
> Ciao,
> sono alle prese con il porting di un'applicazione scritta in C dal OS
> WinNT a Linux.
> Nell'applicazione originale faccio uso di accessi a file di tipo .ini (file
> ACII) che sono organizzati con "sezioni" e "chiavi".
> Per esempio:
>
> [SEZIONE1]
> chiave1=torino
> chiave2=juventus
>
> [SEZIONE2]
> chiave1=fiorentina
>
> Esistono delle funzioni che permettono di accedere im modo molto comodo ai
> file organizzati in questo modo:
> Indicando alla funzione la sezione e la chiave si ottiene direttamente il
> valore di quest'ultima.
>
> Esiste qualcosa di simile anche in ambiente Linux, oppure ci sono solo
> accessi ai file di tipo tradizionale? Forse qualcuno sa dove poter trovare
> una libreria che renda l'accesso ai file più comodo e .ini oriented?
>
> Grazie in anticipo!
>
> Simone.
Ciao.
Tempo fa avevo avuto questo stesso problema e mi ero fatto un paio di
funzioni. Se pensi che ti possano servire, fa' pure. Nota però che non è
una libreria, non sono scritte bene né elegantemente e last but not
least non mi assumo alcuna responsabilità etc. etc. Comunque, per quel
che mi erano servite, funzionavano ;-)
Saluti,
Marco.
-------------- parte successiva --------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 81 /* max lunghezza di una linea in un file .ini E' sufficiente??? */
#define IS_KEY_PAIR_VALUE(string) !strchr(string, '=')? 0 : 1
char *get_key_value_pair(const char *path, const char *section, const char *key);
char *get_value_from_pair(const char *pair);
char *get_value_from_file(const char *path, const char *section, const char *key);
/*
restituisce la coppia chiave-valore
se non esiste la chiave nella sezione indicata, restituisce NULL
path: path del file da legger
section: sezione in cui cercare la chiave
key: la chiave da cercare
*/
char *get_key_value_pair(const char *path, const char *section, const char *key)
{
FILE *fp;
char *line = malloc(MAXLEN*sizeof(char));
char *bsection = malloc(strlen(section) + 3);
if(!(fp = fopen(path, "r"))) {
fprintf(stderr, "Impossibile aprire il file %s\n", path);
exit(1);
}
while(!feof(fp)) {
fgets(line, 80, fp);
if(strstr(line, section)) { /* trovato la sezione */
do {
fgets(line, 80, fp);
if(strchr(line, '[')) return NULL; /* non esiste la chiave nella sezione indicata */
if(strstr(line, key)) return line;
} while (!feof(fp));
}
}
return NULL;
}
/*
restituisce il valore contenuto in una coppia chiave-valore
restituisce NULL in caso di errore
pair: la coppia chiave valore
*/
char *get_value_from_pair(const char *pair)
{
char *ptr;
char *value;
int i = 0;
if(!IS_KEY_PAIR_VALUE(pair)) return NULL;
value = malloc(MAXLEN * sizeof(char));
ptr = strchr(pair, '=');
ptr++;
while(*ptr)
value[i++] = *(ptr++);
return value;
}
/*
restituisce il valore dato il file, la sezione e la chiave
*/
char *get_value_from_file(const char *path, const char *section, const char *key)
{
return( get_value_from_pair(get_key_value_pair(path, section, key)));
}
int main(int argc, char **argv)
{
char *result;
if(argc != 4) {
fprintf(stderr, "Uso: %s path sezione chiave\n", argv[0]);
exit(1);
}
result = get_key_value_pair(argv[1], argv[2], argv[3]);
printf("%s\n", result);
printf("Il valore è %s\n", get_value_from_pair(result));
printf("Il valore è %s\n", get_value_from_file(argv[1], argv[2], argv[3]));
/* nota che i valori sono stringhe terminate da un '\n' */
exit(0);
}
More information about the pluto-help
mailing list