C++ 通过扫描关键字读取文本文件

C++ 通过扫描关键字读取文本文件,c++,string,file-io,io,ifstream,C++,String,File Io,Io,Ifstream,作为一个更大应用程序的一部分,我正在开发一个类,用于从文本文件中读取输入,以用于程序的初始化。现在我对编程相当熟悉,我在十二月才开始学习C++,所以我非常感谢一些关于如何开始的提示和想法。我为一长串的文字提前道歉 文本文件格式为“关键字驱动”,其方式如下: 有相当少的主/部分关键字(目前为8个)需要按给定顺序编写。其中一些是可选的,但如果包括它们,则应遵循给定的顺序 示例: 假设有3个潜在关键字,按如下顺序排列: "KEY1" (required) "KEY2" (optional) "KE

作为一个更大应用程序的一部分,我正在开发一个类,用于从文本文件中读取输入,以用于程序的初始化。现在我对编程相当熟悉,我在十二月才开始学习C++,所以我非常感谢一些关于如何开始的提示和想法。我为一长串的文字提前道歉

文本文件格式为“关键字驱动”,其方式如下:

  • 有相当少的主/部分关键字(目前为8个)需要按给定顺序编写。其中一些是可选的,但如果包括它们,则应遵循给定的顺序
示例:

假设有3个潜在关键字,按如下顺序排列:

"KEY1" (required)
"KEY2" (optional)
"KEY3" (required) 
如果输入文件仅包括所需文件,则顺序应为:

"KEY1"
"KEY3"
"KEY1"
"KEY2"
"KEY3"
否则,它应该是:

"KEY1"
"KEY3"
"KEY1"
"KEY2"
"KEY3"
  • 如果所有必需的关键字都存在,并且总体排序正常,则程序应按照排序给出的顺序读取每个部分

  • 每个部分都会包含(可能很大)数量的子关键字,其中有些是可选的,有些不是,但这里的顺序并不重要

  • 以字符
    '*'
    '-'
    开头的行表示注释行,应忽略它们(以及空行)

  • 包含关键字的行(最好)只包含关键字。至少,关键字必须是出现在那里的第一个单词

我已经实现了该框架的部分内容,但我觉得到目前为止我的方法是相当临时的。目前,我已经为每个节/主关键字手动创建了一个方法,该程序的第一个任务是扫描文件以查找这些关键字,并将必要的信息传递给这些方法

我首先使用
std::ifstream
对象扫描文件,删除空行和/或注释行,并将剩余行存储在
std::vector
类型的对象中

您认为这是一种合适的方法吗?

此外,我将每个关键字开始和停止的索引(在两个整数数组中)存储在此向量中。这是对上述方法的输入,它看起来像这样:

bool readMAINKEY(int start, int stop);
现在我已经这样做了,虽然我觉得它不是很优雅,但我想我可以暂时保留它

但是,我觉得我需要一种更好的方法来处理每个部分的内部阅读,我的主要问题是我应该如何在这里存储关键字?它们应该作为数组存储在输入类的本地名称空间中,还是作为类中的静态变量存储?还是应该在相关功能中本地定义它们?我应该使用枚举吗?问题很多

现在我已经开始在每个
readMAINKEY()
方法中本地定义子关键字,但我发现这并不是最优的。理想情况下,我希望在这些方法中尽可能多地重用代码,调用一个通用的
readSECTION()
方法,而我目前的方法似乎会导致大量代码重复,并可能导致编程错误。我想最明智的做法是删除所有(目前有8个)不同的
readMAINKEY()
方法,并使用相同的函数处理所有类型的关键字。也有可能有子关键字等(即更通用的嵌套方法),因此我认为这可能是一种方法,但我不确定如何最好地实现它

  • 一旦我在“底层”处理了一个关键字,程序将根据实际关键字预期以下行的特定格式。原则上,每个关键字的处理方式都会有所不同,但在这里,通过定义不同的“类型”关键字(取决于程序在触发读取关键字后希望执行的操作),也有可能实现一些代码重用。常见任务包括解析整数或双数组,但原则上它可以是任何东西

  • 如果由于某种原因无法正确处理关键字,程序应尽量使用默认值,而不是终止程序(如果合理),但应将错误消息写入日志文件。对于可选关键字,当然也将使用默认值

因此,为了总结,我的主要问题如下:

1。您认为我在
std::vector
中存储相关行的方法合理吗?

这当然需要我做大量的“索引工作”,以跟踪不同关键字在向量中的位置。或者我应该更“直接”地处理原始
std::ifstream
对象吗?还是别的什么

2。考虑到这样一个存储文本文件行的向量,我如何才能最好地检测关键字并开始读取它们后面的信息?

在这里,我需要考虑可能的排序以及是否需要关键字。此外,我需要检查每个“底层”关键字后面的行是否符合每种情况下的预期格式

我的一个想法是根据关键字是否可选(或者可能使用类型为
std::map
)的对象,将其存储在不同的容器中,然后如果处理正确,将其从容器中删除,但我不确定该如何做

我想有一千种不同的方法可以回答这些问题,但如果有经验的人能分享一些关于如何继续的想法,我将不胜感激。例如,是否有一种“标准”的方式来做这些事情?当然,很多细节也将取决于conc