2010-01-25 10 views
6

Il mio programma sta leggendo un file di testo contenente varie righe di testo per un file di impostazioni. Alcune linee potrebbero diventare molto grandi. Attualmente la dimensione del buffer è 4096 caratteri. È possibile che alcune linee potrebbero superare questo, sia per malizia o a causa di vari fattori che operano all'interno del programma.Esiste una libreria C diffusa per la lettura di coppie nome/valore da un file?

Le routine correnti erano piuttosto noiose da scrivere e ora desidero espandere i possibili contenuti del file che richiederà più di questo noioso codice ripetitivo. (Questo è per un file di tipo impostazioni, costituito da coppie name value e l'intestazione di sezione occasionale.Alcuni valori numerici devono essere letti come stringhe a causa della precisione multipla).

La cosa principale che voglio è leggere una linea di lunghezza arbitraria senza buffer overflow. Ho appena scoperto che getline può fare questo per me, ma, c'è per il cielo una biblioteca che farà tutto il resto di questa noiosità per me?

edit:

Non voglio essere costretto a effettuare un = segno fra il nome e valori, uno spazio vuoto dovrebbe essere sufficiente come separatore.

Con estensione, voglio dire che la libreria dovrebbe essere disponibile nei pacchetti standard delle diffuse distribuzioni Linux.

Sono a conoscenza di libconfig ma sembra eccessivo per le mie esigenze.

risposta

1

Il mio suggerimento è, fai da te, poiché è abbastanza facile.

  • Leggere ogni riga
  • caratteri conteggio fino a quando il separatore e dopo il separatore di
  • allocare i buffer
  • e leggere coppie di valori nome con sscanf

    come:

    sscanf(line, "%[^:]: %[^\n]", key, value);

Sarai al sicuro dal momento che hai contato i caratteri prima del sccanf.

+0

in questo caso suggerisco anche di scriverlo, sembra abbastanza banale. L'unico problema è come conserverai la tua tabella, se questa è pura C allora non c'è std :: map per te, ma immagino tu abbia già le tue strutture dati? –

+0

Grazie per il suggerimento sscanf% [..], ma dopo aver provato, ti manca un segno di omissione: '"% [^:]:% [^ \ n] "', saluti, ho intenzione di percorrere questa strada . –

+0

corretto. Ci scusiamo per il caret mancante. – piotr

4

Guardare in libini, sembra giusto. È piuttosto vecchio e non subisce esattamente uno sviluppo frenetico, ma se funziona già per il tuo problema, dovrebbe andare bene.

Una libreria più aggiornata, con una serie di altri vantaggi, è glib, ha un key-value-parser API.

+0

Ho deciso contro l'opzione glib come, ancora una volta, è eccessivo per le mie esigenze. La risposta scelta come corretta, sebbene non risolva direttamente la domanda della libreria, mi ha reso più facile continuare e non infrange alcuna specifica di file esistente in uso nei file di dati esistenti. –

+1

@James: Va bene, immagino ... Anche se sarei incline a pensare che per qualsiasi programma C non banale, glib è una dipendenza sana da avere poiché aggiunge molte cose che sono spesso necessarie in tali programmi comunque. – unwind

1

Ho contribuito con uno updated fork of libini allo CCAN. Contiene anche un'implementazione del dizionario molto utile e alcuni semplici algoritmi di hashing. Rusty lo ha inserito nel repository, quindi credo di aver fatto un buon lavoro nel portarlo aggiornato e sistemare i pochi bug minori.

L'ultima versione della libreria può essere trovata se si dispone di poke through this tree, contiene supporto token di base e supporto di base delle transazioni (utile per rileggere i file di configurazione e ripristinare se c'è un errore di analisi). Contiene anche una serie molto più aggiornata di test unitari.

Non mantengo più attivamente la forcella, poiché l'autore originale di libini è di nuovo attivo, tuttavia il modulo viene mantenuto in CCAN.

Problemi correlati