C++로 폴더 아래의 파일 일람을 가져와 같은 그룹의 그림 (파일 이름으로 판별) 을 정렬합니다.

12188 단어 vectorC++
시작하다
학창시절에는 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차원 그룹으로 그룹을 출력합니다.

좋은 웹페이지 즐겨찾기