我正在尝试使用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;
...
}
我将如何解析所有内容?
答案 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():)