Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
11101010
0 / 0 / 0
Регистрация: 21.02.2013
Сообщений: 35
#1

Рекурсией найти и вывести самое длинное имя файла - C++

30.05.2013, 11:26. Просмотров 776. Ответов 10
Метки нет (Все метки)

Здравствуйте, нужно с помощью рекурсии найти и вывести самое длинное имя файла, вывести с указанием пути. Как это можно сделать?
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
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
 
 
void PrintFileLocations(char const*StartDir, char const*FileName);
 
int main(int argc, char *argv[])
{
    char fname[256]="1.txt", dirname[256]="D:\\Home";
    PrintFileLocations(dirname, fname);
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
void PrintFileLocations(char const*StartDir, char const*FileName)
{
    DIR    *dp = opendir (StartDir);
// Граничное условие: если StartDir это не папка,
// то нет в ней файлов с именем FileName
    if (dp == NULL)
    {
        return ;
    }
    else
    {
        struct dirent *ep;
        while (ep = readdir (dp))
        {
            if( strcmp(ep->d_name, "." ) ==0 || strcmp(ep->d_name, ".." ) ==0)
                continue;
        // Проверяем каждый элемент из папки и , если его имя
        // совпало с FileName - выводим путь и увеличиваем счётчик
            if(strcmp(FileName, ep->d_name)==0)
            {
                printf("%s\\%s\n", StartDir, ep->d_name);
            }
        // Рекурсивно ищем, предполагая, что данный элемент является папкой
            char *newDir=(char*)
                malloc(sizeof(char)*(strlen(StartDir)+strlen(ep->d_name)+2));
            strcpy(newDir, StartDir);
            strcat(newDir, "\\");
            strcat(newDir, ep->d_name);
            PrintFileLocations(newDir, FileName);
            free(newDir);
        }
        closedir (dp);
    }
}
Добавлено через 15 часов 49 минут
вверх
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2013, 11:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Рекурсией найти и вывести самое длинное имя файла (C++):

Вывести имя и количество букв в фамилии. Вывести самое длинное слово - C++
Помогите сделать задачку: Вывести имя и количество букв в фамилии.Вывести самое длинное слово.На C++

Вывести имя и количество букв в фамилии. Вывести самое длинное слово - C++
Вывести имя и количество букв в фамилии.Вывести самое длинное слово,помогите сделать эту программу

Строки. В заданном тексте найти самое длинное слово и самое длинное предложение. - C++
Задача: В заданном тексте найти самое длинное слово и самое длинное предложение. Помогите решить На СИ++ в Visual Studio.

Найти в тексте самое длинное слово и самое длинное предложение - C++
вписать текст с клавиатуры и найти в этом тексте самое длинное слово и самое длинное предложение.Предложения должны быть разделены точкой.

Считать текст из файла, найти самое длинное слово и определяет - C++
Считать текст из файла, найти самое длинное слово и определяет, сколько раз оно встретилось в тексте. Добавлено через 5 часов 40 минут...

Вывести самое длинное и самое короткое слово из строки - C++
Хочу сделать через strtok, но толком не знаю как именно. #include &lt;iostream&gt; #include &lt;string.h&gt; #include &lt;conio.h&gt; #include...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
30.05.2013, 12:45 #2
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
#include <iostream>
#include <cstring>
 
char* FindPath(char** titles, int size);
 
int main()
{
    const int size = 5;
    char* titles[size] = { "D:\\Home", "D:\\Games\\WWE13", "C:\\Windows\\System32", "D:\\Music", "D:\\Pictures" };
 
    std::cout << FindPath(titles, size) << std::endl;
 
    system("PAUSE");
    return 0;
}
 
char* FindPath(char** titles, int size)
{
    static char* result = titles[0x0];
    --size;
 
    if (size == 0)
        return result;
    else
        if (strlen(result) < strlen(titles[size])) 
            result = titles[size];
 
    FindPath(titles, --size);
 
}
11101010
0 / 0 / 0
Регистрация: 21.02.2013
Сообщений: 35
30.05.2013, 21:39  [ТС] #3
При компиляции выводится крякозябра из шести символов и всё на этом, Вы уверены в правильности кода? Или это я что-то не так сделал? Приложил проект
Вложения
Тип файла: rar er.rar (109.6 Кб, 7 просмотров)
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
30.05.2013, 22:04 #4
11101010, не знаю. В VS2012 и Qt Creator - всё норм.
11101010
0 / 0 / 0
Регистрация: 21.02.2013
Сообщений: 35
31.05.2013, 17:29  [ТС] #5
В CodeBlocks выводится
C:\\Windows\\System32
так задумано?

Можно сделать так, чтобы юзер просто ввел жёсткий диск, программа всё перебрала и выбрала из всех файлов в папках самый длинноименной, в последствии его имя вывела на экран? А то сейчас получается, что программа просто перебирает из указанных названий, при том C:\\Windows\\System32 она называет самым длинным, т.к. у него путь в символах длиннющий - аж 21 символ, а если убрать слово Windows, выведет длинным названием уже D:\\Pictures. При том нужно же именно файл, а не папку, плюс рассматривать надо конкретно имя файла, не учитывая длину его пути (например в D:\Games\Game2\Pacman\Game\Vvv.txt должен учитываться лишь Vvv.txt, а не целиком D:\Games\Game2\Pacman\Game\Vvv.txt)

И объясните пожалуйста строку
C++
1
static char* result = titles[0x0];
Можно её заменить на нечто более доступное глазу новичка?
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
31.05.2013, 18:26 #6
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
#include <iostream>
#include <vector>
#include <algorithm>
#include "boost/filesystem/operations.hpp"
#include "boost/filesystem/path.hpp"
#include <windows.h>
 
int main()
{
    SetConsoleCP (1251); SetConsoleOutputCP (1251); //для русификации текста
    namespace fs = boost::filesystem;
 
    fs::path directory_path("D://Temp");
    std::vector<fs::path> files{fs::directory_iterator(directory_path), fs::directory_iterator()};
    for (const auto& file : files)
    {
        std::cout << file << std::endl;
    }
    fs::path longest_file = *std::max_element(files.begin(), files.end(),
            [](const fs::path& p1, const fs::path& p2){return p1 < p2;});
    std::cout<<"\n\nСамое длинное имя файла: "<<longest_file.filename();
    std::cout<<"\nПуть: "<<longest_file<<'\n';
            
    return 0;
}
11101010
0 / 0 / 0
Регистрация: 21.02.2013
Сообщений: 35
01.06.2013, 12:52  [ТС] #7
Слушайте, а попроще это можно как-то реализовать? Я совсем новичок и в том, что вы написали, совсем ничего разобрать не могу, уж больно круто всё. Можно как-то на основе мною написанного в сабже кода придумать?
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
01.06.2013, 13:23 #8
Допустил в первом своем коде некие ошибки, не учел рекурсивный поиск файлов в директориях. Вот новый вариант:
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
#include <iostream>
#include <vector>
#include <algorithm>
#include "boost/filesystem/operations.hpp"
#include "boost/filesystem/path.hpp"
#include <windows.h>
 
namespace fs = boost::filesystem;
 
void all_files(const fs::path& p, std::vector<fs::path>& files)
{
    for (fs::directory_iterator pos(p); pos != fs::directory_iterator(); ++pos)
    {
        if (fs::is_directory(*pos)) all_files(*pos, files);
        else
            files.push_back(*pos);
    }
}
 
int main()
{
    SetConsoleCP (1251); SetConsoleOutputCP (1251);
 
    fs::path directory_path("D://Temp");
    std::vector<fs::path> files;
    all_files(directory_path, files);
    for (const auto& file : files) std::cout << file << std::endl;
    
    fs::path longest_file = *std::max_element(files.begin(), files.end(),
            [](const fs::path& p1, const fs::path& p2){
                return p1.filename().generic_string().size() < 
                       p2.filename().generic_string().size();
            });
    std::cout<<"\n\nСамое длинное имя файла: "<<longest_file.filename();
    std::cout<<"\nПуть: "<<longest_file<<'\n';
            
    return 0;
}
11101010,не знаю можно ли проще без boost, но в чистом С++ я таких методов не знаю.
11101010
0 / 0 / 0
Регистрация: 21.02.2013
Сообщений: 35
01.06.2013, 13:34  [ТС] #9
yuron_477, а что тут не из чистого c++?
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
01.06.2013, 14:03 #10
Код использует библиотеку boost, которую надо отдельно скачивать с интернета и самому собирать и подключать для своего компилятора и среды разработки. Без этого вы этот код у себя не скомпилируете.
11101010
0 / 0 / 0
Регистрация: 21.02.2013
Сообщений: 35
03.06.2013, 21:18  [ТС] #11
Спасибо конечно, но вопрос мой в силе остаётся. Можно, используя стиль сабжевого кода, достигнуть результата?
Приложу, вот, код, который находит и выводит все файлы, начинающиеся с указананном буквы (в данном случае, с буквы М)
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
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
 
 
void PrintFileLocations(char const*StartDir, char const*FileName);
 
int main(int argc, char *argv[])
{
    char fname[256]="M", dirname[256]="D:\\++++++++++";
    PrintFileLocations(dirname, fname);
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
void PrintFileLocations(char const*StartDir, char const*FileName)
{
    DIR    *dp = opendir (StartDir);
// Граничное условие: если StartDir это не папка,
// то нет в ней файлов с именем FileName
    if (dp == NULL)
    {
        return ;
    }
    else
    {
        struct dirent *ep;
        while (ep = readdir (dp))
        {
            if( strcmp(ep->d_name, "." ) ==0 || strcmp(ep->d_name, ".." ) ==0)
                continue;
        // Проверяем каждый элемент из папки и , если его имя
        // совпало с FileName - выводим путь и увеличиваем счётчик
            //char* lp=strchr(ep->d_name, FileName);
            char* lp=strpbrk(ep->d_name, FileName);
            if(lp!=NULL)
            {
            printf("%s\n",lp);
            //printf("%s\\%s\n", StartDir, lp);
            }
        // Рекурсивно ищем, предполагая, что данный элемент является папкой
            char *newDir=(char*)
                malloc(sizeof(char)*(strlen(StartDir)+strlen(ep->d_name)+2));
            strcpy(newDir, StartDir);
            strcat(newDir, "\\");
            strcat(newDir, ep->d_name);
            PrintFileLocations(newDir, FileName);
            free(newDir);
        }
        closedir (dp);
    }
}
Может это поможет достичь нужного результата. Я не понимаю, как это сделать, есть идеи?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.06.2013, 21:18
Привет! Вот еще темы с ответами:

Подсчитать количество предложений во всех файлах и вывести на экран самое короткое и самое длинное предложения - C++
Напишите программу, которая открывает текстовый файл-список, содержащий имена файлов по одному на строке. Программа подсчитывает количество...

Считать текст из txt-файла и найти самое длинное слово и количество слов - C++
Доброго времени суток ! надо считать текст с файла тхт и найти самое длинное слово и количество етих слов. как ето зделать ?

В тексте из файла найти самое длинное слово и определить, сколько раз оно встретилось - C++
Пожалуйста помогите решить мне эту задачу?????????????? Написать программу, которая считывает текст из файла, находит самое длинное...

Файл: Найти самое длинное слово и определить, сколько раз оно встретилось в тексте из файла - C++
Мне нужно написать программу, которая считывает текст из файла, находит самое длинное слово и определяет, сколько раз оно встретилось в...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.06.2013, 21:18
Ответ Создать тему
Опции темы

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