@SaddledSharp
Кодер. Увлекаюсь информационной безопасностью.

Отсортировать только файлы, среди всех элементов в папке, в новый массив\вектор. Как сделать?

Всем привет. Есть код:
cout << "\n\tEnter directory: ";
	string dir = "";
	getline(cin, dir);
	
	char buffer[128];
	string result = "";
	FILE* pipe = _popen(("dir /b " + dir).c_str(), "r");
	if (!pipe) throw std::runtime_error("popen() failed!");
	try {
		while (fgets(buffer, sizeof buffer, pipe) != NULL) {
			result += buffer;
		}
	}
	catch (...) {
		_pclose(pipe);
		throw;
	}
	_pclose(pipe);
	
	vector<string> arr;
	string delim("\n");
	size_t prev = 0;
	size_t next;
	size_t delta = delim.length();

	while ((next = result.find(delim, prev)) != string::npos) {
		string tmp = result.substr(prev, next - prev);
		arr.push_back(result.substr(prev, next - prev));
		prev = next + delta;
	}
	string tmp = result.substr(prev);
	arr.push_back(result.substr(prev));


В переменной result хранятся элементы в папке. В arr хранятся те же найденные элементы с помощью dir /b только они разделены на подстроки и внесены в массив. Мне нужно их отсортировать и занести в другой массив только те строки, в которых есть символ\строка "." (точка), то есть файлы. Помогите
  • Вопрос задан
  • 40 просмотров
Решения вопроса 1
myjcom
@myjcom Куратор тега C++
Как сделать? Помогите

#include<filesystem>
#include<iostream>
#include<vector>
#include<string>
#include<iterator>
using namespace std;
namespace fs = experimental::filesystem;

vector<string> getFilenamesFromDir(const string& dir)
{
  vector<string> filenames;
  if(fs::exists(dir))
  {
    for(auto& entry : fs::directory_iterator(dir))
    {
      if(!fs::is_directory(entry.path()))
      {
        filenames.push_back(entry.path().filename().string());
      }
    }
  }
  return filenames;
}

int main()
{
  string dirname;
  cout << "Enter directory: ";
  getline(cin, dirname);

  auto files = getFilenamesFromDir(dirname);

  if(!files.empty())
  {
    sort(files.begin(), files.end());
    copy(files.cbegin(), files.cend(), ostream_iterator<string>(cout, "\n"));
  }
  cin.get();
}

Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы