[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