Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

Добрый день нужно реализовать программу инвертирования содержимого файлов из нескольких подкаталогов (каждый процесс работает со своим файлом и наверно ещё при создании нового каталога нужен процесс) двумя параллельными алгоритмами:
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, 14:42   #2
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 11,091
Репутация: 1862

icq: 216409213
По умолчанию

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

Если кто-то знает как это сделать напишите хотя бы самую простую реализую чтобы было понятно как это делать( Хотя бы распараллелить инвертирование файла.
Код:

#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 в 21:11.
Alexis_777 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Распараллеливание процессов Alexis_777 Общие вопросы C/C++ 0 30.04.2018 22:26
Распараллеливание процессов Walanter Assembler 3 05.03.2012 22:02
(Си / Линукс) Вывод содержимого каталога и всех его подкаталогов ddima Помощь студентам 0 27.03.2011 00:26
Распараллеливание процессов Zooleen Общие вопросы C/C++ 0 16.06.2010 16:59
копирование файлов из подкаталогов cemen13 Win Api 15 25.09.2009 17:55


23:24.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru