【问题标题】:How to read complex text file in c++?如何在 C++ 中读取复杂的文本文件?
【发布时间】:2012-02-21 17:13:02
【问题描述】:

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

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 ... ]

处理这个文件最麻烦的部分是没有设置每行的tags个数。

我试图通过逐行读取文件并使用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 或其他东西可以让它变得简单。

【问题讨论】:

  • 您希望将其加载到的结构的布局是什么?标准索引数组还是散列?
  • 您需要更具体地了解您的格式。 line 是分隔符还是输入的一部分?此外,文件格式似乎有点破损。当每个N由位置定义时,为什么会有tagN

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


【解决方案1】:

您应该仔细查看定义文件格式的语法并构建一个小型解析器,而不是在您可以阅读之前修改您的文件。虽然这项任务一开始可能看起来很艰巨,但其实并不难。

对于此类任务,我更喜欢 Boost.Spirit

【讨论】:

  • 我同意这个想法,但我不允许使用任何外部库,这就是我苦苦挣扎的原因。
  • @Povylas:那么你应该看看 Akshay 在his answer 中提到的工具。
  • @Povylas 外部库和复制到您项目中的标头之间的界限很细,只有少数教您项目的学生助理可以看到它。
【解决方案2】:

看起来您正在搜索解析器。网上有很多。 :) 甚至 lex/yacc 或 bison 之类的都可以提供帮助。

【讨论】:

  • 这些不是解析器,而是解析器生成器。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2016-08-16
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多