2012-06-08 10 views
6

Questa è una cosa molto semplice, quindi voglio mantenerla così semplice come sembra. Tutto quello che voglio è caricare un gruppo di paia valore-chiave da un file e inserirle in una mappa. Non mi interessa davvero come è strutturato il testo, purché sia ​​facile da leggere.carico std :: mappa da file di testo

quello che ho adesso è:

  • xml con XSD generato il codice (eccessivo)
  • buffer di protocollo (anche eccessivo)
  • INI file di testo stile

mi piace la sintassi del file INI, ma non voglio scrivere un parser per questo. Mi sembra che farei qualcosa che molte persone hanno fatto prima di me. Non esiste una sorta di libreria per leggere semplici file strutturati come questo?

+2

formato csv è ancora più semplice, ogni riga è una coppia di valori come: chiave; valore. Quindi la tua chiave/i valori sono separati da punto e virgola. Dubito che troverai librerie per quello (ma alcuni potrebbero esistere) poiché l'analisi è così semplice. – marcinj

+1

possibile duplicato di [parser CSV in C++] (http://stackoverflow.com/questions/1120140/csv-parser-in-c) – gbjbaanb

+0

@gbjbaanb, hai ragione, csv dovrebbe funzionare anche per me. Tuttavia, sarei comunque interessato a vedere un parser per il formato INI standard. –

risposta

7

Dato che sembra che la cosa più semplice sia umanamente possibile, suggerirò qualcosa di incredibilmente semplice che potrebbe funzionare o meno in base ai contenuti della mappa. Se i valori dei dati della mappa sono stringhe che includono spazi, questo non funzionerà. Se sono stringhe senza spazi o numerici, sei pronto.

Questo codice non è testato, ma è vicino e semplice, quindi si dovrebbe andare bene anche se non è abbastanza compilabile. Basta cambiare KeyType e ValueType in int, string, float o qualsiasi altra cosa si stia effettivamente utilizzando nel file.

installare lima come:

key value 
key2 value2 
key3 value3 
key4 value4 

leggere come:

KeyType key; 
ValueType value; 

std::map<KeyType, ValueType> myMap; 
while (infile >> key >> value) 
    myMap[key] = value; 
+2

Questo è davvero molto semplice! Funzionerebbe perfettamente per quello che sto facendo. Ancora, non in formato INI, ma dovrebbe funzionare –

+4

-1, la condizione di loop dovrebbe essere 'while (infila >> chiave >> valore)' e per il corpo del ciclo 'myMap [chiave] = valore;' è più semplice –

+1

L'idea di base è ottima , ma solo per enfatizzare e spiegare quello che ha detto Jonathan: questa non è semplicemente una questione di stile - la condizione 'eof()' non è impostata fino a dopo un tentativo fallito di leggere la fine (esperimento mentale: anche se non all'ultimo carattere in 'infile', come poteva sapere a' while() 'se aveva abbastanza caratteri sia per la chiave che per il valore?). Separatamente, e FWIW, questo può funzionare per le chiavi 'std :: string' e valori con spazi con una semplice modifica a' while (getline (infile, chiave) && getline (infile, valore)) '. –

0

Se siete nel mondo MS si può usare

GetPrivateProfileSectionNames 
GetPrivateProfileString 
WritePrivateProfileString 

a leggere dal file ini o regestry . Se vuoi scrivere Unicode assicurati che un file appena creato abbia la BOM di UTF16.

Problemi correlati