Сортировка списка каталогов с использованием сопоставления с регулярным выражением - PullRequest
1 голос
/ 13 июля 2011

Я виновен в использовании следующего фрагмента кода с использованием boost-filesystem и boost-regexp для получения абсолютного пути + имен файлов из каталога, введенного в качестве аргумента.

Где input_dir - это переменная, содержащая аргумент из командной строки, обозначающий имя каталога, который необходимо пройти,

  string dir_abs_name = "./" + input_dir;
  string file_abs_name;
  path current_dir(dir_abs_name);
  boost::regex pattern("m.*"); // list all files starting with m

  for (directory_iterator iter(current_dir),end; iter!=end; ++iter) {
    string name = iter->path().leaf();
    if (regex_match(name, pattern)) {
      file_abs_name = dir_abs_name + name;
      input_file = str_to_char(file_abs_name); // my own function that converts string to char* (needed that for another method later on in the code)

      std::cout << "--> considering file " << input_file << "... \n";
    }
  }

Теперь я столкнулся с проблемой, что список не в алфавитном порядке. Я получаю случайные совпадения, а не в определенном порядке. Есть ли способ применить этот алфавитный порядок?

Спасибо.

РЕДАКТИРОВАТЬ: Стоит отметить, что в программе я иногда работаю только над подмножеством всего списка файлов в каталоге. Я делаю это, когда передаю аргумент, чтобы сделать выбор, скажем, только 4 файла из 1000 в каталоге. Их можно отсортировать после получения списка ... но поиск по-прежнему остается случайным.

1 Ответ

3 голосов
/ 13 июля 2011

Почему бы не кэшировать результаты, скажем, (std :: vector), отсортировать вектор, а затем выполнить итерацию по отсортированному вектору для выполнения обработки?

Например:

string dir_abs_name = "./" + input_dir;
string file_abs_name;   
path current_dir(dir_abs_name);   
boost::regex pattern("m.*"); // list all files starting with m
std::vector<std::string> accumulator;
for (directory_iterator iter(current_dir),end; iter!=end; ++iter) {     
    string name = iter->path().leaf();
    if (regex_match(name, pattern)) {
       file_abs_name = dir_abs_name + name; 
       accumulator.push_back(file_abs_name);
    }   
}
std::sort(accumulator.begin(), accumulator.end());
std::vector<std::string>::iterator iter;
for (iter = accumulator.begin(); iter != accumulator.end(); ++iter) {
    char* input_file = str_to_char(*iter); // my own function that converts string to char* (needed that for another method later on in the code)                            
    std::cout << "--> considering file " << input_file << "... \n"; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...