2012-06-08 16 views
6

Dies ist eine sehr einfache Sache, also möchte ich es so einfach wie es klingt halten. Alles, was ich will, ist, eine Reihe von Schlüssel-Wert-Paaren aus einer Datei zu laden und sie in eine Karte einzutragen. Es ist mir egal, wie der Text strukturiert ist, solange er einfach zu lesen ist.laden std :: Karte aus Textdatei

Was ich jetzt:

  • xml mit xsd generierten Code (Overkill)
  • Protokoll-Puffer (auch Overkill)
  • INI Stil Textdatei

Ich mag die Syntax der INI-Datei, aber ich möchte keinen Parser dafür schreiben. Es klingt für mich, als würde ich etwas tun, was viele Leute vor mir getan haben. Gibt es keine Art von Bibliothek, um solche einfachen strukturierten Dateien zu lesen?

+2

CSV-Format ist noch einfacher, jede Zeile ist ein Paar Werte wie: Schlüssel; Wert. Also sind Ihre Schlüssel/Werte durch ein Semikolon getrennt. Ich bezweifle, dass Sie dafür Bibliotheken finden (aber einige existieren), da das Parsen so einfach ist. – marcinj

+1

möglich Duplikat von [CSV-Parser in C++] (http://stackoverflow.com/questions/1120140/csv-parser-in-c) – gbjbaanb

+0

@gbjbaanb, du hast Recht, csv sollte auch für mich arbeiten. Ich wäre jedoch immer noch interessiert, einen Parser für das Standard-INI-Format zu sehen. –

Antwort

7

Da Sie scheinen, die einfachste Sache menschlich möglich zu wollen, werde ich Ihnen etwas unglaublich Einfaches vorschlagen, das auf Ihren Karteninhalten basiert. Wenn Ihre Kartendatenwerte Zeichenfolgen sind, die Leerzeichen enthalten, funktioniert dies nicht. Wenn sie Zeichenfolgen ohne Leerzeichen oder numerisch sind, sind Sie festgelegt.

Dies ist kein getesteter Code, aber es ist nah und einfach, also sollten Sie in Ordnung sein, auch wenn es nicht ganz kompiliert. Ändern Sie einfach KeyType und ValueType in int, string, float oder was auch immer Sie tatsächlich in der Datei verwenden.

Set up-Datei wie:

key value 
key2 value2 
key3 value3 
key4 value4 

Lesen wie:

KeyType key; 
ValueType value; 

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

Das ist wirklich sehr einfach! Würde perfekt für das, was ich tue, funktionieren. Immer noch nicht INI-Format, aber sollte funktionieren –

+4

-1, sollte die Schleife Bedingung sein "while (infile >> key >> value)" und für die Schleife body 'myMap [key] = Wert;' ist einfacher –

+1

Grundidee ist großartig , aber nur um zu betonen und zu erklären, was Jonathan sagte: das ist nicht nur eine Frage des Stils - die 'eof()' Bedingung wird erst nach einem gescheiterten Versuch gesetzt, über das Ende hinaus zu lesen (Gedankenexperiment: wenn auch nicht zuletzt) Zeichen in 'infile', wie konnte es am' while() 'wissen, ob es genug Zeichen für Schlüssel und Wert hatte?). Separat, und FWIW, kann dies für 'std :: string' Schlüssel und Werte mit Leerzeichen mit einem einfachen Wechsel zu' while (getline (infile, key) && getline (infile, value)) 'funktionieren. –

0

Wenn Sie in der MS Welt sind Sie

GetPrivateProfileSectionNames 
GetPrivateProfileString 
WritePrivateProfileString 

lesen aus INI-Datei oder regestry verwenden können . Wenn Sie Unicode schreiben möchten, stellen Sie sicher, dass eine neu erstellte Datei die Stückliste von UTF16 erhält.