Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Операционные системы > Linux (Ubuntu, Debian, Red Hat, CentOS, Mint)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2018, 13:21   #1
Alexis_777
Пользователь
 
Регистрация: 08.11.2017
Сообщений: 48
По умолчанию Распараллеливание процессов: реализовать инвертирование содержимого файлов из нескольких подкаталогов

Добрый день нужно реализовать программу инвертирования содержимого файлов из нескольких подкаталогов (каждый процесс работает со своим файлом и наверно ещё при создании нового каталога нужен процесс) двумя параллельными алгоритмами:
1) с использованием сигналов и очереди сообщений;
2) с использованием семафоров и разделяемой памяти.
Читал теорию, но как делать не понял. Буду рад любой помощи)
Сама программа:
Код:
#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
 
void reverseFile(fs::path pfile, fs::path const& pdir)
{
    std::fstream ifs(pfile, std::ios::in), ofs(pdir / pfile.filename(), std::ios::out);
    if (ifs.is_open() && ofs.is_open())
    {
        std::string str{ std::istreambuf_iterator<char>{ifs.rdbuf()}, {} };
        std::reverse_copy(str.begin(), str.end(), std::ostreambuf_iterator<char>(ofs));
    }
    else
    {
        std::cerr << "Unable to open file(s): " << pfile << "  " << pdir / pfile.filename() << "\n\n";
    }
    ifs.close();
    ofs.close();
}
 
// создаём путь папки в каталоге с инвертированными файлами
fs::path newPath(fs::path const& oldPth, fs::path const& pd1, fs::path const& pd2)
{
    fs::path 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::path pd1("C:\\dir1"); // каталог с исходными файлами
        fs::path 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;
    }
}
Alexis_777 вне форума Ответить с цитированием
Старый 01.05.2018, 13:42   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

http://www.programmersforum.ru/showthread.php?t=319476
p51x на форуме Ответить с цитированием
Старый 13.05.2018, 20:07   #3
Alexis_777
Пользователь
 
Регистрация: 08.11.2017
Сообщений: 48
По умолчанию

Если кто-то знает как это сделать напишите хотя бы самую простую реализую чтобы было понятно как это делать( Хотя бы распараллелить инвертирование файла.
Код:
#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
 
void reverseFile(fs::path pfile, fs::path const& pdir)
{
    std::fstream ifs(pfile, std::ios::in), ofs(pdir / pfile.filename(), std::ios::out);
    if (ifs.is_open() && ofs.is_open())
    {
        std::string str{ std::istreambuf_iterator<char>{ifs.rdbuf()}, {} };
        std::reverse_copy(str.begin(), str.end(), std::ostreambuf_iterator<char>(ofs));
    }
    else
    {
        std::cerr << "Unable to open file(s): " << pfile << "  " << pdir / pfile.filename() << "\n\n";
    }
    ifs.close();
    ofs.close();
}

 
int main()
{
    try
    {
        fs::path pd1("C:\\dir1"); // каталог с исходными файлами
        fs::path 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)); 
            }
        }
    }
    catch (std::exception const& exc)
    {
        std::cerr << "Exception: " << exc.what() << std::endl;
    }
}

Последний раз редактировалось Alexis_777; 13.05.2018 в 20:11.
Alexis_777 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Распараллеливание процессов Alexis_777 Общие вопросы C/C++ 0 30.04.2018 21:26
Распараллеливание процессов Walanter Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 05.03.2012 22:02
(Си / Линукс) Вывод содержимого каталога и всех его подкаталогов ddima Помощь студентам 0 26.03.2011 23:26
Распараллеливание процессов Zooleen Общие вопросы C/C++ 0 16.06.2010 16:59
копирование файлов из подкаталогов cemen13 Win Api 15 25.09.2009 17:55