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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 162
#1

нужна функция которая находит файлы - C++

23.10.2010, 16:53. Просмотров 1776. Ответов 22
Метки нет (Все метки)

Добрый день!

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

Нужно чтоб это все работало на Win32 Console Application.

Добпускается использование #include <windows.h>.

Я понимаю, что это сложновато, но может быть кому-то будет интересно заморочиться...

Заранее Вам спасибо!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2010, 16:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос нужна функция которая находит файлы (C++):

Функция, которая находит минимальное значение - C++
Вобщем в программе вычесляются значения косинуса на интервале Нужна функция которая найдет найменьшее из этих значений #include...

Функция, которая находит элемент массива - C++
Здравствуйте,задание:написать функцию,которая ищет элемент в массиве.Я не понимаю почему не получается,я перепробовал кучи вариантов,но...

Нужна программа, которая по регулярному выражению находит все совпадения в строке - C++
Никак не могу освоить добавленную в C++11 библиотеку &lt;regex&gt;! Помогите пожалуйста! Нужна программа, которая по регулярному выражению...

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

Функция которая находит max элемент массива и имеет перегруженность - C++
#include &lt;iostream&gt; using namespace std; int max(int a) {for (int i = 0; i &lt;a; i++) return a;} double max(double a) {for...

функция которая находит среднее арифметическое элементов очереди,если она пуста - C++
Помогите с задачей нужно реализовать на си или с++. Задача: Описать функцию которая находит среднее арифметическое элементов...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,608
23.10.2010, 23:42 #16
Цитата Сообщение от Don Vito Посмотреть сообщение
Попробовал указать полный путь (см. ниже)
На экране появляется "муссор"
либо переименовывайте папку, чтобы в ней русских символов небыло, либо заморочки с UNICODE...
нужна функция которая находит файлы
Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 162
24.10.2010, 01:52  [ТС] #17
Перименовал - не работает...муссор!

Может тут нужно что нибудь изменить?

long nFind = _findfirst("D:\finam\EURUSD.txt",&data);

Добавлено через 2 часа 6 минут
easybudda, привет!

Вообщем

нужно вот так

C++
1
2
3
_finddata_t data;
   
   long nFind = _findfirst("D:\\finam\\EURUSD\\*.*txt",&data);
Evg подсказал!

easybudda, спасибо тебе!

И всем остальным тоже спасибо!))
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,608
24.10.2010, 01:56 #18
Цитата Сообщение от Don Vito Посмотреть сообщение
long nFind = _findfirst("D:\\finam\\EURUSD\\*.*txt",&data);
ну почти...
C++
1
long nFind = _findfirst("D:\\finam\\EURUSD\\*.txt",&data);
а то на file.netxt тоже сработает
Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 162
24.10.2010, 02:02  [ТС] #19
сто пудово))
Sonador
0 / 0 / 0
Регистрация: 24.04.2011
Сообщений: 14
27.07.2011, 00:24 #20
Здравствуйте! Пытаюсь написать программу по просьбе друга. Часть её удалось сделать благодаря коду написанному easybudda в сообщении #12. Вот код, который у меня получился.

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
#include <windows.h>
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
 
#ifndef MAX_PATH
#define MAX_PATH 1024 // Замена константы максимального полного имени файла с 260 на 1024
#endif
 
#define NAME_MASK "*.*"  // Определение маски для поиска файлов (любое имя, любое расширение)
 
char **FindFileInDirectory(FILETIME **data, size_t *cnt);       // поиск всех файлов в папке
 
int main()
{
    size_t *cnt = new size_t;
    FILETIME **data = NULL;
    char **list = FindFileInDirectory(data, cnt);
/*  if ( ! list )   // Проверка есть ли в списке list файлы
        printf("There aren't files containing \"432\"\n");
    else
    {
        printf("Files contain \"432\":\n");
        for ( size_t i = 0; i < *cnt; ++i )
        {
            printf("%i. %s \n",i+1, list[i]);
        }
    }
*/
    if ( ! data )   // Проверка есть ли в списке data файлы
        printf("There aren't any info\n");
    else
    {
        printf("Data:\n");
        for ( size_t i = 0; i < *cnt; ++i )
        {
            SYSTEMTIME stUTC, stLocal;
            FileTimeToSystemTime(data[i], &stUTC);
            SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);
            printf("\tcreate in: %02d/%02d/%d  %02d:%02d\n",
            stLocal.wDay, stLocal.wMonth, stLocal.wYear,
            stLocal.wHour, stLocal.wMinute);
        }
    }
    return 0;
}
 
