从文件中解析数据并存储在对象中

时间:2016-12-06 07:02:54

标签: c++ parsing c++11

好的,所以我接受了编码挑战的面试,我完全吹了..

我希望有人可以帮助我解决这个问题,这样我至少可以理解我所缺少的东西,这样下次出现这样的事情时我就能做得更好。

我被要求为以下数据创建解析器:

Data = {
    Name = "Macrosoft",
    Launched = 2006,
    Scores = {
        Players = {
            Josh = 46,
            June = 98
        },
        Rewards = ( 50, 40, 20 ),
        Min = 1,
        Max = 100
    },
    Games = (
        "Evo",
        "Gun Star",
        "Nuka"
    )
}

所需功能:

  • data.GetStr("Name"); // returns Macrosoft
  • data.GetNum("Launched"); // returns 2006
  • data.GetData("Scores").GetData("Players").GetNum("June"); // returns 98
  • data.GetArray("Games").GetStr(1); // returns Evo
  • data.FindNum("June"); // returns 98

详细说明:

所有元素都有一个标识符,如Data,Name,Launched等。

所有元素都有一些数据位于标识符之后,char'='数据可以是:

  • 字符串
  • Int(推出,最小和最大)
  • array(在'('和')之间定义的数组')
  • 其他数据(数据,分数,玩家)

1 个答案:

答案 0 :(得分:2)

您可以定义数据结构来保存数据。根据您发布的数据结构,我认为您可以定义这样的类:

class Data {
public:
    Data(string str);

    string GetStr(string key);
    int GetNum(string key);
    Data GetData(string key);
    Data GetArray(string key);

    // Array data operations
    string GetStr(int index);
    int GetNum(int index);

private:
    map<string, Data> dataMap;
};

一般情况下,您应首先拆分数据文件,然后将数据字符串拆分为字符',',然后您将获得一些分配语句,如:Name = "str"Launched = 123456Scores = { ... }Games = ( ... )

然后Name = "str"Launched = 123456之类的内容可以直接放入dataMap。应将Scores = { ... }Games = ( ... )等内容放入新的Data变量中,然后将SocresGames作为新Data变量的键并将它们放入dataMap

因此,我们应该解决的下一个问题是如何使用DataScores = { ... }初始化Games = ( ... )对象。

您可以看到Scores = { ... }正是您要解决的问题,因此您只需调用数据构造函数。

然后Games = ( ... )应再次以','分开。您还可以将( ... )中的元素放入dataMap,并且键应该是( ... )

中元素的索引

现在一切都很清楚。你的构造函数可能是这样的:

Data(string str) {
    vector<string> vecStr = split(str, ',');
    for(auto vecIter = vecStr.begin(); vecIter != vecStr.end(); ++vecIter) {
        if (ifIsArrayAssignment(*vecIter)) {
            // Games = ( ... )
            // you should put every elements into a new Data's dataMap
            // the key to the value can be numbers: 1 2 3 ...
        } else if (ifIsDataAssignment(*vecIter)) {
            // Scores = { ... }
            // you should get the key from *vecIter first
            // and make a new Data object with { ... } part
        } else {
           // Lanched = 123456 or Name = "str"
           // put it into dataMap
        }
    }
}