Программа читает все файлы из переданной в аргументе папки, и если содержимое файла корректно(в файле должно быть только одно целое число), то она выводит имя файла и число. Проверка на корректность выполняется с помощью
check()
. Вся логика находится в
file_handle()
для того чтобы попытаться обрабатывать файлы в несколько потоков. Если
check()
возвращает
false
, то я пытаюсь закинуть имя "плохого" файла в вектор, но этот вектор всегда пустой получается. В чем может быть проблема? Спасибо.
#include<iostream>
#include<fstream>
#include<sstream>
#include<string>
#include<vector>
#include<iomanip>
#include<regex>
#include<boost/filesystem.hpp>
#include<future>
#include<thread>
#include<chrono>
using std::cout;
using std::endl;
using namespace boost::filesystem;
inline auto check(const std::string &s)
{
std::regex reg1("[[:blank:]]*[-[:digit:]]*[[:blank:]]*", std::regex_constants::ECMAScript);
return regex_match(s, reg1);
}
auto file_handle(directory_entry &dir,std::vector<std::string> &v)
{
std::ifstream is;
is.open(dir.path().string());
std::stringstream buf;
buf << is.rdbuf();
auto temp = buf.str();
if(!check(temp))
{
//cout <<"wrong file: "<< dir.path().filename().string() << endl;
v.push_back(dir.path().filename().string());
is.clear();
is.close();
return 0;
}
cout.setf(std::ios::left, std::ios::adjustfield);
cout << std::setw(20) << dir.path().filename().string() << " : " << std::stoi(temp) << endl;
is.clear();
is.close();
std::this_thread::sleep_for(std::chrono::seconds(1));
return std::stoi(temp);
}
int main(int argc, char *argv[])
{
setlocale(LC_ALL, "");
int sum{};
std::vector<std::string> vname {};
std::ifstream file;
if (argc < 2)
{
cout << "usage: prog path" << endl;
return 1;
}
boost::filesystem::path p(argv[1]);
if (!boost::filesystem::is_directory(p))
{
cout << "not a directory!";
return 1;
}
for (auto &el : boost::filesystem::directory_iterator(p))
{
if (!boost::filesystem::is_directory(el))
{
std::future<int> result(std::async(std::launch::async,file_handle, el,vname));
sum += result.get();
}
}
cout << "Sum: " << sum << endl;
//out << "Files with wrong input data: \n";
cout << std::boolalpha << vname.empty() << endl;
//boost::copy(vname, std::ostream_iterator<std::string>(cout, "\n"));
}