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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 5.00
RRus
0 / 0 / 0
Регистрация: 02.11.2012
Сообщений: 13
#1

Указатели и разадресация - C++

01.04.2013, 22:38. Просмотров 2485. Ответов 17
Метки нет (Все метки)

Программа осуществляет поиск файлов и их сортировку. В массив, хранящий атрибуты найденных файлов заносятся адреса атрибутов а не нужная мне инфа(насколько я понял). Помогите плз,третий вечер сижу...
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
#include "stdafx.h"
#include "conio.h"
#include "stdlib.h"
#include "io.h"
#include "time.h"
#include "cstringt.h"
#include "iostream"
#include "iomanip"
#include <fstream>
#include <string>
#define _CRT_SECURE_NO_WARNINGS
 
    struct list
   {
     struct _finddata_t *findD;
     list *next, *prev;
   };
 
 
// Ищет файлы на диске
bool FindFile(char *Path, char *Mask);
// Выводит найденную информацию на экран монитора и в файл
void PrintData(char *NameFile, struct _finddata_t *findData);
// Выводитна экрнан меню
int Menu(void);
 
// Прототипы функций сравнения
int CompareNameFile( const void *arg1, const void *arg2 );
int CompareSizeFile( const void *arg1, const void *arg2 );
int CompareDateFile( const void *arg1, const void *arg2 );
 
using namespace std;
 _CRT_SECURE_NO_WARNINGS;
// Глобальные переменные
int g_SumFile = 0;     // Количество найденных файлов
 list *ph = NULL;
 
void Add(struct _finddata_t *findData)
 {  
    list *q = new list;
    q->next=ph;
    q->findD= findData;
    ph=q;}
  
int _tmain(int argc, _TCHAR* argv[])
{
   int i;
   char File[] = "File.txt";
   char FileSortName[] = "FileSortName.txt";
   char FileSortSize[] = "FileSortSize.txt";
   char FileSortDate[] = "FileSortDate.txt";
   struct _finddata_t *findData;
   struct _finddata_t *find;
   char Path[] = "G:\\" ;
   char Mask[] = "*.exe";
   setlocale(LC_ALL, "Russian_Russia.1251");
 
   // Код ввода данных
 
g_SumFile = 0; // Обнуляем счетчик найденных файлов
FindFile(Path, Mask); //Рекурсивный поиск файлов на диске
 
//Динамическое выделение памяти для массива
find = new _finddata_t[g_SumFile];
list *q;
q=ph;
i=0;
 while (i<g_SumFile) 
 {   
              strcpy (find[i].name,q->findD->name);
              find[i].size=q->findD->size;
              find[i].time_create=q->findD->time_create;
            q=q->next;
            i++;
            }
while (ph!=NULL) {
q = ph;
ph = ph->next ;
delete q;
}
 
 
PrintData(File, find);
_getch();
 
do
{
    //Вывод на экран меню
    int NumbMenu = Menu();
    switch(NumbMenu)
    {
    case 0:  //заканчиваем работу
         delete[] find;
         return 0;
    case 1:
         qsort((void*)find, g_SumFile,
             sizeof(find[0]), CompareNameFile);
         // Выводим найденную информацию на экран и в файл
         PrintData(FileSortName, find);
         _getch();
         break;
    case 2:
         qsort((void*)find, g_SumFile,
              sizeof(find[0]), CompareSizeFile);
         // Выводим найденную информацию на экран и в файл
         PrintData(FileSortSize, find);
         _getch();
         break;
    case 3:
         qsort((void*)find, g_SumFile,
              sizeof(find[0]), CompareDateFile);
         // Выводим найденную информацию на экран и в файл 
         PrintData(FileSortDate, find);
         _getch();
         break;
     }
   } while(1);
   _getch();
   delete[] findData;
   return 0;
 }
