Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 1
Регистрация: 29.10.2017
Сообщений: 114
1

Инвертирование содержимого файлов из нескольких подкаталогов

10.04.2018, 23:29. Показов 1890. Ответов 15
Метки нет (Все метки)

Как можно сделать инвертирование содержимого файлов из нескольких подкаталогов? Это первая часть, потом нужно ещё сделать с потоками (тут вообще непонятно как разделить) и каждый поток работает со своим файлом.
Есть наработки. Тут инвертирование одного файла в другой, а вот как сделать чтобы можно было весь каталог инвертировать в другой? Можно сделать как на си так и на с++.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<vector>
#include <iterator>
#include <algorithm>
#include <string>
 
using namespace std;
 
int main()
{
    ifstream cin("123.txt");
    ofstream cout("21.txt");
    vector<string> v;
    string str;
    while (getline(cin, str))
    {
        v.push_back(str);
    }
    for (vector<string>::const_reverse_iterator it = v.rbegin(); it != v.rend(); ++it) {
        reverse_copy(it->begin(), it->end(), ostream_iterator<char>(cout));
        cout << endl;
    }
    return 0;
}
0
Заказывайте контрольные, курсовые и дипломы здесь.
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.04.2018, 23:29
Ответы с готовыми решениями:

Распараллеливание процессов: реализовать инвертирование содержимого файлов из нескольких подкаталогов
Добрый день нужно реализовать программу инвертирования содержимого файлов из нескольких...

Распараллеливание процессов: реализовать инвертирование содержимого файлов из нескольких подкаталогов
Добрый день нужно реализовать программу инвертирования содержимого файлов из нескольких...

Потоки инвертирование содержимого файлов
Как можно сделать инвертирование содержимого файлов из нескольких подкаталогов? Это первая часть,...

Поиск файлов по определённой маске в указанной папке без учёта содержимого её подкаталогов
Всем привет. Встала очередная задача, не могу самостоятельно разобраться. Ниже выложен код,...

15
2226 / 1729 / 865
Регистрация: 21.12.2010
Сообщений: 3,073
Записей в блоге: 11
11.04.2018, 08:21 2
Лучший ответ Сообщение было отмечено Alexis_777 как решение

Решение

Цитата Сообщение от Alexis_777 Посмотреть сообщение
каждый поток работает со своим файлом
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
#include <fstream>
#include <thread>
#include <string>
#include <vector>
#include <utility>
#include <algorithm>
#include <iterator>
#include <mutex>
#include <filesystem>
namespace fs = std::experimental::filesystem;
 
std::mutex mxCerr;
 
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::vector<std::string> vct;
        std::string str;
        while (std::getline(ifs, str))
        {
            vct.emplace_back(std::move(str));
        }
        std::reverse_copy(vct.begin(), vct.end(), std::ostream_iterator<std::string>(ofs, "\n"));
        
        ifs.close();
        ofs.close();
 
    }
    else
    {
        std::unique_lock<std::mutex> ul(mxCerr);
        std::cerr << "Unable to open file(s): " << pfile << "  " << pdir / pfile.filename() << "\n\n";
    }
}
 
int main()
{
    try
    {
        fs::path pd1("c:\\dir 1"); // каталог с исходными файлами
        fs::path pd2("c:\\dir 2"); // каталог с инвертированными файлами
        if (!fs::exists(pd2))
        {
            fs::create_directory(pd2); // может кинуть исключение
        }
        std::vector<std::thread> vt;
        for (fs::directory_iterator ib(pd1), ie; ib != ie; ++ib) // перебираем все файлы в dir 1
        {
            if (fs::is_regular_file(ib->path()) && ib->path().extension() == ".txt") // инвертируем каждый файл с расширением .txt
            {
                vt.emplace_back(reverseFile, ib->path(), std::cref(pd2)); // в отдельном потоке 
            }
        }
        for (auto& thr : vt)
        {
            thr.join();
        }
    }
    catch (std::exception const& exc)
    {
        std::cerr << "Exception: " << exc.what() << std::endl;
    }
}
1
0 / 0 / 1
Регистрация: 29.10.2017
Сообщений: 114
15.04.2018, 22:36  [ТС] 3
igorrr37, какой будет код без использования потоков? И можно ли инвертировать не только текстовые файлы, а вообще любые? Пока не получается запустить, как я понял нужен компилятор самый последний, т.к. ругается на filesystem.

