Ich würde es Ansatz wie folgt:
- eine Klasse erstellen, die den Name-Wert-Paar
- Verwenden
std::istream& operator>>(std::istream &, NameValuePair &);
Anschließend können Sie etwas tun, wie repräsentiert:
ifstream inifile(fileName);
NameValuePair myPair;
while(ifstream >> myPair)
{
myConfigMap.insert(myPair.asStdPair());
}
Wenn Ihre Ini-Datei Abschnitte enthält, von denen jeder ein benanntes Wertpaar enthält, müssen Sie bis zum Ende des Abschnitts lesen, damit Ihre Logik keinen Stromausfall verwendet, sondern eine Art abstrakte Factory mit einem Zustandsautomaten verwendet. (Sie lesen etwas und bestimmen dann, was es ist, was Ihren Zustand bestimmt).
Um den Stream in Ihr Name-Wert-Paar einzulesen, könnte dies mit getline geschehen, wobei das Zitat als Terminator verwendet wird.
Beachten Sie, dass ich nicht in nvPair.name geschrieben habe, bis wir das Token vollständig analysiert haben. Wenn das Streaming fehlgeschlagen ist, möchten wir nicht teilweise schreiben.
Der Datenstrom wird in einem Fehlerzustand belassen, wenn die getline fehlschlägt. Dies geschieht natürlich am Ende der Datei. Wir möchten keine Ausnahme auslösen, wenn sie aus diesem Grund fehlschlägt, weil dies das falsche Ende des Dateiendes ist. Du könntest es werfen, wenn es zwischen dem Namen und dem Wert fehlschlägt, oder wenn der Name nicht das nachgestellte = Zeichen hat (aber nicht leer ist), weil das kein natürliches Vorkommen ist.
Beachten Sie, dass dies Leerzeichen und sogar Zeilenumbrüche zwischen den Anführungszeichen erlaubt. Was auch immer zwischen ihnen ist, wird anders als andere Zitate gelesen. Sie müssten eine Escape-Sequenz verwenden, um diese zuzulassen (und den Wert analysieren).
Wenn Sie \ verwendet“, wie die Escape-Sequenz dann, wenn Sie den Wert zu erhalten, müssen Sie‚Schleife‘, wenn es endet mit einem \ (sowie es zu einem Kurswechsel), und verketten sie zusammen.
sind da newlines zwischen jedem Paar Schlüssel = Wert? – Simone
ja es gibt Linien zwischen ihnen – Marcus
Ich nehme an, du meinst 'char *', nicht 'char'.wenn dies für die Schnittstellenanforderungen ist, sind Sie fast sicher besser dran mit einem' std: : string'. –