这可能是一个哲学问题,但我正在审查一位以前的工程师的代码,并且想知道什么时候是阅读 ini 文件的最佳时间。当前应用程序每次需要一个值时都会重新读取ini文件,并在每次更改时写入数据。在我看来,一个更好的解决方案是读/写一次并将信息存储在内存中。我错过了什么吗?ini 文件中有大约 40 个条目。
工程师也做了自己的班级,难道没有现有的班级可以做到这一点吗?
这可能是一个哲学问题,但我正在审查一位以前的工程师的代码,并且想知道什么时候是阅读 ini 文件的最佳时间。当前应用程序每次需要一个值时都会重新读取ini文件,并在每次更改时写入数据。在我看来,一个更好的解决方案是读/写一次并将信息存储在内存中。我错过了什么吗?ini 文件中有大约 40 个条目。
工程师也做了自己的班级,难道没有现有的班级可以做到这一点吗?
默认情况下,我会在启动时读取一次配置,不仅在 CE 上,而且在任何其他系统上也会这样做。如果我希望能够对配置中的更改做出反应,我希望重新加载是明确的,例如向程序发送信号。在 CE 下缺少信号,您可以使用命名事件或询问用户是否有 UI。缺少所有这些,我会定期检查文件的时间戳并在更改时重新加载文件,但仍会在内存中保留一份副本。
不对单个值打开-读取-关闭文件的原因是,有时两个值具有依赖关系,如果这样做,您可能会将旧值和新值放入内存,从而导致不一致。此外,在实际开始使用之前,我会验证配置的完整性。也就是说,仅仅为了读取单个配置值而访问硬盘也是非常低效的。
关于更改的编写,我会根据用户的明确要求或在接受更改后自动进行。不过,出于与不读取单个值相同的原因,我会尽量避免写入单个值。
最后,INI 文件已被声明为过时,因此 CE 不支持用于读取和写入它们的 win32 API。这就解释了为什么有人滚动他们自己的类来读写这些文件。MS 希望您改用注册表,因为它提供并支持 API。我不太同意这里的 MS,因为文本配置文件(不是必需的 INI 文件)提供了一些注册表没有的功能,例如使用现有文本工具的能力。
您可以使用Boost.PropertyTree库来读取和写入 INI 文件。
这是读取 INI 文件、修改并保存它的示例代码:
#include <iostream>
#include <string>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>
/*
[owner]
name=John Doe
organization=Acme Widgets Inc.
*/
int main(int ac, char* av[])
{
boost::property_tree::ptree pt;
// Read
read_ini("data.ini", pt);
std::cout << pt.get<std::string>("owner.name") << std::endl; // John Doe
std::cout << pt.get<std::string>("owner.organization") << std::endl; // Acme Widgets Inc.
// Write
pt.put<std::string>("owner.name", "New Name");
pt.put<std::string>("owner.name", "New Organization");
write_ini("date2.ini", pt);
return 0;
}
注意:在 Windows CE 上编译此代码时,您可能需要调整 Boost.PropertyTree 库。Windows CE 的标准 C++ 库似乎没有<locale>
标题,而 Boost.PropertyTree 在读取和写入 INI 文件时使用它。