char **FindFileInDirectory(FILETIME **data, size_t *cnt)
{
    char curDir[MAX_PATH];      // переменная для хранения текущего файловый путь
    char **list = NULL;         // указатель на переменную, хранящую список имен файлов
    size_t cnt_list = 0, cnt_data = 0;  // счетчик количества файлов в папке
    WIN32_FIND_DATAA find;             // структура, описывающая файл, найденный функцией  FindFirstFile и FindNextFile
    HANDLE hFind;               // указатель на открытый файл
 
    SetCurrentDirectoryA("Proba");      // изменение текущей дирректории на вложенную папку 
    GetCurrentDirectoryA(MAX_PATH, curDir); // функция возвращает текущий каталог. Имя каталога нормализовано и содержит '\' на конце.
 
    hFind = FindFirstFileA(NAME_MASK, &find);
 
    if ( hFind == INVALID_HANDLE_VALUE )    // В случае неудачи буфер не заполняется и возвращается недействительный описатель (INVALID_HANDLE_VALUE = -1).
    {
        fprintf(stderr, "Can't find any file!\n");
        exit(1);
    }
 
    do      
    {
        // определение имен файлов
        if ( ( list = (char**)realloc(list, sizeof(char*) * (cnt_list + 1)) ) == NULL ) // Динамический массив
        {
            perror("realloc");  // Сообщение об ошибке отсутствия свободной памяти
            exit(1);
        }
        if ( ( list[cnt_list++] = _strdup(find.cFileName) ) == NULL )   // Присоединяет память при помощи вызова malloc, копирует  в  нее строку  string  и возвращает указатель на присоединенную память
        {
            perror("strdup");   // Сообщение об ошибке отсутствия свободной памяти
            exit(1);
        }
        // определение даты создания
        if ( ( data = (FILETIME**)realloc(data, sizeof(FILETIME*) * (cnt_data + 1)) ) == NULL ) // Динамический массив
        {
            perror("realloc");  // Сообщение об ошибке отсутствия свободной памяти
            exit(1);
        }
        data[cnt_data++] = &find.ftCreationTime;
 
    } while ( FindNextFileA(hFind, &find) );
 
    FindClose(hFind);
 
    *cnt = cnt_list;
    printf("Files in %s:\n", curDir);
    return list;
}
Проблема в том, что при попытке вывода информации в main программа говорит, что data пустая. Видимо я запуталсь в указателях. Возврат list тоже наверное извращенный, но по другому не получилось. Помогите плиз отредактировать, так что б и list, и data были доступны в main... (вывод на экран на данном этапе всего лишь проверка, дальше над ними ещё будет много издевательств)...
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,608
27.07.2011, 02:45 #21
Цитата Сообщение от Sonador Посмотреть сообщение
Пытаюсь написать программу
Вы бы написали, что она должна делать, а то как-то не понятно...

Цитата Сообщение от Sonador Посмотреть сообщение
FILETIME **data = NULL;
Вот это что к примеру? (В смысле - что по замыслу)...
Sonador
0 / 0 / 0
Регистрация: 24.04.2011
Сообщений: 14
27.07.2011, 11:11 #22
Да, извиняюсь ) На данном этапе программа должна сформировать в отдельной функции 2 массива один с именами файлов, а другой с их датами их создания. Оба массива должны быть доступны в других функциях, например main. Чтоб убедиться, что они доступны в main я пытаюсь в ней сделать вывод их содержимого на экран. Проблема в том, что я не очень (если не сказать совсем не) разбираюсь с массивами впринципе, а там ещё и динамические. С массивом list я ещё как-то выкрутилась, всё работает как надо. Создание второго массива data я делала по аналогии с list (код для создания которого взят из вашего сообщения #12), поэтому строчка
C++
1
FILETIME **data = NULL;
аналог ваших:
C++
1
2
char ** list;
list = NULL;
только записано в вызывающей функции, чтоб передать указатель data как входной параметр функции, которая должна его изменить. При этом массив data создается и если вывод на экран организовать внутри функции FindFileInDirectory, то всё будет работать, но если попытаться вывести его уже в main после вызова соответствующей функции при проверке data оказывается пустой. В общем проблема, если можно так сказать, с его возвратом из функции. return уже занят list-ом, так что нужен какой-то другой способ...
P.S.: В общем-то можно формировать, например, двухмерный динамический массив, содержащий в строке имя файла и дату его создания. Условие одно он должен создаваться в одной функции, а доступным быть и в других. Это бы наверное даже лучше было бы, красивее и удобнее. Самой мне не написать так, но я бы с удовольствием поразбиралась что к чему, если б это кто-нить написал Х))
Спасибо )
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,608
27.07.2011, 13:13 #23
Цитата Сообщение от Sonador Посмотреть сообщение
программа должна сформировать в отдельной функции 2 массива один с именами файлов, а другой с их датами их создания.
Правильнее было бы сделать структуру
C
1
2
3
4
typedef struct {
    char * name;
    FILETIME created;
} filedate_t;
и массив из таких структур. Ну или список
C
1
2
3
4
5
typedef struct FILEDATE_T {
    char * name;
    FILETIME created;
    struct FILEDATE_T * next;
} filedate_t;
и заполнять их по мере нахождения файлов...
Вот под линух что-то похожее. Основной смысл тот же, только имя и время винапэишными функциями получайте...
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
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
 
#define NAME_LEN 256
#define DATE_LEN 64
 
typedef struct FILE_N_DATE {
    char name[NAME_LEN];
    char date[DATE_LEN];
    struct FILE_N_DATE * next;
} fnd_t;
 
fnd_t * new_file(struct dirent * d){
    fnd_t * f;
    struct stat st;
    
    if ( ! ( f = calloc(1, sizeof(fnd_t)) ) )
        return NULL;
    
    strncpy(f->name, d->d_name, NAME_LEN - 1);
    if ( stat(f->name, &st) ){
        free(f);
        return NULL;
    }
    strncpy(f->date, ctime(&st.st_ctime), DATE_LEN - 1);
    f->next = NULL;
    
    return f;
}
 
void dump(const fnd_t * f){
    if ( f ){
        printf("%-30s %s", f->name, f->date);
        dump(f->next);
    }
}
 
int main(void){
    fnd_t * first, * last, * cur;
    DIR * dir;
    struct dirent * sd;
    
    if ( ! ( dir = opendir(".") ) ){
        fprintf(stderr, "Can't open current directory for read!\n");
        exit(1);
    }
    
    first = last = NULL;
    while ( sd = readdir(dir) ){
        if ( strcmp(sd->d_name, ".") && strcmp(sd->d_name, "..") ){
            if ( ! ( cur = new_file(sd) ) ){
                fprintf(stderr, "Can't get information about file!\n");
                while ( first ){
                    last = first->next;
                    free(first);
                    first = last;
                }
                exit(1);
            }
            if ( ! first )
                first = cur;
            else
                last->next = cur;
            last = cur;
        }
    }
    
    if ( closedir(dir) )
        fprintf(stderr, "WARNING! Directory was not properly closed!\n");
    
    if ( ! first )
        printf("No files found.\n");
    else {
        dump(first);
        
        while ( first ){
            last = first->next;
            free(first);
            first = last;
        }
    }
    
    exit(0);
}
Правда, тут я погорячился немного - время создания, конечно нужно было бы, как число хранить (time_t или FILETIME).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2011, 13:13
Привет! Вот еще темы с ответами:

Рекурсивная функция, которая методом деления отрезка пополам находит корень уравнения - C++
Разработать и испытать рекурсивную функцию Root (а, b, ε), которая методом деления отрезка пополам находит с точностью ε корень уравнения...

Рекурсивная функция, которая находит позицию начала последовательности из 10 чисел, сумма которых минимальна - C++
Добрый день, помогите пожалуйста с программой. Напишите рекурсивную функцию, которая принимает одномерный массив из 100 целых чисел...

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

Функция, которая для заданного целого числа m находит среди первых m^2-1 чисел Фибоначчи хотя бы одно, делящееся на m (перевести на Си) - C++
Условие: Напишите функцию, которая для заданного целого числа m находит среди первых m2-1 чисел Фибоначчи хотя бы одно, делящееся на m ...


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

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

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