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

поиск файлов по строкам - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Сортировка вставками в односвязном списке http://www.cyberforum.ru/cpp-beginners/thread354066.html
Собственно нужно реализовать такую сортировку, но что-то не могу я придумать как её реализовать именно в односвязном списке, у нас ведь доступ не прямой как у массива здесь ... есть варианты? Собственно код моего односвязного списка (большим количеством места отделены функции которые вряд-ли понадобятся для сортировки, я их просто оставил для целостности, main в коде тоже оставлен с той же...
C++ Как поставить условие Есть переменные: x1, x2, y1, y2. И нужно сделать следующее: Прибавить к x1 единицу (++x1) в том случае если выполняется одно из условий: 1) x1 не равен x2 и y1 не равен y2 2) x1 равен x2 или y1 равен y2 Я как то запутался. http://www.cyberforum.ru/cpp-beginners/thread354039.html
Найти произведение элементов вектора C++
Всем форумчанинам привет, прошу помощи решения задачи Задача: Найти произведение элементов вектора (массивы не использовать, значения перемножать по мере ввода).
Простая база данных с помощью массива C++
здравствуйте. Помогите пожалуйста, можете написать пример простейшей базы данных созданной с помощью массива. База состоит из 3-5 строк,в каждой из которых фио и год рождения.операции с базой данных :поиск (по году рождения),удаление записи и добавление в любое место записи. Всем кто сможет помочь,огромное спасибо заранее! ну язык С++ конечно:)
C++ Определить дату предыдущего дня http://www.cyberforum.ru/cpp-beginners/thread353980.html
Все доброго времени суток. Нужна помощь в решении задачи. Заранее огромное спасибо. Вот собственно и задача: "Дата некоторого дня определяется двумя натуральными числами: порядковым номером месяца и числом. Определить дату предыдущего дня."
C++ идеальное хеширование В лабораторной работе задание "реализовать идеальное хеширование". в методичке очень мало материала по хешированию и по данному вопросу в частности. Посоветуйте какую-нибудь литературу или статью по этой теме, где все объясняется с нуля. подробнее

Показать сообщение отдельно
-=ЮрА=-
Заблокирован
Автор FAQ
20.09.2011, 19:10     поиск файлов по строкам
Вот подправил
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
#include <iostream.h>//i/o
#include <windows.h> //FindFirst(Next)File
#include <shlobj.h>  //Диалог выбора файла
#include <stdio.h>   //sprintf
//Руссификация
ostream& operator<<(ostream &stream,char* s){
        for(char* ps=s; *ps; ps++){
                if(*ps=='ё')
                        stream<<char(241);
                else if(*ps=='Ё')
                        stream<<char(240);
                else if(*ps>=-64 && *ps<=-17)                   
                        stream<<char(*ps+64+128);
                else if(*ps<0)
                        stream<<char(*ps+64+176);
                else
                        stream<<*ps;
        }
        return stream;
}
 
char * SelectFile(HWND hWnd);
bool   IsFile(LPCTSTR sPath);
//Поиск файла в каталоге sPath по маске sMask и наличии текста sFind в нём
bool   FindFile(LPCTSTR sPath, LPCTSTR sMask, LPCTSTR sFind);
//Поиск текста sFind в файле sPath
bool   FindText(LPCTSTR sPath, LPCTSTR sFind);
bool   IsStrEqualMask(LPCTSTR s, LPCTSTR sFind);
 
int main()
{
    char ch;
    char szFilePath[MAX_PATH];
    char szFindMask[MAX_PATH];
    char szFindText[1024];//Для вводе текста для поиска есть хоть каки*то ограничения
    HWND hWnd = GetForegroundWindow();//Находим дескриптор окна консоли
    do
    {
        if(!strcpy(szFilePath,SelectFile(hWnd)))
            cout<<"Файл не выбран\r\n";
        else
        {
            if(IsFile(szFilePath))
            {
                cout<<"Выбран файл\r\n";
                szFilePath[strlen(szFilePath) - strlen(strrchr(szFilePath,'\\')) + 1] = '\0'; 
            }
            cout<<"Каталог для поиска:\r\n["<<szFilePath<<"]\r\n";
            cout<<"Введите маску поиска\r\n";
            cin.getline(szFindMask,MAX_PATH);
            cout<<"Введите текст поиска\r\n";
            cin.getline(szFindText,1024);
            if(!FindFile(szFilePath, szFindMask, szFindText))
                cout<<"Поиск не дал результатов\r\n";
        }
        cout<<"Y - Повторить поиск\r\n";
        cin>>ch;
    }
    while(ch == 'Y' || ch == 'y');
    return 0;
}
 
char * SelectFile(HWND hWnd)
{
    ShowWindow(hWnd,SW_HIDE);
    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));
    }
    ShowWindow(hWnd,SW_SHOW);
    return &sPath[0];
}
 
bool IsFile(LPCTSTR sPath)
{
    bool bFile = false;
    HANDLE hFile = CreateFile
        (
            sPath, 
            GENERIC_READ,
            FILE_SHARE_READ,
            NULL, 
            OPEN_EXISTING, 
            FILE_ATTRIBUTE_NORMAL,
            NULL
        );
     if(hFile != INVALID_HANDLE_VALUE)
     {
         CloseHandle(hFile);
         bFile = true;
     }               
     return bFile;
}
 
 
bool FindFile(LPCTSTR sPath, LPCTSTR sMask, LPCTSTR sFind)
{
    bool bFind = false;
    char sDir[MAX_PATH];
    WIN32_FIND_DATA pDATA;
    strcat(strcpy(pDATA.cFileName,sPath),"\\*.*");
    HANDLE hFile = FindFirstFile(pDATA.cFileName,&pDATA);
    if(hFile != INVALID_HANDLE_VALUE)
    {
        do
        {
            if(strcmp(pDATA.cFileName,".")  == 0 ||
               strcmp(pDATA.cFileName,"..") == 0)
               continue;
            else
            {
                sprintf(sDir,"%s\\%s",sPath, pDATA.cFileName);
                if(pDATA.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
                {
                    if(IsStrEqualMask(pDATA.cFileName, sMask))
                    if(FindText(sDir, sFind))
                    {
                        cout<<"Найден файл :["<<sDir<<"]\r\n";
                        bFind = true;
                        //break;//Если поиск успешен, сразу прекращаем поиск
                    }
                }
                else
                {
                    //Нашли подкаталог - ныряем в него
                    if((bFind = FindFile(sDir, sMask, sFind)))
                    {
                        //break;//Если поиск успешен, сразу прекращаем поиск
                    }
                }
            }
        }
        while(FindNextFile(hFile,&pDATA));
    }
    return bFind;
}
 
bool FindText(LPCTSTR sPath, LPCTSTR sFind)
{
    long sLen;
    char * str;
    bool bRet = false;
    FILE * f = fopen(sPath,"r");
    if(f)
    {
        fseek(f,0,SEEK_END);
        sLen = ftell(f);
        fseek(f,0,SEEK_SET);
        if((str = new char[sLen + 1]))
        {
            fread(str,sLen,1,f);
            str[sLen] = '\0';
        }
        fclose(f);
        if(str)
        {
            //Решил не изобретать велосипед а воспользуваться уже имеющейся функцией
            bRet = IsStrEqualMask(str, sFind);
            delete [] str;
        }
    }
    return bRet;
}
 
bool IsStrEqualMask(LPCTSTR s, LPCTSTR sFind)
{
    bool bEqual = true;
    //шаблон может содержать ' ' '\\' ',' '.' '*'
    char delim[] = " \\,.*";
    char * sMask = new char[strlen(sFind) + 1];
    strcpy(sMask,sFind);
        
    char * buf = strtok(sMask,delim);
    while(buf)
    {
        if(!strstr(s,buf))
        {
            bEqual = false;
            break;
        }
        buf = strtok(NULL,delim);
     }
     delete [] sMask;
     return bEqual;
}
Проверял работу на файле который прикладываю (скопировал в 2 подкаталога). Поиск длиться какое то премя, но всё отработало норм
[Результат работы]
Каталог для поиска:
[D:\MICROS~1]
Введите маску поиска
~Test*.txt
Введите текст поиска
TEST
Найден файл :[D:\MICROS~1\CyberForum\SearchMaskText\~TestFile~.txt]
Найден файл :[D:\MICROS~1\CyberForum\~TestFile~.txt]
Поиск не дал результатов
Y - Повторить поиск

PS:Чтобы убить Program idle (потря программой фокуса на окно, можно ввести функцию которую привожу ниже), вставляем её в цикл

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void PumpMessages(HWND hWnd)
{
    ASSERT(hWnd!=NULL);
    MSG msg;
    // Handle dialog messages
    while(PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE))
    {
        if(!IsDialogMessage(hWnd,&msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);  
        }
    }
}
 
Текущее время: 05:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru