我有一个包含多个描述文件的目录,并希望将信息存储在地图中以供以后用于实现包管理器。
显然,我正确读取了文件,但是当我尝试过滤信息时,有些东西会丢失。在大多数情况下,最后一行被截断,所以当最后一个关键字是%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 该元素,然后将信息插入到地图中。
两种尝试似乎都切断了最后一个元素,因此问题可能出在其他地方。
这是第一次在这里提问,所以我不知道我在解释我的问题到底是什么方面做得很好,希望我提供了足够的信息和相关的代码片段。
希望有人可以帮助我。