Добавлено через 23 часа 37 минут
igorrr37, как можно запустить этот код? У меня куча ошибок. Пытался gcc компилятором запустить
0
2226 / 1729 / 865
Регистрация: 21.12.2010
Сообщений: 3,073
Записей в блоге: 11
16.04.2018, 08:48 4
тебе винапи нужен.
Listing the Files in a Directory
Вывести список файлов каталога
После того как получишь имена всех файлов в директории, открывай их через fstream и инвертируй.
1
0 / 0 / 1
Регистрация: 29.10.2017
Сообщений: 114
16.04.2018, 16:52  [ТС] 5
igorrr37, получается на Linux он не запуститься?

Добавлено через 7 часов 38 минут
Получилось запустить. Инвертирует она по строкам, как можно сделать чтобы посимвольно инвертировала?
Ещё убрал эту строчку
C++
1
if (fs::is_regular_file(ib->path()) && ib->path().extension() == ".txt") // инвертируем каждый файл с расширением .txt
теперь я понял можно со всеми форматами работать.
Какой без потоков будет код, можете написать, а то только начинаю въезжать в эту тему.
0
2226 / 1729 / 865
Регистрация: 21.12.2010
Сообщений: 3,073
Записей в блоге: 11
16.04.2018, 16:57 6
C++
1
2
3
4
if (fs::is_regular_file(ib->path())) // инвертируем каждый файл 
            {
                reverseFile(ib->path(), std::cref(pd2)); 
            }
1
0 / 0 / 1
Регистрация: 29.10.2017
Сообщений: 114
16.04.2018, 17:20  [ТС] 7
igorrr37, инвертирует она по строкам, как можно сделать чтобы посимвольно инвертировала? Пробовал как изначально пытался, но не получилось
C++
1
2
3
4
5
6
7
8
while (getline(cin, str))
    {
        v.push_back(str);
    }
    for (vector<string>::const_reverse_iterator it = v.rbegin(); it != v.rend(); ++it) {
        reverse_copy(it->begin(), it->end(), ostream_iterator<char>(cout));
        cout << endl;
    }
Добавлено через 1 минуту
Эта строчка уже не нужна?
C++
1
vt.emplace_back(reverseFile, ib->path(), std::cref(pd2)); // в отдельном потоке
0
2226 / 1729 / 865
Регистрация: 21.12.2010
Сообщений: 3,073
Записей в блоге: 11
16.04.2018, 17:22 8
не нужна. И эта не нужна
C++
1
2
3
4
for (auto& thr : vt)
        {
            thr.join();
        }
1
0 / 0 / 1
Регистрация: 29.10.2017
Сообщений: 114
16.04.2018, 17:23  [ТС] 9
igorrr37, это без потоков получается?
0
2226 / 1729 / 865
Регистрация: 21.12.2010
Сообщений: 3,073
Записей в блоге: 11
16.04.2018, 17:35 10
Лучший ответ Сообщение было отмечено Alexis_777 как решение

Решение

