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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
SergK
0 / 0 / 0
Регистрация: 10.08.2009
Сообщений: 4
#1

Directory - C++

10.08.2009, 01:12. Просмотров 1636. Ответов 16
Метки нет (Все метки)

Доброго времени суток! Я новичек в с++
В процессе написания консольного приложения столкнулся с такой проблемой:
как поочередно считать данные из txt файлов находящихся в указанной папке,
имя и кол-во файлов заранее не известно. Вывод: результирующий файл с именами txt файлов и количеством строк в них. Например:
Код
File1    18999
File2    56
.................
FileN    565678
Подскажите пожалуйста! Заранее благодарен!!!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2009, 01:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Directory (C++):

No such file or directory - C++
пытаюсь разобраться с visual C++, беру программу из книжки visual c++ для начинающих, делаю, как написано: Что бы начать изучать C++...

No such file in directory - C++
Для компила проекта нужен один заголовочный файл. Я его поместил в папку с проектом, а он не обнаруживается. При компиле выдается ошибка:...

Vcl.h: No such file or directory - C++
Программа не может открыть библиотеку vcl.h Работаю на Dev C++ 5.6.3 OC: Windows 8.1. пмоогите!!

Crtdefs.h: no such file or directory - C++
Собираю libpq с помощью nmake(VS 2013, nmake для меня - тёмный лес, я вообще с консольными копмпиляторами не в ладах), при сборке выдаёт...

targetver.h: No such file or directory. - C++
Подскажите пожалуйста что за трабл. во всех файлах компилятор Dev-C++ - выдаёт ошибку типа: Подскажите пожалуйста как от них...

stdafx.h: No such file or directory - C++
Как убрать ошибку? stdafx.h: No such file or directory.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
10.08.2009, 01:43 #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
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 1
10.08.2009, 03:03 #3
Gravity, хм.. просили на С++, не на Си
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
10.08.2009, 03:06 #4
ISergey, как показывает практика, новички плохо видят разницу между Си и плюс-плюсом, путая одно с другим, так что...
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 1
10.08.2009, 03:09 #5
Цитата Сообщение от Gravity Посмотреть сообщение
ISergey, как показывает практика, новички плохо видят разницу между Си и плюс-плюсом, путая одно с другим, так что...
Ну да.. но если написать на С++ то быстро находят
SergK
0 / 0 / 0
Регистрация: 10.08.2009
Сообщений: 4
10.08.2009, 12:35  [ТС] #6
Спасибо Gravity,структура кода понятна.
Но пробую компилить под винду и не находит библиотеки <dirent.h>
может есть альтернатива какая-то для Windows
-=ЮрА=-
Заблокирован
Автор FAQ
10.08.2009, 12:40 #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
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 1
10.08.2009, 12:46 #8
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
А это мой вариант решения на С++...
Насмешить решил?
-=ЮрА=-
Заблокирован
Автор FAQ
10.08.2009, 13:16 #9
Чем именно?

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

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

Добавлено через 1 минуту 21 секунду
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Если можно хотябы на паре моментов как для начинающего ISergey покажи пожалусто где именно Си...
откомпилируйте ваш код С компилятором. Если не компилируется - значит в коде или синтаксические ошибки или С++ конструкции.
А если компилируется - значит у вас С код, а не С++.
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 1
10.08.2009, 13:57 #13
Как минимум
FILE * f = fopen("Result.txt","wb+"); есть std::ofstream
printf(..); есть std::cout << ....;
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
10.08.2009, 14:03 #14
По-моему, принципиально ничего не изменится, если заменить printf на cout, scanf на cin, и еще воткнуть в коде эквивалентные cpp'шные функции. Стиль-то останется тот же сишный.
SergK
0 / 0 / 0
Регистрация: 10.08.2009
Сообщений: 4
10.08.2009, 20:29  [ТС] #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
И чтобы первая колонка "имя файла" всегда была упорядочена по возрастанию
начиная с наименьшего (сейчас с произвольного имени по возрастанию)
Время поджимает и некогда разобраться Помогите если не трудно!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2009, 20:29
Привет! Вот еще темы с ответами:

Iostream.h No such file or directory - C++
Помогите плиз переписать под Dev C++ #pragma hdrstop #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; #include...

Реализация класса Directory - C++
Информационная запись о файле в каталоге содержит поля: имя файла, расширение, дата и время создания, атрибуты &quot;только чтение&quot;, &quot;скрытый&quot;,...

Iostream: No such file or directory - C++
При компиляции выдаёт ошибку: Can't compile file: program.c:1:20: fatal error: iostream: No such file or directory compilation...

Vcl.h: No such file or directory - C++
Здравствуйте. Есть программа, но когда компилирую, выдает ошибку связанную с использованием библиотеки vcl.h. Посоветуйте, пожалуйста, что...


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

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

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