Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 21.02.2013
Сообщений: 35

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

30.05.2013, 11:26. Показов 2114. Ответов 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 минут
вверх
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.05.2013, 11:26
Ответы с готовыми решениями:

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

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

Вывести строку по словам, найти самое длинное и самое короткое слово
• Дана строка S. Вивисты его послов и сказать которое дольше и которое меньше слово.

10
433 / 368 / 149
Регистрация: 06.08.2012
Сообщений: 961
30.05.2013, 12:45
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);
 
}
0
0 / 0 / 0
Регистрация: 21.02.2013
Сообщений: 35
30.05.2013, 21:39  [ТС]
При компиляции выводится крякозябра из шести символов и всё на этом, Вы уверены в правильности кода? Или это я что-то не так сделал? Приложил проект
Вложения
Тип файла: rar er.rar (109.6 Кб, 9 просмотров)
0
433 / 368 / 149
Регистрация: 06.08.2012
Сообщений: 961
30.05.2013, 22:04
11101010, не знаю. В VS2012 и Qt Creator - всё норм.
0
0 / 0 / 0
Регистрация: 21.02.2013
Сообщений: 35
31.05.2013, 17:29  [ТС]
В 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];
Можно её заменить на нечто более доступное глазу новичка?
0
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
31.05.2013, 18:26
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;
}
1
0 / 0 / 0
Регистрация: 21.02.2013
Сообщений: 35
01.06.2013, 12:52  [ТС]
Слушайте, а попроще это можно как-то реализовать? Я совсем новичок и в том, что вы написали, совсем ничего разобрать не могу, уж больно круто всё. Можно как-то на основе мною написанного в сабже кода придумать?
0
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
01.06.2013, 13:23
Допустил в первом своем коде некие ошибки, не учел рекурсивный поиск файлов в директориях. Вот новый вариант:
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, но в чистом С++ я таких методов не знаю.
1
0 / 0 / 0
Регистрация: 21.02.2013
Сообщений: 35
01.06.2013, 13:34  [ТС]
yuron_477, а что тут не из чистого c++?
0
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
01.06.2013, 14:03
Код использует библиотеку boost, которую надо отдельно скачивать с интернета и самому собирать и подключать для своего компилятора и среды разработки. Без этого вы этот код у себя не скомпилируете.
0
0 / 0 / 0
Регистрация: 21.02.2013
Сообщений: 35
03.06.2013, 21:18  [ТС]
Спасибо конечно, но вопрос мой в силе остаётся. Можно, используя стиль сабжевого кода, достигнуть результата?
Приложу, вот, код, который находит и выводит все файлы, начинающиеся с указананном буквы (в данном случае, с буквы М)
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);
    }
}
Может это поможет достичь нужного результата. Я не понимаю, как это сделать, есть идеи?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.06.2013, 21:18
Помогаю со студенческими работами здесь

Найти самое короткое и самое длинное число. Вывести найденные числа и их длину
Ввести n чисел с консоли. Найти самое короткое и самое длинное число. Вывести найденные числа и их длину.

Из файла прочитать текст, найти самое длинное слово и вывести на экран сроки, в которых оно находится
Привет всем, нужна помощь с написанием программы. Задание: Из файла прочитать текст, найти самое длинное слово и вывести на экран сроки,...

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

в текстовом файле дан текст: фамилия, имя, отчество. В новый текстовый файл вывести самое длинное число
в текстовом файле дан текст: фамилия, имя, отчество. В новый текстовый файл вывести самое длинное число

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru