3

我有一个包含多个描述文件的目录,并希望将信息存储在地图中以供以后用于实现包管理器。

显然,我正确读取了文件,但是当我尝试过滤信息时,有些东西会丢失。在大多数情况下,最后一行被截断,所以当最后一个关键字是%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只有一个依赖项,因为它似乎切断了每个文件的最后一行。毕竟,还有其他一些依赖项不止一个,而最后一个总是丢失。

目前,我从向量的后面开始,然后将元素 push_back 放入part_lines,直到找到关键字。然后我将带有向量的关键字插入到我的地图中。

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

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

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

希望有人可以帮助我。

4

0 回答 0