複数の記述ファイルを含むディレクトリがあり、その情報をマップに保存して、後でパッケージ マネージャーを実装するために使用したいと考えています。
ファイルを正しく読み取ったようですが、情報をフィルタリングしようとすると、いくつかの情報が失われます。ほとんどの場合、最後の行が途切れてしまうため、最後のキーワードが%DEPENDS%
で、情報が 1 つしかない場合、依存関係マップでそのファイルを見つけることができません。
記述ファイルは次のようになります。
%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"}}
}
私は多かれ少なかれ次のように見えるユーティリティクラスを持っています:
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;
...
}
すべての情報を取得するには、2 つの方法があります。1 つはすべてのファイルを読み取り、情報を 1 行ずつベクトルに格納する方法で、もう 1 つは指定されたベクトルからマップを作成し、関連情報を に格納する方法です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
すべてのファイルの最後の行が切り取られているように見えるため、依存関係が 1 つしかないことに気付きました。結局のところ、複数の依存関係を持つものもあり、最後の 1 つが常に欠落しています。
現在、ベクターの後ろから始めてpart_lines
、キーワードに到達するまで要素を push_back します。次に、ベクターを含むキーワードをマップに挿入します。
最初からベクトルを反復してみました。そのため、最初にキーを見つけ、次のキーを見つけたら、まず情報をマップに挿入し、新しいキーワードを定義してベクトルをクリアします。最後の要素にいる場合は、その要素をプッシュバックしてから、情報をマップに挿入します。
どちらの試みも最後の要素を切り取っているように見えるため、問題は別の場所にある可能性があります。
ここで質問するのはこれが初めてなので、私の問題を正確に説明できたかどうかわかりません。十分な情報と関連するコード スニペットを提供していただければ幸いです。
うまくいけば、誰かが私を助けてくれます。