посимвольно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <fstream>
#include <string>
#include <utility>
#include <algorithm>
#include <iterator>
#include <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:\\dir 1"); // каталог с исходными файлами
        fs::path pd2("c:\\dir 2"); // каталог с инвертированными файлами
        if (!fs::exists(pd2))
        {
            fs::create_directory(pd2); // может кинуть исключение
        }
        for (fs::directory_iterator ib(pd1), ie; ib != ie; ++ib) // перебираем все файлы в dir 1
        {
            if (fs::is_regular_file(ib->path())) // инвертируем каждый файл 
            {
                reverseFile(ib->path(), pd2); 
            }
        }
 
    }
    catch (std::exception const& exc)
    {
        std::cerr << "Exception: " << exc.what() << std::endl;
    }
}
1
0 / 0 / 1
Регистрация: 29.10.2017
Сообщений: 114
16.04.2018, 18:31  [ТС] 11
igorrr37, а с потоками функция reverseFile как измениться? Не могу никак как сразу через вектор сделать.
0
2226 / 1729 / 865
Регистрация: 21.12.2010
Сообщений: 3,073
Записей в блоге: 11
16.04.2018, 20:50 12
Лучший ответ Сообщение было отмечено Alexis_777 как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <iostream>
#include <fstream>
#include <list>
#include <pthread.h>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
 
pthread_mutex_t mtxCerr;
 
struct var
{
    var(fs::path const& pf, fs::path const& pd) : pfile(pf), pdir(pd){};
    fs::path pfile;
    fs::path pdir;
};
 
void* reverseFile(void* arg)
{
    fs::path pfile(reinterpret_cast<var*>(arg)->pfile);
    fs::path pdir(reinterpret_cast<var*>(arg)->pdir);
    std::fstream ifs(pfile, std::ios::in | std::ios::binary), ofs(pdir / pfile.filename(), std::ios::out | std::ios::binary);
    if (ifs.is_open() && ofs.is_open())
    {
        ifs.seekg(0, ifs.end);
        if (ifs.tellg() >= std::streampos(1))
        {
            for (ifs.seekg(-1, ifs.cur); ; ifs.seekg(-2, ifs.cur))
            {
                char c = ifs.get();
                //std::cout << int(c) << "  ";
                ofs.put(c);
                if (ifs.tellg() == std::streampos(1))
                {
                    break;
                }
            }
        }
    }
    else
    {
        pthread_mutex_lock(&mtxCerr);
        std::cerr << "Unable to open file(s): " << pfile << "  " << pdir / pfile.filename() << "\n\n";
        pthread_mutex_unlock(&mtxCerr);
    }
    ifs.close();
    ofs.close();
 
    pthread_exit(0);
}
 
int main()
{
    try
    {
        fs::path pd1("/home/user/student/dir1"); // каталог с исходными файлами
        fs::path pd2("/home/user/student/dir2"); // каталог с инвертированными файлами
 
        pthread_mutex_init(&mtxCerr, nullptr);
 
        if (!fs::exists(pd2))
        {
            fs::create_directory(pd2); // может кинуть исключение
        }
 
        std::list<pthread_t> lt;
        std::list<var> la;
        for (fs::directory_iterator ib(pd1), ie; ib != ie; ++ib) // перебираем все файлы в dir 1
        {
            if (fs::is_regular_file(ib->path())) // инвертируем каждый файл
            {
                lt.emplace_back();
                la.emplace_back(ib->path(), pd2);
                pthread_create(&lt.back(), nullptr, reverseFile, &la.back());
            }
        }
        for(auto& thr : lt)
        {
            pthread_join(thr, nullptr);
        }
        pthread_mutex_destroy(&mtxCerr);
    }
    catch (std::exception const& exc)
    {
        std::cerr << "Exception: " << exc.what() << std::endl;
    }
}
1
0 / 0 / 1
Регистрация: 29.10.2017
Сообщений: 114
16.04.2018, 22:21  [ТС] 13
igorrr37, кидает исключение сразу же. Хотя создал даже папку такую. Посмотрите у вас работает или это только у меня.
Bash
1
Exception: filesystem error: cannot create directory: No such file or directory [/home/user/student/dir3]
0
2226 / 1729 / 865
Регистрация: 21.12.2010
Сообщений: 3,073
Записей в блоге: 11
16.04.2018, 22:38 14
зайди в свойства папки и проверь путь к ней, может он не такой /home/user/student/dir3
1
0 / 0 / 1
Регистрация: 29.10.2017
Сообщений: 114
17.04.2018, 00:23  [ТС] 15
igorrr37, да, точно, не заметил))
0
2226 / 1729 / 865
Регистрация: 21.12.2010
Сообщений: 3,073
Записей в блоге: 11
20.04.2018, 19:18 16
с созданием дерева каталогов в новой папке
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <iostream>
#include <fstream>
#include <list>
#include <pthread.h>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
 
