解析描述文件并将信息存储在地图中

问题描述

我有一个包含多个描述文件的目录,我想将信息存储在一个映射中,以便稍后用于实现包管理器。

显然,我正确读取了文件,但是当我尝试过滤信息时,有些东西丢失了。在大多数情况下,最后一行会被截断,因此当最后一个关键字是 %DEPENDS% 并且它只有一个信息时,我在我的依赖关系图中找不到该文件

描述文件如下所示:

%FILENAME%
zlib-1:1.2.11-4-x86_64.pkg.tar.xz

%NAME%
zlib

%BASE%
zlib

%VERSION%
1:1.2.11-4

%DESC%
Compression library implementing the deflate compression method found in gzip and PKZIP

%CSIZE%
83444

%ISIZE%
341567

%MD5SUM%
954e931d4bb8a1f1f2847b5fa07bf5da

%sHA256SUM%
43a17987d348e0b395cb6e28d2ece65fb3b5a0fe433714762780d18c0451c149

%PGPSIG%
iQEzBAABCAAdFiEEhs/8qRjPOvRxR1iAUeixSKmZnDQFAl3MRDoACgkQUeixSKmZnDTrWwgAjFovNb203v52oTBXrSxDoWFoCn9uEFfDVpXh/WWAsor5aEtqO8cHqeVUW+ttJdX4Zr0ETz9IVykFCuw5AixE6JSuVm7CIzKdR4JzzIwlU4Es0WDEG8gXAe9i+F8tgluF92PhiCjxNFmBsdKFS5ISz9wAqdCAUoB+N1yWSeraz7NHkM5urdvnpYVReq9/TOrkjZrJzU45g9y1iuw/ZlpMO53LbsXwuiBE4EufQKEHKF5OgcrSBC4DRUliI9aI65jQ+a0unrxFb+bRjZDOIp1lEBbChQg4BIcE8YtNCIRDb6ztAMfoTOirdbJdbnrAjbIjZcPcvAHoz//vBRkkwCSADA==

%URL%
https://www.zlib.net/

%LICENSE%
custom

%ARCH%
x86_64

%BUILDDATE%
1573667866

%PACKAGER%
Evangelos Foutras <evangelos@foutrelis.com>

%DEPENDS%
glibc

我想将所有信息存储在地图中,所以我有这样的东西:

std::map<std::string,std::vector<std::string>> data = {
    {"FILENAME",{"zlib-1:1.2.11-4-x86_64.pkg.tar.xz"}},{"NAME",{"zlib"}},...,{"DEPENDS",{"glibc"}}
}

我有一个 util 类,看起来或多或少是这样的:

struct util
{
    std::string path;

    std::map<std::string,std::string> pkg_version;
    std::map<std::string,std::vector<std::string>> pkg_dependencies;
    std::map<std::string,std::vector<std::string>> pkg_virtual;
    std::map<std::string,std::vector<std::string>> pkg_conflicts;

    ...
}

我有两种方法可以获取所有信息。 一种读取所有文件并将信息逐行存储在向量中,另一种方法是从给定向量构造映射并将相关信息存储在 pkg_dependencies 中。第一个实际上是我的util类的构造函数

util::util(std::string path_) :
    path(path_)
{
    for (const auto& dir_entry : std::filesystem::directory_iterator(path_))
    {
        std::string dir_path = dir_entry.path().string();

        for (const auto& file_entry : std::filesystem::directory_iterator(dir_path))
        {
            std::string file_path = file_entry.path().string();
            std::ifstream desc(file_path);

            std::vector<std::string> content;
            std::string line;

            while (getline(desc,line))
            {
                if (line.size())
                {
                    content.push_back(line);
                }
            }

            desc.close();
            parse_desc(content);
        }
    }
}

void util::parse_desc(std::vector<std::string> content)
{
    std::string marker = "%";

    std::map<std::string,std::vector<std::string>> mp;

    std::string key;
    std::vector<std::string> part_lines;

    for (int i = content.size() - 1; i >= 0; --i)
    {
        bool check_front = content[i].substr(0,1).compare(marker) == 0;
        bool check_back = content[i].substr(content[i].size() - 1,content[i].size()).compare(marker) == 0;
        if (check_front && check_back)
        {
            key = content[i].substr(1,content[i].size() - 2);
            mp.insert(std::make_pair(key,part_lines));
            part_lines.clear();
        }

        else
        {
            part_lines.push_back(content[i]);
        }
        }

    ...

    if (mp.find("DEPENDS") != mp.end() && !(mp.find("DEPENDS")->second).empty())
    {
        pkg_dependencies.insert(std::make_pair(name,mp.find("DEPENDS")->second));
    }

    ...

}

然而在这个带有 zlib 的例子中,它不能在 pkg_dependencies 中找到。我注意到 zlib 只有一个依赖项,因为它似乎切断了每个文件的最后一行。毕竟,还有一些依赖不止一种,而最后一种总是缺失。

目前,我从向量的后面开始,将元素推回到 part_lines 中,直到到达关键字为止。然后我将带有矢量的关键字插入到我的地图中。

我尝试从一开始就迭代向量。所以我首先找到我的密钥,当我找到下一个时,我首先将我的信息插入到地图中,然后定义我的新关键字并清除向量。如果我在最后一个元素,push_back 该元素,然后将信息插入到地图中。

两次尝试似乎都切断了最后一个元素,所以问题可能出在其他地方。

这是第一次在这里提问,所以我不知道我在解释我的问题究竟是什么方面做得很好,希望我提供了足够的信息和相关的代码片段。

希望有人能帮助我。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...