Alexis777 » 14 май 2018, 19:06
Добрый день помогите реализовать программу инвертирования содержимого файлов из нескольких подкаталогов (каждый процесс работает со своим файлом) двумя параллельными алгоритмами:
1) с использованием сигналов и очереди сообщений;
2) с использованием семафоров и разделяемой памяти.
Читал теорию, но как делать не понял. Буду рад любой помощи)
Вот теория, если кто захочет помочь)
https://ru.files.fm/u/bz5m36xf#_
Саму программу сделал:
Код: Выделить всё
#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
void reverseFile(fs: :p ath pfile, fs: :p ath const& pdir)
{
std::fstream ifs(pfile, std::ios::in), ofs(pdir / pfile.filename(), std::ios: :o ut);
if (ifs.is_open() && ofs.is_open())
{
std::string str{ std::istreambuf_iterator<char>{ifs.rdbuf()}, {} };
std::reverse_copy(str.begin(), str.end(), std: :o streambuf_iterator<char>(ofs));
}
else
{
std::cerr << "Unable to open file(s): " << pfile << " " << pdir / pfile.filename() << "\n\n";
}
ifs.close();
ofs.close();
}
// создаём путь папки в каталоге с инвертированными файлами
fs: :p ath newPath(fs: :p ath const& oldPth, fs: :p ath const& pd1, fs: :p ath const& pd2)
{
fs: :p ath ret = pd2;
auto pr = std::mismatch(oldPth.begin(), oldPth.end(), pd1.begin(), pd1.end());
for (auto ib(pr.first), ie(oldPth.end()); ib != ie; ++ib)
{
ret /= *ib;
}
return ret;
}
int main()
{
try
{
fs: :p ath pd1("C:\\dir1"); // каталог с исходными файлами
fs: :p ath pd2("C:\\dir2"); // каталог с инвертированными файлами
if (!fs::exists(pd2))
{
fs::create_directories(pd2); // может кинуть исключение
}
for (fs::recursive_directory_iterator ib(pd1), ie; ib != ie; ++ib) // перебираем все файлы в dir 1
{
if (fs::is_regular_file(ib->path())) // инвертируем каждый файл
{
reverseFile(ib->path(), newPath(ib->path(), pd1, pd2));
}
else if (fs::is_directory(ib->path())) // создаём папку в каталоге с инвертированными файлами
{
fs::create_directory(newPath(ib->path(), pd1, pd2));
}
}
}
catch (std::exception const& exc)
{
std::cerr << "Exception: " << exc.what() << std::endl;
}
}
Всем заранее спасибо за помощь)
Добрый день помогите реализовать программу инвертирования содержимого файлов из нескольких подкаталогов (каждый процесс работает со своим файлом) двумя параллельными алгоритмами:
1) с использованием сигналов и очереди сообщений;
2) с использованием семафоров и разделяемой памяти.
Читал теорию, но как делать не понял. Буду рад любой помощи)
Вот теория, если кто захочет помочь) [url=https://ru.files.fm/u/bz5m36xf#_]https://ru.files.fm/u/bz5m36xf#_[/url]
Саму программу сделал:
[code]#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
void reverseFile(fs: :p ath pfile, fs: :p ath const& pdir)
{
std::fstream ifs(pfile, std::ios::in), ofs(pdir / pfile.filename(), std::ios: :o ut);
if (ifs.is_open() && ofs.is_open())
{
std::string str{ std::istreambuf_iterator<char>{ifs.rdbuf()}, {} };
std::reverse_copy(str.begin(), str.end(), std: :o streambuf_iterator<char>(ofs));
}
else
{
std::cerr << "Unable to open file(s): " << pfile << " " << pdir / pfile.filename() << "\n\n";
}
ifs.close();
ofs.close();
}
// создаём путь папки в каталоге с инвертированными файлами
fs: :p ath newPath(fs: :p ath const& oldPth, fs: :p ath const& pd1, fs: :p ath const& pd2)
{
fs: :p ath ret = pd2;
auto pr = std::mismatch(oldPth.begin(), oldPth.end(), pd1.begin(), pd1.end());
for (auto ib(pr.first), ie(oldPth.end()); ib != ie; ++ib)
{
ret /= *ib;
}
return ret;
}
int main()
{
try
{
fs: :p ath pd1("C:\\dir1"); // каталог с исходными файлами
fs: :p ath pd2("C:\\dir2"); // каталог с инвертированными файлами
if (!fs::exists(pd2))
{
fs::create_directories(pd2); // может кинуть исключение
}
for (fs::recursive_directory_iterator ib(pd1), ie; ib != ie; ++ib) // перебираем все файлы в dir 1
{
if (fs::is_regular_file(ib->path())) // инвертируем каждый файл
{
reverseFile(ib->path(), newPath(ib->path(), pd1, pd2));
}
else if (fs::is_directory(ib->path())) // создаём папку в каталоге с инвертированными файлами
{
fs::create_directory(newPath(ib->path(), pd1, pd2));
}
}
}
catch (std::exception const& exc)
{
std::cerr << "Exception: " << exc.what() << std::endl;
}
}[/code]
Всем заранее спасибо за помощь)