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

Поиск самого длинного пути расположения файла - C++

Восстановить пароль Регистрация
 
Kenny95
0 / 0 / 0
Регистрация: 26.02.2013
Сообщений: 15
21.05.2013, 18:33     Поиск самого длинного пути расположения файла #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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#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]="C:\\test";
    PrintFileLocations(dirname, fname);
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
void PrintFileLocations(char const*StartDir, char const*FileName)
{
    DIR    *dp = opendir (StartDir);// StartDir это тоже самое что и dirname,
                                    // а DIR    *dp = opendir (StartDir) значит открыть папку 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);
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2013, 18:33     Поиск самого длинного пути расположения файла
Посмотрите здесь:

C++ Поиск самого длинного слова в файле
Поиск самого длинного слова в файле C++
Считывание расположения (пути) файла с клавиатуры C++
C++ Файловый ввод и поиск самого длинного слова в тексте
Поиск самого длинного слова в файле C++
Поиск самого длинного пути от первой до последней вершины ацикличного ориентированного невзвешенного графа C++
C++ Вывод из вектора самого короткого и самого длинного string значения
C++ Поиск самого короткого и самого длинного слова массива

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
schdub
 Аватар для schdub
2902 / 1246 / 222
Регистрация: 19.01.2009
Сообщений: 3,214
Завершенные тесты: 1
21.05.2013, 20:03     Поиск самого длинного пути расположения файла #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
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
#include <stdlib.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
 
#define DIR_SEPARATOR "\\"   // разделитель директорий в Windows "\\" в *nix "/"
#define MAXIMUM_PATH  260    // макс кол-во символов в пути
 
// структура для хранения информации о текущем максимальном пути
struct MaxPathFinder_ctx {
    unsigned maxPathLen;
    char maxPath[MAXIMUM_PATH];
};
 
void PrintFileLocations(char const * StartDir, char const * FileName, struct MaxPathFinder_ctx * ctx) {
    DIR    *dp = opendir (StartDir);// StartDir это тоже самое что и dirname,
                                    // а DIR    *dp = opendir (StartDir) значит открыть папку StartDir
// Граничное условие: если StartDir это не папка,
// то нет в ней файлов с именем FileName
    if (dp == NULL) {
        return;
    }
 
    struct dirent *ep;
    char newDir[MAXIMUM_PATH]; // переместили в стековую память
    // вычисляем один раз, вместо выполнения на каждой итерации цикла
    strncpy(newDir, StartDir, MAXIMUM_PATH - 1);
    strcat(newDir, DIR_SEPARATOR);
    int startDirLen = strlen(StartDir);
    int currentLen = 0;
    char * ptrToAdd = &newDir[startDirLen + 1]; // чтобы сократить кол-во операций копирования
 
    while (ep = readdir (dp)) {
        if (strcmp(ep->d_name, ".") == 0 || strcmp(ep->d_name, "..") ==0) {
            continue;
        }
        // копируем только имя вновь найденного элемента и 
        // подсчитываем кол-во символов в пути
        strcpy(ptrToAdd, ep->d_name);
        currentLen = startDirLen + strlen(ep->d_name) + 1;
        if (ctx->maxPathLen < currentLen) {
            // если их больше, то копируем в контекст текущий путь
            ctx->maxPathLen = currentLen;
            strcpy(ctx->maxPath, newDir);
        }
 
        // FIXME: не понял из задания нужно ли это убрать?
        // Проверяем каждый элемент из папки и , если его имя
        // совпало с FileName - выводим путь и увеличиваем счётчик
        if (strcmp(FileName, ep->d_name)==0) {
            printf("%s\n", newDir);
        }
        
        // Рекурсивно ищем, предполагая, что данный элемент является папкой
        PrintFileLocations(newDir, FileName, ctx);
    }
    closedir (dp);
}
 
int main(int argc, char *argv[]) {
    struct MaxPathFinder_ctx ctx;
    char fname[MAXIMUM_PATH];
    char dirname[MAXIMUM_PATH];
 
    memset(&ctx, 0, sizeof(ctx));
    strcpy(fname, "1.txt");         // имя файла, для которого нужно выводить полный путь
    strcpy(dirname, "c:\\test");    // директория в которой начинаем поиск
 
    PrintFileLocations(dirname, fname, &ctx);
    
    if (ctx.maxPath[0]) {
        printf("Max path is '%s', contains %d chars.\n", ctx.maxPath, ctx.maxPathLen);
    } else {
        printf("Empty path.\n");
    }
    
    return EXIT_SUCCESS;
}
Yandex
Объявления
21.05.2013, 20:03     Поиск самого длинного пути расположения файла
Ответ Создать тему
Опции темы

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