C++ 通过扫描关键字读取文本文件
作为一个更大应用程序的一部分,我正在开发一个类,用于从文本文件中读取输入,以用于程序的初始化。现在我对编程相当熟悉,我在十二月才开始学习C++,所以我非常感谢一些关于如何开始的提示和想法。我为一长串的文字提前道歉 文本文件格式为“关键字驱动”,其方式如下:C++ 通过扫描关键字读取文本文件,c++,string,file-io,io,ifstream,C++,String,File Io,Io,Ifstream,作为一个更大应用程序的一部分,我正在开发一个类,用于从文本文件中读取输入,以用于程序的初始化。现在我对编程相当熟悉,我在十二月才开始学习C++,所以我非常感谢一些关于如何开始的提示和想法。我为一长串的文字提前道歉 文本文件格式为“关键字驱动”,其方式如下: 有相当少的主/部分关键字(目前为8个)需要按给定顺序编写。其中一些是可选的,但如果包括它们,则应遵循给定的顺序 示例: 假设有3个潜在关键字,按如下顺序排列: "KEY1" (required) "KEY2" (optional) "KE
- 有相当少的主/部分关键字(目前为8个)需要按给定顺序编写。其中一些是可选的,但如果包括它们,则应遵循给定的顺序
"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()
方法,并使用相同的函数处理所有类型的关键字。也有可能有子关键字等(即更通用的嵌套方法),因此我认为这可能是一种方法,但我不确定如何最好地实现它
- 一旦我在“底层”处理了一个关键字,程序将根据实际关键字预期以下行的特定格式。原则上,每个关键字的处理方式都会有所不同,但在这里,通过定义不同的“类型”关键字(取决于程序在触发读取关键字后希望执行的操作),也有可能实现一些代码重用。常见任务包括解析整数或双数组,但原则上它可以是任何东西
- 如果由于某种原因无法正确处理关键字,程序应尽量使用默认值,而不是终止程序(如果合理),但应将错误消息写入日志文件。对于可选关键字,当然也将使用默认值
std::vector
中存储相关行的方法合理吗?
这当然需要我做大量的“索引工作”,以跟踪不同关键字在向量中的位置。或者我应该更“直接”地处理原始std::ifstream
对象吗?还是别的什么
2。考虑到这样一个存储文本文件行的向量,我如何才能最好地检测关键字并开始读取它们后面的信息?
在这里,我需要考虑可能的排序以及是否需要关键字。此外,我需要检查每个“底层”关键字后面的行是否符合每种情况下的预期格式
我的一个想法是根据关键字是否可选(或者可能使用类型为std::map
)的对象,将其存储在不同的容器中,然后如果处理正确,将其从容器中删除,但我不确定该如何做
我想有一千种不同的方法可以回答这些问题,但如果有经验的人能分享一些关于如何继续的想法,我将不胜感激。例如,是否有一种“标准”的方式来做这些事情?当然,很多细节也将取决于conc