//////////////////////////////////////////////////////////////////
// Функция сравнения по имени файлов
int CompareNameFile( const void *a1, const void *a2 )
{
struct _finddata_t *item1=(struct _finddata_t*)a1;
    struct _finddata_t *item2=(struct _finddata_t*)a2;
 
        return (_stricmp(item1->name,item2->name));
}
int CompareDateFile( const void *a1, const void *a2 )
{
struct _finddata_t *item1=(struct _finddata_t*)a1;
    struct _finddata_t *item2=(struct _finddata_t*)a2;
 
    if (item1->time_create<item2->time_create) return -1;
    else if (item1->time_create>item2->time_create) return 1;
    return 0;
}
int CompareSizeFile( const void *a1, const void *a2 )
{
struct _finddata_t *item1=(struct _finddata_t*)a1;
    struct _finddata_t *item2=(struct _finddata_t*)a2;
 
    if (item1->size<item2->size) return -1;
    else if (item1->size>item2->size) return 1;
    return 0;
}        
         
///////////////////////////////////////////////////////////////////
// Выыодит меню на экран
int Menu(void)
{
    int n;
    cout<<"Команды меню: "<<endl;
    cout<<"0 - завершение работы."<<endl;
    cout<<"1 - сортировка найденных файлов по имени."<<endl;
    cout<<"2 - сортировка найденных файлов по размеру."<<endl;
    cout<<"3 - сортировка найденных файлов по дате создания."<<endl;
    cout<<"\nВведите команду меню: ";
    cin>>n;
    return n;
 
}
 
 
////////////////////////////////////////////////////////////////////
// Рекурсивный поиск файлов на диске
bool FindFile(char *Path, char *Mask)
{
int i=0;
    struct _finddata_t findData;
    intptr_t hFile;
    char FullName1[_MAX_PATH];
    strcpy_s(FullName1,_MAX_PATH-1,Path);
    strcat_s(FullName1,_MAX_PATH-1,"*.*");
    if ( (hFile=_findfirst(FullName1,&findData))!=-1L)
        do
        {
            if (findData.attrib==_A_SUBDIR &&
                (_strcmpi(findData.name,".") &&
                _strcmpi(findData.name,"..")))
            {
                char NextPatch[_MAX_PATH];
                strcpy_s(NextPatch,_MAX_PATH-1,Path);
                strcat_s(NextPatch,_MAX_PATH-1,findData.name);
                strcat_s(NextPatch,_MAX_PATH-1,"\\");
                FindFile(NextPatch,Mask);
            }
        }while(_findnext(hFile,&findData)==0);
        char FullName2[_MAX_PATH];
        strcpy_s(FullName2,_MAX_PATH-1,Path);
        strcat_s(FullName2,_MAX_PATH-1,"\\");
        strcat_s(FullName2,_MAX_PATH-1,Mask);
        
        if ((hFile=_findfirst(FullName2,&findData))==-1L)
            return true;
        do
        {
            g_SumFile++;
 
            Add(&findData);
            /*while (i!=g_SumFile) {
            list *q = new list;
            
            q->list::findD->size=findData.size;
            q->next=ph;
            ph=q;
            i++;
            }
            */
        } while(_findnext(hFile,&findData)==0);
        _findclose(hFile);
    return true;
}
 
 
void PrintData(char *NameFile, struct _finddata_t *find)
{
ofstream file(NameFile);
 
int i=0;
  while (i!=g_SumFile)
   {
       cout<<"Файл : "<<find[i].name<<" "<<"Размер файла :"<<find[i].size<<"Датасоздания :"<<find[i].time_create<<endl;
     
       
               
       file<<"Файл : "<<find[i].name<<" "<<"Размер файла :"<<find[i].size<<"Датасоздания :"<<find[i].time_create<<endl;
       
       
       
       i++;
       
   }
}
Пример работы:
Миниатюры
Указатели и разадресация  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.04.2013, 22:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатели и разадресация (C++):

Разадресация указателя в массив из указателей - C++
float *A, **B; A = new float ; B = new float* ; for (int i = 0; i &lt; n; i++) { //*(A + i) = rand()%1000 / 100; *(A + i) = n -...

Неправильная разадресация указателя на массив в цикле - C++
Всем доброго времени суток! Столкнулся с такой проблемой: Есть массив a заполненный неотрицательными целыми числами. Есть...

Указатели и указатели на указатели, а также типы данных - C++
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно. Накачал литературы, буду изучать) Щас...

