Форум программистов, компьютерный форум 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++ идеальное хеширование В лабораторной работе задание "реализовать идеальное хеширование". в методичке очень мало материала по хешированию и по данному вопросу в частности. Посоветуйте какую-нибудь литературу или статью по этой теме, где все объясняется с нуля. подробнее

Показать сообщение отдельно
lizard
0 / 0 / 0
Регистрация: 20.09.2011
Сообщений: 14

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

20.09.2011, 14:43. Просмотров 1724. Ответов 16
Метки (Все метки)

Привет всем!

Мне нужно решить следующую задачу:
Найти первый файл в каталоге папок, удовлетворяющий заданной маске и содержащий заданный текст. И отобразить его название. Кое-какой код я написал, однако в процессе выполнения вылетает ошибка EAccesVialation.

Ошибка при выполнении 89 строки: fgets(str, 255, file);

Могли бы Вы помочь разобраться в чем ошибка?

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
#include <iostream.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fstream.h>
#include <conio.h>
bool   IsFile(LPCTSTR sPath);
long  GetFindList(LPCTSTR sPath, LPCTSTR sFind, LPCTSTR sText);
bool   IsStrEqualMask(LPCTSTR s, LPCTSTR sFind);
 
 
int main()
{
        char ch;
        char start_dir[MAX_PATH];
        char file_mask[MAX_PATH];
        char text_pattern[255] = { 0 };
 
        do
        {
                 cout<<"Enter directory for search:\r\n";
                 cin>>     start_dir;
 
                        cout<<"Enter mask:\r\n";
                        cin>>file_mask;
                        cout<<"Enter text to find:\r\n";
                        cin>>text_pattern;
                        
                        if(GetFindList(start_dir, file_mask, text_pattern) < 1)
                        cout<<"Files not found\r\n";
 
 
                cout<<"Retry search?\r\nY - yes N - exit\r\n";
                cin>>ch;
        }
        while(ch == 'Y' || ch == 'y');
        return 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;
}
 
 
long GetFindList(LPCTSTR sPath, LPCTSTR sFind, LPCTSTR sText)
{
FILE* file = NULL;
 
       char str[255]={0};
       long nFiles = 0;
        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
                        {
                                if(pDATA.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
                                if(IsStrEqualMask(pDATA.cFileName, sFind))
                                {
 
                                file = fopen("D:\1\1.txt", "r+");
 
 
        fgets(str, 255, file);
 
        if(!strstr(str,sText)){}
        else{
        cout<<"The first file containing this text is:["<<pDATA.cFileName<<"]\r\n";
                             nFiles++;
                             break;     }
                                           }
                                              }
                                                 }
 
                while(FindNextFile(hFile,&pDATA));
        }
        return nFiles;
}
 
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;
}

p.s. поиск в подпапках и проверка файлов, удовлетворяющих маске на содержание заданной фразы, к сожалению пока не реализованы.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru