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

Directory - C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
SergK
0 / 0 / 0
Регистрация: 10.08.2009
Сообщений: 4
10.08.2009, 01:12     Directory #1
Доброго времени суток! Я новичек в с++
В процессе написания консольного приложения столкнулся с такой проблемой:
как поочередно считать данные из txt файлов находящихся в указанной папке,
имя и кол-во файлов заранее не известно. Вывод: результирующий файл с именами txt файлов и количеством строк в них. Например:
Код
File1    18999
File2    56
.................
FileN    565678
Подскажите пожалуйста! Заранее благодарен!!!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gravity
 Аватар для Gravity
556 / 550 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
10.08.2009, 01:43     Directory #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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <errno.h>
 
void fcn(FILE *ifp, FILE *ofp, char *ifname)
{
    char buf[1024];
    long nlines = 0;
 
    while(fgets(buf, sizeof(buf), ifp) != NULL)
        nlines++;
    fprintf(ofp, "%s: %ld lines\n", ifname, nlines);
}
 
main()
{
    const char *ofname = "result.txt";
    FILE *ifp, *ofp;
    DIR *dp;
    struct dirent *dirl;
 
    if( (ofp = fopen(ofname, "w")) == NULL) {
        printf("fopen: %s: %s\n", ofname, strerror(errno));
        return EXIT_FAILURE;
    }
    if( (dp = opendir(".")) == NULL) {
        printf("opendir: %s: %s\n", ".", strerror(errno));
        return EXIT_FAILURE;
    }
    while( (dirl = readdir(dp)) != NULL) {
        if(strcmp(dirl->d_name, ofname) == 0)
            continue;
        if(strstr(dirl->d_name, ".txt") != NULL) {
            if( (ifp = fopen(dirl->d_name, "r")) == NULL) {
                printf("fopen: %s: %s\n", dirl->d_name, strerror(errno));
                continue;
            }
            fcn(ifp, ofp, dirl->d_name);
            fclose(ifp);
        }
    }
    fclose(ofp);
    return EXIT_SUCCESS;
}
Под виндой не проверял.
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1345 / 878 / 51
Регистрация: 02.01.2009
Сообщений: 2,642
Записей в блоге: 1
10.08.2009, 03:03     Directory #3
Gravity, хм.. просили на С++, не на Си
Gravity
 Аватар для Gravity
556 / 550 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
10.08.2009, 03:06     Directory #4
ISergey, как показывает практика, новички плохо видят разницу между Си и плюс-плюсом, путая одно с другим, так что...
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1345 / 878 / 51
Регистрация: 02.01.2009
Сообщений: 2,642
Записей в блоге: 1
10.08.2009, 03:09     Directory #5
Цитата Сообщение от Gravity Посмотреть сообщение
ISergey, как показывает практика, новички плохо видят разницу между Си и плюс-плюсом, путая одно с другим, так что...
Ну да.. но если написать на С++ то быстро находят
SergK
0 / 0 / 0
Регистрация: 10.08.2009
Сообщений: 4
10.08.2009, 12:35  [ТС]     Directory #6
Спасибо Gravity,структура кода понятна.
Но пробую компилить под винду и не находит библиотеки <dirent.h>
может есть альтернатива какая-то для Windows
-=ЮрА=-
Заблокирован
Автор FAQ
10.08.2009, 12:40     Directory #7
А это мой вариант решения на С++...
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include <windows.h>
#include <shlobj.h>
#include <stdio.h>
 
LPTSTR SelectPath();//Выбор каталога
//Получения списка файлов
int GetFileList(LPTSTR sPath);
//Вычисление числа строк в файлах
int GetNumStrings(LPTSTR sPath);
 
WIN32_FIND_DATA * pFILEDATA = 
        (WIN32_FIND_DATA *)malloc(sizeof(WIN32_FIND_DATA));
 
void main()
{
    FILE * f = fopen("Result.txt","wb+");
    int FILE_COUNT,nStrings;
    char sPath[MAX_PATH];sPath[0] = '\0';
    if(f && strcpy(sPath,SelectPath()))
    {
        fprintf(f,"Directory selected : %s\r\n",sPath);
        printf("Directory selected : %s\r\n",sPath);
        FILE_COUNT = GetFileList(sPath);
        while(0 < FILE_COUNT)
        {
            if(FILE_ATTRIBUTE_DIRECTORY ^ pFILEDATA[FILE_COUNT-1].dwFileAttributes)
            {
            strcat(sPath,pFILEDATA[FILE_COUNT-1].cFileName);
            GetShortPathName((LPCTSTR)sPath,sPath,MAX_PATH);
            if(strstr(sPath,".TXT") != NULL)
            {
                nStrings = GetNumStrings(sPath);
                fprintf
                (
                    f,
                    "%s : %d\r\n",
                    pFILEDATA[FILE_COUNT-1].cFileName,
                    nStrings
                );
                //Для печати русских названий каталлогов
                CharToOem(
                    pFILEDATA[FILE_COUNT-1].cFileName,
                    pFILEDATA[FILE_COUNT-1].cFileName);
                printf
                (
                    "%s : %d\r\n",
                    pFILEDATA[FILE_COUNT-1].cFileName,
                    nStrings
                );
            }
            sPath[strlen(sPath) - strlen(strrchr(sPath,'\\')) + 1] = '\0';
            }
            FILE_COUNT--;
        }
        fclose(f);
        pFILEDATA = (WIN32_FIND_DATA *)
            realloc((void *)pFILEDATA,sizeof(WIN32_FIND_DATA));
    }
    printf("1 - Choose other Directory\r\n");
    scanf("%d",&FILE_COUNT);
    if(FILE_COUNT == 1)
        main();
}
 
LPTSTR SelectPath()
{
    char sPath[MAX_PATH];sPath[0] = '\0';
    LPCITEMIDLIST lpItemDList;
    BROWSEINFO bi = {NULL, NULL, sPath,
       "Выберите директорию для обработки",
        BIF_DONTGOBELOWDOMAIN/*|BIF_BROWSEINCLUDEFILES*/,
        NULL,
        NULL,
        0
    };
    if((lpItemDList=SHBrowseForFolder(&bi)))
    {
        if(SHGetPathFromIDList(lpItemDList, sPath))
            GetShortPathName((LPCTSTR)sPath,sPath,strlen(sPath));
    }
    return &sPath[0];
}
 
int GetFileList(LPTSTR sPath)
{
    int FILE_COUNT = 0;
    HANDLE hFile = FindFirstFile(strcat(sPath,"\\*.*"),&pFILEDATA[FILE_COUNT]);
    if (hFile!=INVALID_HANDLE_VALUE)
    {
        do
        {
            if
            (
            strlen(pFILEDATA[FILE_COUNT].cFileName) == 1
            &&
            strchr(pFILEDATA[FILE_COUNT].cFileName,'.') !=NULL
            )
            if(FindNextFile(hFile,&pFILEDATA[FILE_COUNT]) == 0)
                break;
            if
            (
            strlen(pFILEDATA[FILE_COUNT].cFileName) == 2   
            &&
            strstr(pFILEDATA[FILE_COUNT].cFileName,"..") !=NULL
            )
            if(FindNextFile(hFile,&pFILEDATA[FILE_COUNT]) == 0)
                break;
            FILE_COUNT++;
            pFILEDATA = (WIN32_FIND_DATA *)
                realloc((void *)pFILEDATA,sizeof(WIN32_FIND_DATA)*(FILE_COUNT + 1));
            if(pFILEDATA == NULL)
                break;
        }
        while(FindNextFile(hFile,&pFILEDATA[FILE_COUNT]));
        FindClose(hFile);
        FILE_COUNT--;
    }
    sPath[strlen(sPath) - strlen(strrchr(sPath,'\\')) + 1] = '\0';
    return FILE_COUNT;
}
 
int GetNumStrings(LPTSTR sPath)
{
    FILE * f;
    long fLen;
    char * str, * chBuf;
    int RetVal = 0;
    if((f = fopen(sPath,"rb+")))
    {
        fseek(f,0,SEEK_END);
        fLen = ftell(f);
        fseek(f,0,SEEK_SET);
        str = (char *)malloc(fLen);
        str[0] = '\0';
        fread(str,1,fLen,f);
        fclose(f);
        chBuf = strchr(str,'\n');
        while(chBuf)
        {
            RetVal++;
            chBuf++;
            chBuf = strchr(chBuf,'\n');
        }
        free(str);
    }
    else
        printf("Error while open %s\r\n",sPath);
    return RetVal;
}
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1345 / 878 / 51
Регистрация: 02.01.2009
Сообщений: 2,642
Записей в блоге: 1
10.08.2009, 12:46     Directory #8
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
А это мой вариант решения на С++...
Насмешить решил?
-=ЮрА=-
Заблокирован
Автор FAQ
10.08.2009, 13:16     Directory #9
Чем именно?

Добавлено через 2 минуты 37 секунд
Цитата Сообщение от ISergey Посмотреть сообщение
Насмешить решил?
Чем именно?
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1345 / 878 / 51
Регистрация: 02.01.2009
Сообщений: 2,642
Записей в блоге: 1
10.08.2009, 13:28     Directory #10
Тем что много элементов Си..
-=ЮрА=-
Заблокирован
Автор FAQ
10.08.2009, 13:48     Directory #11
Цитата Сообщение от ISergey Посмотреть сообщение
Тем что много элементов Си..
Писал в Visual Studio 6.0 в типе проекта Console Aplication, чем же ещё тогда как не студией на С++ писать???Или надо в MFC всё делать чтоб С++ называлось?С++ наследник Си так что по большому счёту всё на Си))))

Если можно хотябы на паре моментов как для начинающего ISergey покажи пожалусто где именно Си...
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
10.08.2009, 13:55     Directory #12
Цитата Сообщение от ISergey Посмотреть сообщение
Тем что много элементов Си..
Тем что нет ни одного С++ элемента

Добавлено через 1 минуту 21 секунду
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Если можно хотябы на паре моментов как для начинающего ISergey покажи пожалусто где именно Си...
откомпилируйте ваш код С компилятором. Если не компилируется - значит в коде или синтаксические ошибки или С++ конструкции.
А если компилируется - значит у вас С код, а не С++.
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1345 / 878 / 51
Регистрация: 02.01.2009
Сообщений: 2,642
Записей в блоге: 1
10.08.2009, 13:57     Directory #13
Как минимум
FILE * f = fopen("Result.txt","wb+"); есть std::ofstream
printf(..); есть std::cout << ....;
Gravity
 Аватар для Gravity
556 / 550 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
10.08.2009, 14:03     Directory #14
По-моему, принципиально ничего не изменится, если заменить printf на cout, scanf на cin, и еще воткнуть в коде эквивалентные cpp'шные функции. Стиль-то останется тот же сишный.
SergK
0 / 0 / 0
Регистрация: 10.08.2009
Сообщений: 4
10.08.2009, 20:29  [ТС]     Directory #15
Разобрался с кодом Gravity под виндой работает отлично но на С не пойму некоторых моментов:
result.txt
1156_090.TXT: 550 lines
1160_090.TXT: 223 lines
1164_090.TXT: 90 lines
Мне надо
1156 : 550 lines
1160 : 223 lines
1164 : 90 lines
И чтобы первая колонка "имя файла" всегда была упорядочена по возрастанию
начиная с наименьшего (сейчас с произвольного имени по возрастанию)
Время поджимает и некогда разобраться Помогите если не трудно!
SergK
0 / 0 / 0
Регистрация: 10.08.2009
Сообщений: 4
10.08.2009, 21:40  [ТС]     Directory #16
Спасибо и за предложенные варианты ! А напрягать никого не хотел
просто сам не смог разобраться попросил совет
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2009, 21:58     Directory
Еще ссылки по теме:

Vcl.h: No such file or directory C++
Реализация класса Directory C++
C++ Crtdefs.h: no such file or directory
C++ Vcl.h: No such file or directory
C++ No such file or directory compilation terminated

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

Или воспользуйтесь поиском по форуму:
Gravity
 Аватар для Gravity
556 / 550 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
10.08.2009, 21:58     Directory #17
Цитата Сообщение от SergK Посмотреть сообщение
И чтобы первая колонка "имя файла" всегда была упорядочена по возрастанию
начиная с наименьшего (сейчас с произвольного имени по возрастанию)
Тогда нужно завести массив с именами txt файлов, отсортировать его по алфавиту и оставить в именах только название без расширения. После этого по порядку отправляй файлы из массива в функцию подсчета строк.
Yandex
Объявления
10.08.2009, 21:58     Directory
Ответ Создать тему
Опции темы

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