C++로 폴더 아래의 파일 일람을 가져와 같은 그룹의 그림 (파일 이름으로 판별) 을 정렬합니다.
학창시절에는 OpenCV를 이용한 화상처리 시스템 연구를 통해 당시 제작된 C++ 함수를 공유했다.
또한 C++로 폴더 아래의 파일 일람을 가져오는 방법은 아래의 Qita에 기재되어 있으니 참조하십시오.
C++로 폴더 아래의 파일 목록 가져오기
환경: Visual Studio 2017
2 하고 싶은 일
폴더 아래의 파일 일람을 얻으려면 같은 그룹의 그림 (파일 이름으로 판별) 을 모아서 배열하십시오.
3 소스 코드
GroupingImage.cpp
#define SAME_GROUP 0 /* 同じグループ(memcmpで文字列一致した) */
/**
* @brief フォルダ以下の同じグループの画像をまとめる関数
* 画像の命名規則: xx.yy.拡張子(xxを同じグループの場合は同一にする)
* @param[in] folderPath フォルダパス
* @param[out] fileGroups 同じグループの画像をまとめた配列
* @return true:成功, false:失敗
* @detail
*/
bool getImageGroups(std::string folderPath, std::vector< std::vector<std::string> >& imageGroups)
{
bool result = false; /* 処理結果 */
std::vector<std::string> fileNames; /* フォルダ内にあるファイル一覧 */
/* フォルダパス以下にあるファイル一覧を取得する */
result = getFileNames(folderPath, fileNames);
/* ファイル一覧の取得に失敗した場合はfalseを返す */
if (result == false) {
return false;
}
/* ファイル一覧から同じグループのファイルを動的配列にまとめる
* 画像の命名規則: xx.yy.拡張子とし、xxを判別用パスとする
* 判別用パスが同一なら同じグループの画像である
*/
const std::string distinction = "."; /* 判別用文字 */
std::vector<std::string>::iterator it = fileNames.begin();
while (it != fileNames.end()){
std::vector<std::string> sameImageGroup; /* 同じ画像のグループ */
std::string searchStr = *it; /* 判別する画像のパス */
size_t searchStrPos = 0; /* 判別用文字の位置 */
/*配列の先頭の画像をグループに追加し、追加した画像はファイル一覧から削除する */
sameImageGroup.push_back(*it);
it = fileNames.erase(it);
/* 判別用文字の位置を取得する */
searchStrPos = searchStr.find(distinction);
/* ファイル一覧から同じグループのものを取得する */
std::vector<std::string>::iterator tempIt = it;
while (tempIt != fileNames.end()){
int result = std::memcmp(searchStr.c_str(), tempIt->c_str(), searchStrPos);
if (result == SAME_GROUP){
/* 同じグループの画像を配列に追加し、ファイル一覧から削除する */
sameImageGroup.push_back(*tempIt);
tempIt = fileNames.erase(tempIt);
/* すでに削除しているイテレータを参照しているため更新する */
it = tempIt;
}
else{
/* 同じグループでない場合はイテレータを進める */
tempIt++;
}
}
/* グループを追加する */
imageGroups.push_back(sameImageGroup);
}
return true;
}
/**
* @brief フォルダ以下のファイル一覧を取得する関数
* @param[in] folderPath フォルダパス
* @param[out] fileNames ファイル名一覧
* return true:成功, false:失敗
*/
bool getFileNames(std::string folderPath, std::vector<std::string> &fileNames)
{
using namespace std::filesystem;
directory_iterator iter(folderPath), end;
std::error_code err;
for (; iter != end && !err; iter.increment(err)){
const directory_entry entry = *iter;
fileNames.push_back( entry.path().string() );
printf("%s\n", fileNames.back().c_str());
}
/* エラー処理 */
if (err){
std::cout << err.value() << std::endl;
std::cout << err.message() << std::endl;
return false;
}
return true;
}
4 출력 결과같은 그룹의 이미지의 경로를 하나의 배열로 통합합니다.그 다음에 그룹에 저장된 2차원 그룹으로 그룹을 출력합니다.
Reference
이 문제에 관하여(C++로 폴더 아래의 파일 일람을 가져와 같은 그룹의 그림 (파일 이름으로 판별) 을 정렬합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tes2840/items/4f049e1da8ce857467ee텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)