Подтвердить что ты не робот

Простой глобус в С++ на unix-системе?

Я хочу получить все соответствующие пути, следующие за этим шаблоном, в vector<string>:

"/some/path/img*.png"

Как я могу это сделать?

4b9b3361

Ответ 1

У меня это в моей сущности. Я создал stl-оболочку вокруг glob, чтобы вернуть вектор строки и позаботиться об освобождении результата glob. Не совсем очень эффективно, но ваш код выглядит более читаемым.

#include <glob.h>
#include <vector>
#include <string>
inline std::vector<std::string> glob(const std::string& pat){
    using namespace std;
    glob_t glob_result;
    glob(pat.c_str(),GLOB_TILDE,NULL,&glob_result);
    vector<string> ret;
    for(unsigned int i=0;i<glob_result.gl_pathc;++i){
        ret.push_back(string(glob_result.gl_pathv[i]));
    }
    globfree(&glob_result);
    return ret;
}

Ответ 2

Вы можете использовать функцию glob() POSIX.

Ответ 3

Я написал простую библиотеку glob для Windows и Linux (возможно, работает и на других * nixes) некоторое время назад, когда я был скучно, не стесняйтесь использовать его, как вам нравится.

Пример использования:

#include <iostream>
#include "glob.h"

int main(int argc, char **argv) {
  glob::Glob glob(argv[1]);
  while (glob) {
    std::cout << glob.GetFileName() << std::endl;
    glob.Next();
  }
}

Ответ 4

Я пробовал решения выше на Centos6, и я узнал, что мне нужно изменить:

int ret = glob(pat.c_str(), 0, globerr, &glob_result);

(где "globerr" - это функция обработки ошибок)

Без явного 0 я получил ошибку "GLOB_NOSPACE".

Ответ 5

Вряд ли http://www.boost.org/doc/libs/release/libs/regex/ является самым близким, которое вы получите. Есть хороший шанс, что это будет поддерживаться в С++ 11.