如何在c ++中阅读复杂的文本文件?

时间:2012-02-21 17:13:02

标签: c++ file-io text-files

我要阅读的文本文件有一定的模式:

Name line [tag name 452,54 | tag2 name 323,2 | tag3 name 252,25 ... ]
Name2 line [tag name 422,54 | tag2 name 33,2 | tag3 name 111,525 | tag4 name 222,2 ... ]

处理此文件最麻烦的部分是未设置每行的标记的数量。

我试图通过逐行读取文件并使用scanf()将行爆炸成变量来使其工作,因为它接合于擅长阅读模式。但是没有设置tag name字数,所以它也没有多大帮助。

我可以稍微操作文件模式而不会丢失任何数据,以便更容易阅读,但我没有想到任何解决方案。 我如何操作文件模式的示例:

Name line 
tag name 452,54 | tag2 name 323,2 | tag3 name 252,25 ... 
Name2 line 
tag name 422,54 | tag2 name 33,2 | tag3 name 111,525 | tag4 name 222,2 ... 

我添加了[]|符号作为分隔符,但理想情况下,它们越少越好。

Name line 
tag name 452,54 
tag2 name 323,2
tag3 name 252,25 ... 
Name2 line 
tag name 422,54
tag2 name 33,2
tag3 name 111,525
tag4 name 222,2 ... 

如果您已阅读过类似图案,请分享。我现在有点卡住了......

编辑:这是一个简单的.txt文件,我选择了tags namename line作为任何字符串值的替代品。没有id或其他东西可以轻松实现。

3 个答案:

答案 0 :(得分:1)

您应该仔细查看定义文件格式的语法并构建一个小的解析器,而不是在您阅读文件之前修改文件。虽然这项任务起初可能看起来令人生畏,但并不困难。

我更喜欢Boost.Spirit来执行此类任务。

答案 1 :(得分:1)

看起来您正在搜索解析器。网上有很多。 :)即使是lex / yacc或bison或其他什么东西也可以帮忙。

答案 2 :(得分:0)

如果你真的必须编写自己的代码并维护换行符以获得标记分离的特殊含义,你可以使用fgets()和strtok()的组合。 http://www.cplusplus.com/reference/clibrary/cstring/strtok/