Через указатели на указатели посчитать сумму двух чисел и записать в третье - C++
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать примитивный калькулятор, пользуясь только...

Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной - C++
Мой код. #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include&lt;iomanip&gt; using namespace std; void min_max(int*pa, int*pb,...

Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов? - C++
Есть массив int **mas; mas=new int*; // выделил место под пять строк, верно ? mas=new int;// выделил для первой строки матрицы два...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
01.04.2013, 23:01 #2
Отвечай на вопросы. Имеем:
C++
1
char Path[] = "E:\\put\\";
В папке E:\put три экзешника:
main_0.exe, main_1.exe и main_2.exe и больше ничего нет
Я правильно понял, что
C++
1
PrintData(File, find);
должна вывести эти имена+ какие-то там атрибуты?
RRus
0 / 0 / 0
Регистрация: 02.11.2012
Сообщений: 13
02.04.2013, 01:13  [ТС] #3
именно
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
02.04.2013, 01:29 #4
Ну вот этим и займись. Создай папку
C:\put
и запихай туда три экзешника. Добейся сперва чтобы PrintData правильно все имена вывела, а то у меня выводит три раза подряд имя main_2.exe с какими-то якобы атрибутами.
А потом будем двигаться дальше. Спрашивай, что непонятно.
RRus
0 / 0 / 0
Регистрация: 02.11.2012
Сообщений: 13
02.04.2013, 01:41  [ТС] #5
Тут косяк с заносом атрибутов в структуру list из findData в строке 202, в этом я убедился, а PrintData работает нормально.
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
02.04.2013, 01:57 #6
Ну как знаешь
RRus
0 / 0 / 0
Регистрация: 02.11.2012
Сообщений: 13
02.04.2013, 19:27  [ТС] #7
А я думал мне хоть здесь помогут...
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
02.04.2013, 19:38 #8
Рызыменование знаю, разадресацию впервые вижу.
RRus
0 / 0 / 0
Регистрация: 02.11.2012
Сообщений: 13
02.04.2013, 19:59  [ТС] #9
Код чутка переделал, теперь вот что получается:
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
#include "stdafx.h"
#include "conio.h"
#include "stdlib.h"
#include "io.h"
#include "time.h"
#include "cstringt.h"
#include "iostream"
#include "iomanip"
#include <fstream>
#include <string>
#define _CRT_SECURE_NO_WARNINGS
 
    struct list
   {
     struct _finddata_t *findD;
     list *next;
   };
 
 
// Ищет файлы на диске
bool FindFile(char *Path, char *Mask);
// Выводит найденную информацию на экран монитора и в файл
void PrintData(char *NameFile, struct _finddata_t *findData);
// Выводитна экрнан меню
int Menu(void);
 
// Прототипы функций сравнения
int CompareNameFile( const void *arg1, const void *arg2 );
int CompareSizeFile( const void *arg1, const void *arg2 );
int CompareDateFile( const void *arg1, const void *arg2 );
 
using namespace std;
 _CRT_SECURE_NO_WARNINGS;
// Глобальные переменные
int g_SumFile = 0;     // Количество найденных файлов
 list *ph = NULL;
 
void Add(struct _finddata_t *findData)
 {  
    list *q = new list;
    q->next=ph;
    q->findD= findData;
    ph=q;
    }
  
