/ / Complesso C ++ File di testo IO - c ++, parsing, fstream

File di testo C ++ complesso IO - c ++, parsing, fstream

Voglio creare un programma riutilizzabile che creaun test a scelta multipla casuale da un file di testo. Il file di testo contiene la domanda, la risposta e altre risposte errate. Voglio che il programma cerchi parole chiave che identificano parti del file di testo. Ecco come è ora il file di testo (l'esempio è per un test di anatomia ossea):

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 significa domanda 0. Quello che è accanto ad esso tra virgolette è la domanda, la risposta è tra parentesi. W0 e on è la parola banca, che è altre potenziali risposte. Penso che quello di cui ho bisogno è chiamato parser. Sono ancora un principiante, una specie di. Ho solo bisogno di sapere come ottenere il programma per leggere questo file e visualizzarlo correttamente. Non sto chiedendo che il programma sia scritto per me, voglio solo qualche consiglio per fare un parser con questo formato.

risposte:

1 per risposta № 1

Innanzitutto prenditi cura delle strutture dati: è una buona pratica. Come puoi vedere, ci possono essere queste strutture:

map<string, int> answers;

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

list<question> questions;

Come vedi, è meglio inserire le risposte nel file prima delle domande, perché? Perché puoi scrivere un programma in questo modo:

  1. Parse risponde e riempie answers carta geografica.
  2. Parse question e fill questions. Basta inserire il numero di una risposta in answers[answer_string] per ottenere il numero di una risposta corrispondente.

Ora hai tutto per creare un algoritmo. Vediamo come generalmente funziona un parser semplice per questo caso:

  1. Salta tutti gli spazi.
  2. Leggi un simbolo s. Se s == "W" quindi leggi il numero di una risposta, altrimenti se s == "Q" leggi una domanda "numero.
  3. Se s == """ leggere una stringa "s di domande fino al prossimo" "".
  4. Se s == "[" leggere una stringa di risposta "s s" fino a "]".
  5. Se s == "<" leggi la stringa di una risposta fino a ">".

Basta usare queste regole e otterrai un algoritmo di parsing ricorsivo. Inoltre sarebbe bello leggere parser di discesa ricorsivi per dettagli.

Questo è tutto! Hai strutture dati e un algoritmo, ora puoi scrivere del codice.

E perché non usare un numero per la risposta della domanda al posto della stringa per ridurre le duplicazioni? :-)


0 per risposta № 2

Se fossi in te, userei un formato XML invece di un file di testo. Esistono diversi parser XML gratuiti già disponibili sul mercato, quindi non è necessario scrivere molto codice di analisi.

Un altro vantaggio è che se in seguito si decide di modificare il formato è più facile quindi riscrivere il parser.

Il terzo vantaggio è che le domande e le risposte si accumulano in una gerarchia che si adatta molto bene alle strutture dei dati.