复杂的C ++文本文件IO

时间:2013-11-01 20:12:48

标签: c++ parsing fstream

我想创建一个可重用的程序,用于从文本文件中创建随机多项选择测试。文本文件将包含问题,答案和其他错误答案。我希望程序搜索标识文本文件部分的关键字。以下是文本文件的现状(该示例适用于骨骼解剖测试):

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表示问题0.引号旁边的是问题,答案在括号中。 W0和on是单词bank,这是其他潜在的答案。我认为我需要的是一个解析器。我还是个初学者。我只需要知道如何让程序读取该文件并正确显示。我并没有要求为我编写程序,我只是想要一些建议使用这种格式的解析器。

2 个答案:

答案 0 :(得分:1)

首先要处理数据结构 - 这是一个很好的做法。如您所见,可能存在以下结构:

map<string, int> answers;

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

list<question> questions;

如您所见,最好在问题之前将答案放在档案中。为什么?因为你可以通过这种方式编写程序:

  1. 解析答案并填写answers地图。
  2. 解析问题并填写questions。只需在answers[answer_string]中输入答案号码即可获得相应答案的编号。
  3. 现在您可以创建一个算法。 让我们看看在这种情况下通常如何为一个简单的解析器工作:

    1. 跳过所有空格。
    2. 阅读符号s。如果s == 'W'则读取答案的号码。如果s == 'Q'读取问题的编号,则另外。
    3. 如果s == '"'读取问题的字符串,直到下一个'“'。
    4. 如果s == '['读取问题的答案字符串,直到']'。
    5. 如果s == '<'读取答案的字符串,直到'&gt;'。
    6. 只需使用这些规则,您将获得递归解析算法。另外,关于详细信息,请阅读recursive descent parsers

      这就是全部!您有数据结构和算法。现在你可以编写一些代码。

      为什么不使用问题的答案而不是字符串来减少重复? :-)

答案 1 :(得分:0)

如果我是你,我会使用XML格式而不是文本文件。市场上已经有几种免费的XML解析器,所以你不需要编写太多的解析代码。

另一个好处是,如果您以后决定更改格式,则更容易重写解析器。

第三个好处是,你可以在一个非常适合数据结构的层次结构中建立你的问题和答案。