int _tmain(int argc, _TCHAR* argv[])
{
   int i;
   char File[] = "File.txt";
   char FileSortName[] = "FileSortName.txt";
   char FileSortSize[] = "FileSortSize.txt";
   char FileSortDate[] = "FileSortDate.txt";
   struct _finddata_t *findData;
   struct _finddata_t *find;
   char Path[] = "G:\\" ;
   char Mask[] = "*.torrent";
   setlocale(LC_ALL, "Russian_Russia.1251");
 
   // Код ввода данных
 
g_SumFile = 0; // Обнуляем счетчик найденных файлов
FindFile(Path, Mask); //Рекурсивный поиск файлов на диске
 
//Динамическое выделение памяти для массива
find = new _finddata_t[g_SumFile];
list *q;
q=ph;
i=0;
 while (q!=NULL) 
 {   
              strcpy(find[i].name, q->findD->name);
              find[i].size=q->findD->size;
              find[i].time_create=q->findD->time_create;
    /* find[i]=q->findD;*/
            q=q->next;
            i++;
            }
while (ph!=NULL) {
q = ph;
ph = ph->next ;
delete q;
}
 
 
PrintData(File, find);
_getch();
 
do
{
    //Вывод на экран меню
    int NumbMenu = Menu();
    switch(NumbMenu)
    {
    case 0:  //заканчиваем работу
         delete[] find;
         return 0;
    case 1:
         qsort((void*)find, g_SumFile,
             sizeof(find[0]), CompareNameFile);
         // Выводим найденную информацию на экран и в файл
         PrintData(FileSortName, find);
         _getch();
         break;
    case 2:
         qsort((void*)find, g_SumFile,
              sizeof(find[0]), CompareSizeFile);
         // Выводим найденную информацию на экран и в файл
         PrintData(FileSortSize, find);
         _getch();
         break;
    case 3:
         qsort((void*)find, g_SumFile,
              sizeof(find[0]), CompareDateFile);
         // Выводим найденную информацию на экран и в файл 
         PrintData(FileSortDate, find);
         _getch();
         break;
     }
   } while(1);
   _getch();
   delete[] findData;
   return 0;
 }
//////////////////////////////////////////////////////////////////
// Функция сравнения по имени файлов
int CompareNameFile( const void *a1, const void *a2 )
{
struct _finddata_t *item1=(struct _finddata_t*)a1;
    struct _finddata_t *item2=(struct _finddata_t*)a2;
 
        return (_stricmp(item1->name,item2->name));
}
int CompareDateFile( const void *a1, const void *a2 )
{
struct _finddata_t *item1=(struct _finddata_t*)a1;
    struct _finddata_t *item2=(struct _finddata_t*)a2;
 
    if (item1->time_create<item2->time_create) return -1;
    else if (item1->time_create>item2->time_create) return 1;
    return 0;
}
int CompareSizeFile( const void *a1, const void *a2 )
{
struct _finddata_t *item1=(struct _finddata_t*)a1;
    struct _finddata_t *item2=(struct _finddata_t*)a2;
 
    if (item1->size<item2->size) return -1;
    else if (item1->size>item2->size) return 1;
    return 0;
}        
         
///////////////////////////////////////////////////////////////////
// Выыодит меню на экран
int Menu(void)
{
    int n;
    cout<<"Команды меню: "<<endl;
    cout<<"0 - завершение работы."<<endl;
    cout<<"1 - сортировка найденных файлов по имени."<<endl;
    cout<<"2 - сортировка найденных файлов по размеру."<<endl;
    cout<<"3 - сортировка найденных файлов по дате создания."<<endl;
    cout<<"\nВведите команду меню: ";
    cin>>n;
    return n;
 
}
 
 
////////////////////////////////////////////////////////////////////
// Рекурсивный поиск файлов на диске
bool FindFile(char *Path, char *Mask)
{
int i=0;
    struct _finddata_t findData;
    intptr_t hFile;
    char FullName1[_MAX_PATH];
    strcpy_s(FullName1,_MAX_PATH-1,Path);
    strcat_s(FullName1,_MAX_PATH-1,"*.*");
    if ( (hFile=_findfirst(FullName1,&findData))!=-1L)
        do
        {
            if (findData.attrib==_A_SUBDIR &&
                (_strcmpi(findData.name,".") &&
                _strcmpi(findData.name,"..")))
            {
                char NextPatch[_MAX_PATH];
                strcpy_s(NextPatch,_MAX_PATH-1,Path);
                strcat_s(NextPatch,_MAX_PATH-1,findData.name);
                strcat_s(NextPatch,_MAX_PATH-1,"\\");
                FindFile(NextPatch,Mask);
            }
        }while(_findnext(hFile,&findData)==0);
        char FullName2[_MAX_PATH];
        strcpy_s(FullName2,_MAX_PATH-1,Path);
        strcat_s(FullName2,_MAX_PATH-1,"\\");
        strcat_s(FullName2,_MAX_PATH-1,Mask);
        
        if ((hFile=_findfirst(FullName2,&findData))==-1L)
            return true;
        do
        {
            g_SumFile++;
                                       // Список пустой
        
            Add(&findData);
            //while (i!=g_SumFile) {
            /*list *q = new list;
            q->findD=&findData;
            q=q->next;
            ph=q;
            */
 
            //i++
            
        } while(_findnext(hFile,&findData)==0);
        _findclose(hFile);
    return true;
}
 
 
void PrintData(char *NameFile, struct _finddata_t *find)
{
ofstream file(NameFile);
 
int i=0;
  while (i!=g_SumFile)
   {
       cout<<"Файл : "<<find[i].name<<" "<<"Размер файла :"<<find[i].size<<" Датасоздания :"<<find[i].time_create<<endl;
       file<<"Файл : "<<find[i].name<<" "<<"Размер файла :"<<find[i].size<<" Датасоздания :"<<find[i].time_create<<endl;
       i++;
       
   }
}
Миниатюры
Указатели и разадресация  
RRus
0 / 0 / 0
Регистрация: 02.11.2012
Сообщений: 13
02.04.2013, 20:01  [ТС] #10
Косяк в функции Add . Почему заносится лишь последний файл?
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
02.04.2013, 20:05 #11
удалить
RRus
0 / 0 / 0
Регистрация: 02.11.2012
Сообщений: 13
02.04.2013, 20:14  [ТС] #12
Что удалить?
kravam
02.04.2013, 20:35
  #13

Не по теме:

Слушай, дружище, не обижайся, если ты определил что косяк в функции Add, какого рожна ты паровозом выкладываешь всё остальное, всю реализацию меню? Ты думаешь, что людям по кайфу будет видеть, на что ты способен? Я создаю тему, делаю код минимальным, а изначально он много больше твоего. И мне помогают. А тебе- ну если кто-то захочет разбираться в явно ненужных перипитиях... Убирай на фиг меню вообще, вызывай Add и ВСЁ НА ЭТОМ. Остальное в топку.

RRus
0 / 0 / 0
Регистрация: 02.11.2012
Сообщений: 13
02.04.2013, 20:40  [ТС] #14
мда...

Добавлено через 55 секунд
Add
C++
1
2
3
4
5
6
7
void Add(struct _finddata_t *findData)
 {  
    list *q = new list;
    q->next=ph;
    q->findD= findData;
    ph=q;
    }
RRus
0 / 0 / 0
Регистрация: 02.11.2012
Сообщений: 13
02.04.2013, 20:49  [ТС] #15
Если наглядно:
Миниатюры
Указатели и разадресация   Указатели и разадресация   Указатели и разадресация  

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2013, 20:49
Привет! Вот еще темы с ответами:

Отсортировать массив и вывести на экран (массивы и указатели на указатели) - C++
Даны массивы F-фамилий студентов и S-результаты сессии (5 оценок) , причем s- результат сессии F студента. Отсортировать массив S по...

Написать программу сортировки через указатели на указатели - C++
Вот моя программа #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string&gt; using namespace std; //Сортировка &quot;пузырьком&quot;. ...

Указатели на слонов или А зачем нужны указатели? - C++
Знаю что таких вопросов было уйма, но я так и не нашел ответа на свой вопрос. Для чего нужны указатели? Что такое указатели я знаю, это...

Используются ли на практике указатели на указатели объектов? - C++
Имеются ввиду указатели именно на объекты, а не динамические массивы. Например такой: Object** obj; А как насчёт такого: Object***...


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

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

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