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

Задачка на рекурсию... - C++

Восстановить пароль Регистрация
 
Dark2012
0 / 0 / 0
Регистрация: 03.12.2011
Сообщений: 43
18.12.2011, 20:42     Задачка на рекурсию... #1
в общем нужно сделать прогу чтоб выводила дерево файлов и папок указанной директории....
Сделать это надо с помощью рекурсии...


Есть вот такая вот заготовка... Она считывает атрибьюты папок по указанному пути, и если папка является директорией выводит ее на печать....
В принципе то что здесь написано можно (и нужно запихнуть в функцию)....

Нужно сделать что....вывелась на печать папка, в этой папке - еще папки - они вывелись с отступом и тд...

Если кто знает можете решение не писать, а просто объяснить как это надо сделать именно с помощью рекурсии и на основе того что у меня здесь накалякано...

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
#include <iostream>
#include <Windows.h>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    WIN32_FIND_DATAA findData;
    HANDLE hf;
 
    hf = FindFirstFileA("D:\\avr\\*", &findData);
    //"D:\\Garmin\\*"
    if (hf == INVALID_HANDLE_VALUE)
    {
        cout << "Cannot find file" << endl;
        return -1;
    }
 
    do
    {
        if(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            cout << "[DIR] ";
            
        cout << findData.cFileName << endl;
        
    }
    while (FindNextFileA(hf, &findData)); 
 
    FindClose(hf);
 
  cin.get();
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2011, 20:42     Задачка на рекурсию...
Посмотрите здесь:

Постигая рекурсию. C++
понять рекурсию C++
Задачи на рекурсию C++
C++ Задача на рекурсию
Задача на рекурсию C++
C++ Задачка про деревья на рекурсию
Реализовать рекурсию C++
Задача на рекурсию C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.12.2011, 00:07     Задачка на рекурсию... #2
алгоритм примерно такой:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void PrintDirContent(const string& fullDirPath, unsigned indent = 0)
{
   PrintDir(fullDirPath);
 
   // Получаем папки находящиеся в текущей директории.
   std::vector<string> subDirs = GetSubDirectories(fullDirPath);
   for_each(subDir in subDirs)
  {
     PrintDirContent(subDir, indent + 1); // печатаем все, что есть в подпапке. Рекурсивный вызов.
  }
 
   // Получаем файлы, находящиеся в текущей директории.
   std::vector<string> files = GetFiles(fullDirPath);
   for_each(file in files)
  {
     PrintFile(file, indent);
  }
}
Остается реализовать ф-ии:
GetSubDirectories(fullDirPath);
GetFiles(fullDirPath);
PrintDir(fullDirPath);
PrintFile(fullFilePath);

строки понадобатся широкие (std::wstring)

Добавлено через 1 час 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
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <windows.h>
#include <iostream>
#include <string>
#include <list>
#include <algorithm>
 
using namespace std;
 
typedef WIN32_FIND_DATAW Entry;
 
std::wstring AdjustDirPath(const std::wstring& path)
{
  std::wstring result = path;
  std::replace(result.begin(), result.end(), '/', '\\');
  if (result.empty() || result[result.length() - 1] != '\\')
  {
    result += '\\';
  }
  return result;
}
 
std::wstring AppendPath(const std::wstring& path, const std::wstring& name)
{
  return AdjustDirPath(path) + name;
}
 
void GetDirEntries(const std::wstring& fullDirPath, std::list<Entry>& result)
{
  const std::wstring PARENT_DIR = L"..";
  const std::wstring CURRENT_DIR = L".";
  const std::wstring path = AdjustDirPath(fullDirPath);
  const std::wstring pattern = path + L"*";
 
  Entry entry;
  HANDLE hf = FindFirstFileW(pattern.c_str(), &entry);
  if (hf == INVALID_HANDLE_VALUE)
  {
    throw std::runtime_error("Cannot find file.");
  }
 
  std::list<Entry> tmp;
 
  do
  {
    if (PARENT_DIR != entry.cFileName && CURRENT_DIR != entry.cFileName)
    {
      tmp.push_back(entry);
    }
  }
  while (FindNextFileW(hf, &entry));
 
  FindClose(hf);
 
  result.swap(tmp);
}
 
bool IsDir(const Entry& entry)
{
  return entry.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ? true : false;
}
 
void PrintEntry(const Entry& entry, unsigned indent)
{
  std::wcout << std::wstring(indent * 2, ' ');
  if (IsDir(entry))
  {
    std::wcout << '[' << entry.cFileName << ']';
  }
  else
  {
    std::wcout << entry.cFileName;
  }
  std::wcout << std::endl;
}
 
bool LessEntry(const Entry& lhs, const Entry& rhs)
{
  if (IsDir(lhs) && !IsDir(rhs))
    return true;
 
  if (!IsDir(lhs) && IsDir(rhs))
    return false;
 
  return std::wstring(lhs.cFileName) < rhs.cFileName;
}
 
void PrintDirContent(const std::wstring& fullDirPath, unsigned indent)
{
  std::list<Entry> entries;
  GetDirEntries(fullDirPath, entries);
  entries.sort(&LessEntry);
  for (std::list<Entry>::const_iterator it = entries.begin(), end = entries.end(); it != end; ++it)
  {
    const Entry& entry = *it;
    PrintEntry(entry, indent);
    if (IsDir(entry))
    {
      const std::wstring subDirFullPath = AppendPath(fullDirPath, entry.cFileName);
      PrintDirContent(subDirFullPath, indent + 1); // рекурсивный вызов
    }
  }
}
 
void PrintDirContent(const std::wstring& fullDirPath)
{
  std::wcout << "Content of dir \"" << fullDirPath << "\" is:" << std::endl;
  PrintDirContent(fullDirPath, 0);
}
 
int main()
{
  try
  {
    //const std::wstring fullPath = L"d:\\Docs";
    const std::wstring fullPath = L".."; // parent dir of executable file
    PrintDirContent(fullPath);
  }
  catch (std::exception& e)
  {
    std::wcerr << L"Error: " << e.what() << std::endl;
  }
 
  return 0;
}
Dark2012
0 / 0 / 0
Регистрация: 03.12.2011
Сообщений: 43
19.12.2011, 00:42  [ТС]     Задачка на рекурсию... #3
Спасибо!... В общем победа близка, но сегодня сил уже нету. Завтра думаю добью....
Yandex
Объявления
19.12.2011, 00:42     Задачка на рекурсию...
Ответ Создать тему
Опции темы

Текущее время: 06:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru