Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
lixod96
1 / 1 / 3
Регистрация: 18.04.2014
Сообщений: 118
1

Программа для поиска введенного слова или фразы во всех файлах каталога

26.12.2014, 17:29. Просмотров 2515. Ответов 5
Метки нет (Все метки)

Тема: Использование принципов ООП для поиска в файлах разного типа
Исходные данные

Каталоги с файлами разных типов (.txt, .xml, и html и другие).

Задание

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

Формат вывода результата:

название файла;
полный путь к файлу;
номер строки;
фраза или предложение с искомым словом или фразой:
для .txt - предложение, в котором встретилось слово;
для .xml - название объекта, в котором встретилось слово;
для .html - 3 слова слева и справа от найденного...., без тегов;
для других на выбор разработчика.

2. В программе обязательно должна использовать такие принципы и механизмы ООП как:

инкапсуляция;
наследование;
полиморфизм;
абстрактные классы;
вложение классы.
3. Входные параметры ( слово или фраза для поиска, [начальный каталог], [флаг о сканировании подкаталогов], [форматы допустимых файлов] , [имя файла для вывода результатов]

4. По результатам сканирования программа должна вывести статистику которая содержит следующую информацию:

количество найденных совпадений;
количество сканированных файлов;
количество сканированных строк;
полное время сканирования;
средние время сканирования файла.

Вот пример
 Комментарий модератора 
Тексты надо переписывать!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.12.2014, 17:29
Ответы с готовыми решениями:

Подсчет частоты повторений каждого слова во всех текстовых файлах указанного каталога (*.txt)
Не знаю как указать каталог и перебрать все файлы в нем sed -e 's/\.//g' -e 's/ /\ /g' "$1" |...

Найти строку во всех файлах заданного каталога и всех его подкаталогах
Написать скрипт для поиска заданной пользователем строки во всех файлах заданного каталога и всех...

Поиск заданной пользователем строки во всех файлах заданного каталога и всех его подкаталогах
Написать скрипт для поиска заданной пользователем строки во всех файлах заданного каталога и всех...

Подскажите утилиту для поиска текста во всех файлах, содержащих текст
Утилита grep не ищет в файлах .doc (или быть может я не правильно пользуюсь?). Подскажите как...

Редактор с возможностью многострочного поиска (замены) в файлах каталога, поддерживающий utf8
Здравствуйте! кто-нибудь знает такой?

5
student_201
Заблокирован
26.12.2014, 21:49 2
lixod96, сюда код выложить?
0
lixod96
1 / 1 / 3
Регистрация: 18.04.2014
Сообщений: 118
27.12.2014, 10:45  [ТС] 3
IDZ.h
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
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
//отсекаем повторное определение класса
#pragma once
 
#include <list>
#include <iostream>
#include <fstream>
#include <string>
#include <stack>
 
using namespace std;
 
class Result
{
protected:
    //переменные для статистики(сколько проверино, сколько найдено)
    int strCount;
    int matchesCount;
 
    //данные о поиске
    list<string>resultStr;
 
    //фраза для поиска
    string searchPhrase;
 
    //Имя файла для поиска
    string fName;
 
public:
    //
    Result(string _fName,string _searchPhrase);
    
    //запись в файл,если что-то нашли
    bool printIfSucces(string fName);
 
    //функции для доступа к статистическим переменным
    int getStrCount(){ return strCount; }
    int getMatchesCount(){ return matchesCount; }
 
    //виртуальная функция, которая и делает класс абстрактным
    //от этого класса будет наследоваться 3 класса и у каждого будет своя функия search
    //ее задача в том, чтоб заполнить resultStr найдеными совпадениями
    virtual void search() = 0;
 
};
 
Result::Result(string _fName, string _searchPhrase)
{
    searchPhrase = _searchPhrase;
    fName = _fName;
    //пока-что мы еше ничего не нашли
    strCount = 0;
    matchesCount = 0;
 
}
 
bool Result::printIfSucces(string _fName)
{
    //если не нашли ни 1го совпадения, то не записываем в файл
    if (!matchesCount) return false;
 
    //открываем файл для дозаписи результатов
    ofstream logf(_fName,ios::app);
 
    //заголовок/////////////////
 
    //находим номер символа "точка" 
    int offs = fName.find_last_of('.')+1;
 
    //копируем адресс названия файла со смещением(копируем символы после точки)
    string format(fName, offs, fName.size() - offs);
    
    //заголовок "результата"
    logf << "File name:" + fName + " Type:" + format;
 
 
    //записываем все найдкнные данные//////////
    //каждый элемент списка-это 1 найденное совпадение
    for (list<string>::iterator i = resultStr.begin(); i != resultStr.end(); ++i)
    {
        logf << endl << *(i);
    }
 
    //отступ для следующих записи
    logf << "\n\n";
 
    //закрываем файл
    logf.close();
 
 
 
    //если до этого момента дошли, то запись прошли успешно
    return true;
 
}
 
class TxtResult :public Result
{
public:
    TxtResult(string _fName, string _searchPhrase) :Result(_fName, _searchPhrase){};
    void search();
 
 
};
 
//для .txt - предложение, в котором встретилось слово;
void TxtResult::search()
{
    //буфер для считывания строки с файла
    string line;
 
    //тут формируется предложение
    string str;
 
    ifstream f(fName);
 
    //считываем построчно файл
    while (getline(f, line))
    {
        //за предложение мы будем считать строку от начала/точки до конца/точки
 
        while (!line.empty())
        {
            //ищем 3 символа, которыми может заканчиваться предложение
            int a = line.find('.'), b = line.find('!'), c = line.find('?');
 
            //запоминаем в а номер ближайшего символа
            if ((b >= 0) && (b < a)) a = b;
            if ((c >= 0) && (c < a)) a = c;
 
            //если нашли хоть 1 переменная>=0, то это конец предложения
            if ((a>=0))
            {
                //добавляем к предложению часть строки
                str.append(line.c_str(), a + 1);
 
                //выполняем поиск искомого предложения
                if (str.find(searchPhrase) != -1)
                {
                    //переобразовуем число(номер строки в файле) в строку(чтоб можно было записать)
                    char b[256];
                    string bf(itoa(strCount + 1, b, 10));
 
                    resultStr.push_back("(" + bf + "): " + str);
 
                    //даже если в предложении есть не 1 совпадение, мы засчитаем, что 1
                    //т.к. если в 1 предложении будет встречатся 3 раза слово
                    //это не так важно, как если бы оно встретилось в 3х разных
                    matchesCount++;
                }
                //в не зависимости от того нашли мы что-то или нет мы очищаем буфер предложения
                str.clear();
 
                //вырезаем с line уже исследованую часть строк
                line.erase(0, a + 1);
            }
            else
            {//признака конца предложения нет, значит записываем всю строку в предложение
                str.append(line.c_str());
                line.clear();
            }
 
        }//while (!line.empty())
 
        strCount++;
 
    }//while (f>>line)
 
    //если последнее предложение не оканчивается точкой, то 
    //выполняем поиск искомого предложения
    if (str.find(searchPhrase) != -1)
    {
        //переобразовуем число(номер строки в файле) в строку(чтоб можно было записать)
        char b[256];
        string bf(itoa(strCount + 1, b, 10));
 
        resultStr.push_back("(" + bf + "): " + str);
 
        //даже если в предложении есть не 1 совпадение, мы засчитаем, что 1
        //т.к. если в 1 предложении будет встречатся 3 раза слово
        //это не так важно, как если бы оно встретилось в 3х разных
        matchesCount++;
    }
 
}
 
class XmlResult :public Result
{
public:
    XmlResult(string _fName, string _searchPhrase) :Result(_fName, _searchPhrase){};
    void search();
 
 
};
 
//для.xml - название объекта, в котором встретилось слово;
//кроме этого будет еще выводиться количество совпадений для обьекта!
void XmlResult::search()
{
    //буфер для считывания строки с файла
    string line;
 
    string buff;
 
    //стек, который будет содержат обьект, в котор мы будем находиться
    stack<string> nom;
 
    //открываем файл для чтения
    ifstream f(fName);
 
    //мы сейчас в комментарие?
    bool itComment(false);
 
 
    //считываем построчно файл
    while (getline(f, line))
    {
 
        //переносим либо удаляем символы, пока строка не пуста
        while (!line.empty())
        {
 
            if (line[0] == '<' && !itComment)
            {
 
                if (line[1] == '/')
                {//это закрывающий эл
 
                    //нужно проверить буфер на совпадения, тк в одной строке может быть не 1 полный(окр+закрывающий) элемент
                    if (buff.find(searchPhrase) != -1)
                    {
 
                        //переобразовуем число(номер строки в файле) в строку(чтоб можно было записать)
                        char b1[256];
                        string bf1(itoa(strCount + 1, b1, 10));
 
                        //количество совпадений в данной строке
                        int lmc(0);
 
                        //ищем совпадения и запоминаем их количество
                        for (int i = 0; i <= int(buff.size() - searchPhrase.size()); i++)
                        {
 
                            if (string(buff, i, searchPhrase.size()) == searchPhrase)
                            {
                                lmc++;
                                matchesCount++;
                            }
                        }
 
                        string bf2(itoa(lmc, b1, 10));
                        
 
                        //если документ не правельно оформлен мы должны предотвратить возможное обращение 
                        //к стеку, когда он пуст
                        if (!nom.empty())
                            resultStr.push_back("(" + bf1 + "): "+bf2+" matches in object \"" + nom.top()+"\"");
                    }
                    //очищаем буфер
                    buff.clear();
                    
 
                    //удалием из стека 1 жлемент
                    nom.pop();
 
                    //удаляем все из строки, пока не встретим знак >
                    while (line[0] != '>') line.erase(0, 1);
                    //ну и ">" мы тоже должны удалить
                    line.erase(0, 1);
                }
                else
                {
                    
                    if (line[1] == '!')
                    {//это комментарий
 
                        itComment = true;
 
                        //удаляем все, пока не встретим --> или конец строки
                        for (int i = 0; i <= int(line.size() - string("-->").size()); )
                        {
 
                            if (string(buff, 0, string("-->").size()) == "-->")
                            {                           
                                itComment = false;
                                line.erase(0, 1);
                                //выходим из цикла
                                break;
                            }
 
                            line.erase(0, 1);
                        }
                        line.erase(0, 2);
                        //
                    }
                    else
                    {//это открывается новый элемент. считываем его название и доб в стек
                        //удалим знак < 
                        line.erase(0, 1);
 
                        //сюда мы записываем название элемента
                        string b;
                        //переносим символы из line в b, пока не встретим пробел или >
                        while (line[0] != ' ' && line[0] != '>')
                        {
                            b += line[0];
                            line.erase(0, 1);
                        }
                        //заносим в стек название элемента
                        nom.push(b);
 
                        //удаляем все из строки, пока не встретим  > или />
                        while (line[0] != '>' && line[0] != '/')
                            line.erase(0, 1);
 
                        //если встретили /, то это пустой тег и его нужно сразу же удалить из стека
                        if (line[0] == '/')
                        {
                            nom.pop();
                            //удаляем /
                            line.erase(0, 1);
                        }
 
                        //и тут в любом случае line[0] == '>' и мы его удаляем
                        line.erase(0, 1);
                    }
                    
                }
            }
            else
            {
                if (itComment)
                {
                    //удаляем все, пока не встретим --> или конец строки
                    for (int i = 0; i <= int(line.size() - string("-->").size());)
                    {
 
                        if (string(buff, 0, string("-->").size()) == "-->")
                        {
                            itComment = false;
                            line.erase(0, 1);
                            //выходим из цикла
                            break;
                        }
 
                        line.erase(0, 1);
                    }
                    line.erase(0, 2);
                }
                else
                {
                    //переносим символ в буфер
                    buff += line[0];
                    line.erase(0, 1);
                }
                
            }
 
            
        }
 
        //нужно проверить буфер на совпадения, тк в одной строке может быть не 1 полный(окр+закрывающий) элемент
        if (buff.find(searchPhrase) != -1)
        {
 
            //переобразовуем число(номер строки в файле) в строку(чтоб можно было записать)
            char b1[256];
            string bf1(itoa(strCount + 1, b1, 10));
 
            //количество совпадений в данной строке
            int lmc(0);
 
            //ищем совпадения и запоминаем их количество
            for (int i = 0; i <= int(buff.size() - searchPhrase.size()); i++)
            {
 
                if (string(buff, i, searchPhrase.size()) == searchPhrase)
                {
                    lmc++;
                    matchesCount++;
                }
            }
 
            string bf2(itoa(lmc, b1, 10));
 
            if (!nom.empty())
            resultStr.push_back("(" + bf1 + "): " + bf2 + " matches in object \"" + nom.top() + "\"\n");
        }
        //очищаем буфер
        buff.clear();
 
        strCount++;
 
    }//while (f>>line)
 
    int a=10;
 
}
//функция для перевода текста из кодировки utf-8 в cp1251
string Utf8_to_cp1251(const char *str)
{
    string res;
    int result_u, result_c;
    result_u = MultiByteToWideChar(CP_UTF8,0,str,-1,0,0);
if (!result_u)
        return 0;
    wchar_t *ures = new wchar_t[result_u];
    if (!MultiByteToWideChar(CP_UTF8,0,str,-1,ures,result_u))
    {
        delete[] ures;
        return 0;
    }
    result_c = WideCharToMultiByte(1251,0,ures,-1,0,0,0, 0);
    if (!result_c)
    {
        delete[] ures;
        return 0;
    }
 
    char *cres = new char[result_c];
 
    if (!WideCharToMultiByte(1251,0,ures,-1,cres,result_c,0, 0))
    {
        delete[] cres;
        return 0;
    }
    delete[] ures;
    res.append(cres);
    delete[] cres;
    return res;
}
 
 
class HtmlResult :public Result
{
public:
    HtmlResult(string _fName, string _searchPhrase) :Result(_fName, _searchPhrase){};
    void search();
};
 
//для.html - 3 слова слева и справа от найденного...., без тегов;
//эта функция будет выводить 3 слова
0
lixod96
1 / 1 / 3
Регистрация: 18.04.2014
Сообщений: 118
27.12.2014, 10:46  [ТС] 4
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
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
void HtmlResult::search()
{
    //буфер для считывания строки с файла
    string line;
 
    //если совпадение бутет найдено в конце строки, то нужно будет 
    //отложить запись результата до того, как считаем след строку
    //notPrint=true значит, что в прошлой итерации мы не записали результат
    bool notPrint(false);
 
    //файл для поиска
    ifstream f(fName);
 
    //удаляем?
    bool del(false);
 
    //в html документе есть элементы, текст которых нам нельзя проверять
    //(style,script,noscript) и каждый раз, когда мы встречаем начало такого элемента
    //мы увеличиваем сщетчик, конец-уменьшаем. таим образом, когда killer>0-мы в любом случае удаляем текст
    int killer(0);
 
    //считываем построчно файл
    while (getline(f, line))
    {   
 
        //отдаем константный указатель, а получаем уже готовую перекодированую строку
        line = Utf8_to_cp1251(line.c_str());
 
        if (line.find("Steam сообщес") != -1)
        {
            int a=0;
        }
        int l;
        //заменяем все &lt и &gt на < > 
        while ((l = line.find("&lt;")) != -1)
        {
            line.erase(l, 4);
            line.insert(l, "<");
        }
        while ((l = line.find("&gt;")) != -1)
        {
            line.erase(l, 4);
            line.insert(l, ">");
        }
        while ((l = line.find("&nbsp;")) != -1)
        {
            line.erase(l, 6);
            line.insert(l, " ");
        }
 
        //вырезаем все лишнее 
        for (int i = 0; i < line.size();)
        {
            //проверяем закрытия удаляемых элементов
            if (string(line.c_str() + i, 8) == "/script>") killer--;
            if (string(line.c_str() + i, 7) == "/style>") killer--;
            if (string(line.c_str() + i, 10) == "/noscript>") killer--;
 
            if (line[i] == '<')
            {
                //поиск удаляемого элемента
                if (string(line.c_str() + i + 1, 6) == "script") killer++;
                if (string(line.c_str() + i + 1, 5) == "style") killer++;
                if (string(line.c_str() + i + 1, 8) == "noscript") killer++;
 
                del = true;
            }
 
            //нельзя менять del на false, пока мы не вышли из удаляемого элемента
            if (line[i] == '>' && !killer) del = false;
 
 
            if (del || line[i] == '>') line.erase(i, 1);
            else i++;
 
        }
 
 
        //ищем совпадения
        for (int i = 0; i < int(line.size() - searchPhrase.size()); i++)
        {
            if (string(line, i, searchPhrase.size()) == searchPhrase)
            {
                //для статистики
                matchesCount++;
 
                //поиск слов слева/////////////
 
                //счетчик для обратного отчета
                int i1 = i;
 
                //счетчик отступов. когда насчитывается 4й отступ, тогда мы нашли 3 слова
                int c1 = 0;
 
                bool itWord(true);
 
                //находим начало 3го слова слева в i1
                while (i1>0 && c1 < 4)
                {
                    if (line[i1] == ' ' && itWord)
                    {
                        c1++;
                        itWord = false;
                    }
 
                    if (line[i1] != ' ' && !itWord)
                    {
                        itWord = true;
                    }
 
                    i1--;
                }
 
                //поиск слов справа//////////////
 
                int i2 = i + searchPhrase.size();
 
                //счетчик слов
                int c2 = 0;
 
                itWord = true;
 
                //находим конец 3го слова справа в i2
                while (i2<line.size() && c2 < 4)
                {
                    if (line[i2] == ' ' && itWord)
                    {
                        c2++;
                        itWord = false;
                    }
 
                    if (line[i2] != ' ' && !itWord)
                    {
                        itWord = true;
                    }
 
                    i2++;
                }
 
                //формируем строку для вывода
                string bf1("(");
                char b1[256];
                bf1+=itoa(strCount + 1, b1, 10);
                bf1 += "): \"";
 
                //если c1 или c2 меньше 3, то в строке не нашлось 3 слова влево или вправо
                //и мы это отметим
                if (c1 < 4) bf1 += "...";
 
                bf1 += string(line, i1, i2 - i1);
 
                if (c2 < 4) bf1 += "...";
 
                bf1 += "\"";
 
                resultStr.push_back(bf1);
            
            }
        }
 
        strCount++;
 
    }//while (f>>line)
    
    int b = 0;
}
0
lixod96
1 / 1 / 3
Регистрация: 18.04.2014
Сообщений: 118
27.12.2014, 10:46  [ТС] 5
main.cpp
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
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
#include <iostream>
#include <windows.h>
#include <list>
#include <fstream>
#include <time.h>
#include <string>
#include <vector>
#include <stack>
#include "IDZ.h"
 
using namespace std;
 
class poisk
{
protected:
 
    //имя файла, в который записуются результаты поиска
    string Name;
 
    //фраза для поиска
    string Fraz;
 
    //имя конрневого каталога 
    string mainName;
 
 
    bool scan;
    bool ftxt;
    bool fxml;
    bool fhtml;
 
public:
    poisk(string _mainName, bool _scan, string _Fraz, string _Name, bool _txt = 1, bool _xml = 1, bool _html = 1);
 
    int ready();
 
    //главный цикл поиска(перебирает все файлы и ведет статистику)
    void start();
 
};
 
poisk::poisk(string _mainName, bool _scan, string _Fraz, string _Name, bool _ftxt, bool _fxml, bool _fhtml)
{
 
    mainName = _mainName;
    scan = _scan;
    Fraz = _Fraz;
    Name = _Name;
    ftxt = _ftxt;
    fxml = _fxml;
    fhtml = _fhtml;
 
}
 
int poisk::ready()
{
    //если не нужно искать ни 1 из типов, то тогда нет смысла начинать:)
    if (!(ftxt||fxml||fhtml)) return 1;
    
    //проверяем каталог для поиска на существование и доступа чтения
    if (_access(mainName.c_str(), 4) == -1)
        return 2;
 
    //находим имя папки, в которую будем писать результаты
    string logDir(Name, 0, Name.find_last_of('\\')+1);
    //проверяем папку на возможность записи
    if (_access(logDir.c_str(), 2) == -1)
        return 3;
 
    return 0;
}
 
void poisk::start(){
 
    //не запускаем,если не готовы
    if (ready() != 0) return;
 
 
    //создаем массив(массив указателей на класс Results), который будет содержать лог
    vector<Result *> LOG;
    //создавать обьекты такого класса(абстрактного) нельзя, но можно создавать на него ссылки
    //этими ссылками так же можно указывать на все классы, что унаследованы от класса Result
    //т.е. у нас массив с ссылками, что указывают на разные классы, но отец у них 1-Result
    //у него есть все нужные методы, кроме search, их реализует каждый потомок самостоятельно
 
    //vector-это такой динамический класс, который при переполнении сам выделяет себе память
    //его можно использовать как обычный массив, но кроме этого у него есть еще полезные методы типа size и push_back
 
    //в этом стеке будут все имена каталогов, которые нужно будет проверить
    stack<string> dirs;
 
    //изначально в стеке путь к папке, которую задал пользователь
    //дальше, если задан поиск в подкоталогах, в стек будут добавляться имена подкаталогов
    dirs.push(mainName);
 
    //засекаем время
    clock_t startT = clock();
    
    //количество сканированых файлов, совпадений
    int fCount(0), mCount(0);
    //строк
    long lCount(0);
 
 
    //главный цикл поиска
    bool cEnd = false;
 
    //пока есть папки, в которых можно производить поиск
    while (!dirs.empty())
    {
 
        //находим файл//////////////////
        string fullFileName;
        string fileName;
 
        string curDir;
        //вытаскиваем из стека полное имя каталога
        curDir = dirs.top();
        dirs.pop();
 
        WIN32_FIND_DATA dir;
        string buf;
 
        //string(curDir+"\\").c_str() - создаем анонимный класс и передаем указатель на массив символов
        HANDLE han = FindFirstFile(string(curDir+"*").c_str(), &dir);
 
        if (han != INVALID_HANDLE_VALUE)
        {
            
            do
            {
                fileName=dir.cFileName;
                //выводим статистику
 
                //очищаем командную строку
                system("cls");
                cout << "В процессе проверки:" << fileName << endl;
                cout << "Файлов проверено:" << fCount << endl;
                cout << "Строк проверено:" << lCount << endl;
                cout << "Совпадений найдено:" << mCount << endl;
 
                //вычисляем время со старта
                clock_t currT = clock();
                cout << "Время с начала старта поиска: " << (currT - startT) / 1000. << " сек." << endl;
 
                //проверем "файл ли это?"
                if (fileName.find('.') != -1)
                {
                    //полное имя файла
                    fullFileName.clear();
                    fullFileName = curDir + fileName;
 
                    //проверяем окончание////////////////////////
 
                    //находим номер символа "точка"
                    int offs = fullFileName.find_last_of('.') + 1;
 
                    //копируем адресс названия файла со смещением(копируем символы после точки)
                    string format(fullFileName, offs, fullFileName.size() - offs);
 
 
                    //поскольку string не подходит для switch используем if
                    //тк расширение только 1, то и выполниться только 1 из следующих вариантов
 
                    if (format == "txt" && ftxt)
                    {
                        LOG.push_back(new TxtResult(fullFileName, Fraz));
                        LOG[LOG.size() - 1]->search();
                        //запись статистики/////////////////////
                        lCount += LOG[LOG.size() - 1]->getStrCount();
                        mCount += LOG[LOG.size() - 1]->getMatchesCount();
                        fCount++;
                    }
 
                    if (format == "xml" && fxml)
                    {
                        LOG.push_back(new XmlResult(fullFileName, Fraz));
                        LOG[LOG.size() - 1]->search();
                        //запись статистики/////////////////////
                        lCount += LOG[LOG.size() - 1]->getStrCount();
                        mCount += LOG[LOG.size() - 1]->getMatchesCount();
                        fCount++;
                    }
 
                    if (format == "html" && fhtml)
                    {
                        LOG.push_back(new HtmlResult(fullFileName, Fraz));
                        LOG[LOG.size() - 1]->search();
                        //запись статистики/////////////////////
                        lCount += LOG[LOG.size() - 1]->getStrCount();
                        mCount += LOG[LOG.size() - 1]->getMatchesCount();
                        fCount++;                       
                    }
 
                    
                }
                else
                {//если в имени файла нет точки, то в fileName имя каталога
                
                    //если включен поиск в подкаталогах, то добавляем в стек папку для дальнейшей проверки
                    if (scan) dirs.push(curDir + fileName+"\\");
                }
            } while (FindNextFile(han, &dir));
 
 
        }   
    }
    
    //очищаем данные прошлоо поиска
    ofstream f(Name, ios::out);
    f.close();
 
    //для каждого обьекта вызываем метод printIfSucces, который запишет данные своего обьекта
    //если он что-то нашел
    for (int i = 0; i < LOG.size(); i++)
    {
        LOG[i]->printIfSucces(Name);
    }
 
    //выводим статистику
 
    //очищаем командную строку
    system("cls");
 
    cout << "Файлов проверено:" << fCount << endl;
    cout << "Строк проверено:" << lCount << endl;
    cout << "Совпадений найдено:" << mCount << endl;
 
    //вычисляем время со старта
    clock_t currT = clock();
    cout << "Время с начала старта поиска: " << (currT - startT) / 1000. << " сек." << endl;
    
    cout << "!!!!!!!!!!!!!!!!Search was finishd!!!!!!!!!!!!!!!!!" << endl;
 
 
}
int main()
{
    setlocale(0, "rus");
    
    //буфер для коректного переноса русских символов в string
    char OEMc[256] = "";
 
    bool allFine = false;
 
    //переенные для запоминания параметров ss-поиск в подкаталогах
    bool txt(false), html(false), xml(false), v(false);
    string root, Fraz,logDir;
 
    while (!allFine)
    {
        cout << "Vvedite put: ";
            
 
        //вводим строку
        cin.getline(OEMc,256);
        
        //перекодирываем из кодировки консоли в Ansi
        OemToCharA(OEMc, OEMc);
 
        //определяем параметры
        string buf(OEMc);
 
        //диапазоны параметров в строке
        int a, b;
 
        //в вырезаем в root название каталога(без [])
        a = buf.find('[');
        b = buf.find(']');
        //проверяем коректность ввода пользователя
        if (a>=0 && b>0 && b>a)
        {
            root = string(buf, a + 1, b - a - 1);
            buf.erase(0, b + 1);
        }
        else
        {
            allFine = false;
        }
    
 
        //вырезаем фразу для поиска
        a = buf.find('[');
        b = buf.find(']');
        if (a >= 0 && b>0 && b>a)
        {
            Fraz = string(buf, a + 1, b - a - 1);
            buf.erase(0, b + 1);
        }
        else
        {
            allFine = false;
        }
 
        //вырезаем имя директории для создания файла с результатами
        a = buf.find('[');
        b = buf.find(']');
        if (a >= 0 && b>0 && b>a)
        {
            logDir = string(buf, a + 1, b - a - 1);
            buf.erase(0, b + 1);
        }
        else
        {
            allFine = false;
        }
 
        //такой вариант был бы неуместный, если бы мы могли искать в файлах типа xhtml,css или тд
        //но в нашем случае так делать можно
        if (buf.find("txt")!=-1) txt = true;
        if (buf.find("xml") != -1) xml = true;
        if (buf.find("html") != -1) html = true;
        if (buf.find("ss") != -1) v = true;
        
        
        if (!allFine) cout << "Был выполнен некорректный ввод!\n";
 
        //создаем обьект поискового класса
        poisk asd(root, v, Fraz,logDir, txt, xml, html);
 
        allFine = false;
 
        switch (asd.ready())
        {
        case 0: {
                    asd.start();
                    allFine = true;
        }break;
        case 1: cout << " Укажите хотя бы 1 тип для поиска!\n";
            break;
        case 2: cout << " Указаная папка для поиска не доступна для чтения или не существует!\n";
            break;
        case 3: cout << " Невозможно создать файл по указанному пути!\n";
            break;
        default:
            break;
        }
 
 
        
    }
 
    
    
    system("pause");
}
0
lixod96
1 / 1 / 3
Регистрация: 18.04.2014
Сообщений: 118
28.12.2014, 15:45  [ТС] 6
student 201, вот готовый пример. Поможете переделать???
0
28.12.2014, 15:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2014, 15:45

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

Поиск заданной строки во всех текстовых файлах заданного каталога
Поиск заданной строки во всех текстовых файлах заданного каталога. Алгоритм &quot;лечения&quot;: перемещение...

Программа для вывода введенного слова задом на перед
Ребят помогите написать такую программу, а то я что то не пойму как это сделать


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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