/ / Complex C ++ Textdatei IO - C ++, Parsing, Fstream

Komplexe C ++ Textdatei IO - C ++, Parsing, Fstream

Ich möchte ein wiederverwendbares Programm erstellen, das erstelltein zufälliger Multiple-Choice-Test aus einer Textdatei. Die Textdatei würde die Frage, die Antwort und andere falsche Antworten enthalten. Ich möchte, dass das Programm nach Schlüsselwörtern sucht, die Teile der Textdatei identifizieren. Hier ist, wie die Textdatei jetzt ist (Das Beispiel ist für einen Knochenanatomietest):

Q0 "What bone is the supraorbital foramen found on?" [Frontal Bone]
Q1 "What bone is the Sella Turcica found on?" [Sphenoid Bone]
Q2 "What bone is the Crista Galli found on?" [Cribriform Plate]
Q3 "What bone is the Foramen Magnum found on?" [Occipital Bone]
Q4 "What bone is next to the Ulna?" [Radius]

W0 <Frontal Bone>
W1 <Sella Turcica>
W2 <Carpals>
W3 <Temporal Bone>
W4 <Femur>
W5 <Ulna>
W6 <Sphenoid Bone>
W7 <Crista Galli>
W8 <Cribriform Plate>
W9 <Mandible>
W10 <Radius>
W11 <Foramen Magnum>
W12 <Occipital Bone>
W13 <Leg>
W14 <Arm>

Q0 bedeutet Frage 0. Was in Anführungszeichen daneben steht, ist die Frage, die Antwort steht in Klammern. W0 und weiter ist die Wortbank, die andere mögliche Antworten sind. Ich denke, was ich brauche, heißt Parser. Ich bin immer noch ein Anfänger, irgendwie. Ich muss nur wissen, wie man das Programm dazu bringt, diese Datei zu lesen und korrekt anzuzeigen. Ich möchte nicht, dass das Programm für mich geschrieben wird, ich möchte nur einen Ratschlag für die Erstellung eines Parsers mit diesem Format.

Antworten:

1 für die Antwort № 1

Berücksichtigen Sie zuerst die Datenstrukturen - es ist eine gute Vorgehensweise. Wie Sie sehen, gibt es möglicherweise diese Strukturen:

map<string, int> answers;

struct question {
int id;
string text;
int answer;
}

list<question> questions;

Wie Sie sehen, ist es besser, die Antworten vor den Fragen in eine Datei zu stellen. Warum? Weil Sie auf diese Weise ein Programm schreiben können:

  1. Parsen Antworten und füllen answers Karte.
  2. Frage analysieren und ausfüllen questions. Setzen Sie einfach die Nummer einer Antwort ein answers[answer_string] um die entsprechende Antwortnummer zu erhalten.

Jetzt haben Sie alles, um einen Algorithmus zu erstellen. Sehen wir uns an, wie im Allgemeinen ein einfacher Parser für diesen Fall funktioniert:

  1. Überspringe alle Leerzeichen.
  2. Lesen Sie ein Symbol s. Ob s == "W" dann lese eine Antwort "s Nummer. Sonst wenn s == "Q" Lesen Sie die Nummer einer Frage.
  3. Ob s == """ Lesen Sie eine Frage "s String bis zum nächsten" "".
  4. Ob s == "[" Lesen Sie den Antwort-String einer Frage bis "]".
  5. Ob s == "<" Lesen Sie eine Antwort "s Zeichenfolge bis"> ".

Verwenden Sie einfach diese Regeln und Sie erhalten einen rekursiven Analysealgorithmus. Es wäre auch gut, darüber zu lesen rekursive Abstiegsparser für Details.

Das ist alles! Sie haben Datenstrukturen und einen Algorithmus. Jetzt können Sie etwas Code schreiben.

Und warum nicht eine Zahl für die Frage "Antwort statt String verwenden, um Duplikate zu reduzieren?" :-)


0 für die Antwort № 2

Wenn ich Sie wäre, würde ich ein XML-Format anstelle einer Textdatei verwenden. Es gibt bereits mehrere kostenlose XML-Parser auf dem Markt, so dass Sie nicht viel Parsing-Code schreiben müssen.

Ein weiterer Vorteil ist, dass wenn Sie später entscheiden, das Format zu ändern, es einfacher ist, den Parser neu zu schreiben.

Der dritte Vorteil besteht darin, dass Sie Ihre Fragen und Antworten in einer Hierarchie aufstellen, die sehr gut für Datenstrukturen geeignet ist.