pthread_mutex_t mtxCerr;
 
struct var
{
    var(fs::path const& pf1, fs::path const& pf2) : pfile1(pf1), pfile2(pf2){};
    fs::path pfile1;
    fs::path pfile2;
};
 
void* reverseFile(void* arg)
{
    fs::path pfile1(reinterpret_cast<var*>(arg)->pfile1);
    fs::path pfile2(reinterpret_cast<var*>(arg)->pfile2);
    std::fstream ifs(pfile1, std::ios::in | std::ios::binary), ofs(pfile2, std::ios::out | std::ios::binary);
    if (ifs.is_open() && ofs.is_open())
    {
        ifs.seekg(0, ifs.end);
        if (ifs.tellg() >= std::streampos(1))
        {
            for (ifs.seekg(-1, ifs.cur); ; ifs.seekg(-2, ifs.cur))
            {
                char c = ifs.get();
                //std::cout << int(c) << "  ";
                ofs.put(c);
                if (ifs.tellg() == std::streampos(1))
                {
                    break;
                }
            }
        }
    }
    else
    {
        pthread_mutex_lock(&mtxCerr);
        std::cerr << "Unable to open file(s): " << pfile1 << "  " << pfile2 << "\n\n";
        pthread_mutex_unlock(&mtxCerr);
    }
    ifs.close();
    ofs.close();
 
    pthread_exit(0);
}
 
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());
 
    for (auto ib(pr.first), ie(oldPth.end()); ib != ie; ++ib)
    {
        ret /= *ib;
    }
 
    return ret;
}
 
int main()
{
    try
    {
        fs::path pd1("/home/user/student/dir1"); // каталог с исходными файлами
        fs::path pd2("/home/user/student/dir2/ddd"); // каталог с инвертированными файлами
 
        pthread_mutex_init(&mtxCerr, nullptr);
 
        if (!fs::exists(pd2))
        {
            fs::create_directories(pd2); // может кинуть исключение
        }
 
        std::list<pthread_t> lt;
        std::list<var> la;
        for (fs::recursive_directory_iterator ib(pd1), ie; ib != ie; ++ib) // перебираем все файлы в dir 1
        {
            if (fs::is_regular_file(ib->path())) // инвертируем каждый файл
            {
                lt.emplace_back();
                la.emplace_back(ib->path(), newPath(ib->path(), pd1, pd2));
                pthread_create(&lt.back(), nullptr, reverseFile, &la.back());
            }
            else if(fs::is_directory(ib->path()))
            {
                fs::create_directory(newPath(ib->path(), pd1, pd2));
            }
        }
        for(auto& thr : lt)
        {
            pthread_join(thr, nullptr);
        }
        pthread_mutex_destroy(&mtxCerr);
    }
    catch (std::exception const& exc)
    {
        std::cerr << "Exception: " << exc.what() << std::endl;
    }
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.04.2018, 19:18

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Считывание содержимого из нескольких файлов
Доброго времени суток. Поискала в более ранних темах - не нашла. Суть проблемы вот в чем: у меня...

Копирование содержимого нескольких файлов в один
Интересную вещь заметил, не встречал вроде, но если уже опубликовано можно убрать. Например...

Вывод в консоли содержимого нескольких файлов
Имеется некий код программы, необходимо чтобы данные считывались все сразу, а не при нажатии Enter...

Добавление содержимого нескольких нетипизированных файлов к первоначально пустому файлу
Реализуйте последовательное добавление содержимого нескольких нетипизированных файлов к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.