在c ++中解析相当复杂但结构文件

时间:2013-01-31 21:57:45

标签: c++ parsing file-io

我正在尝试使用c ++解析一个相当复杂但结构化的文件。

011 FistName MiddleName LastName age(int) date(4/6/2001) position status ...
012 FistName MiddleName LastName age(int) date(4/6/2001) position status ...
...

这就是文件格式的样子。 我试图将数据存储为结构的单个字段,但第一个中间姓名的大小可变,并且可能没有中间名,所以你如何区分它?

例如,

014 Jon Smith ...
015 Jon J Smith, Jr. ...

我想将整个名称存储在名称字段中,而不是将它们分开。 说我们有

struct{
    std::string name;
    int id;
    int age;
    std::string position;
    ...

}

我将如何解析所有内容?

2 个答案:

答案 0 :(得分:1)

出于您的目的,如果您使用的是C ++ 11,则可以调整std::regex match example来完成您想要的任务。

如果不是,您应该使用boost::regex来完成您想要的任务。

以下是您可以使用的正则表达式示例:

^\d+ (\w+) ?(\w*) (\w+),? ?(\w+\.)? age\((\d+)\) date\((\d\/\d\/\d+)\) (\w+) (\w+)

要了解该正则表达式的含义以及它与事物的匹配方式,请查看this link

要了解有关正则表达式的更多信息,我强烈推荐Jeffrey Friedl撰写this book

它符合以下内容:

014 Jon Smith age(32) date(4/6/2001) position status
014 Jon J Smith, Jr. age(16) date(4/6/2001) position status
015 FistName MiddleName LastName, Title. age(45) date(4/6/2001) position status
016 FistName MiddleName LastName age(7) date(4/6/2001) position status
039 FistName MiddleName LastName age(100) date(4/6/2001) position status

答案 1 :(得分:0)

嗯,你可以简单地使用fstream,然后一次一个字。首先进入一个int,然后进入一个字符串,直到下一个值为int(age)。如果我从无限循环中正确回想起来,当流不是数字时对数据流进行输入不会从流中获取值,因此您可以执行>> int,>>字符串>> int>>等等,直到你知道你有年龄。

等等,你明白了这一点:)

PS:记得输入循环使用.get()而不是.eof():)