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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 61, средняя оценка - 4.67
^Tecktonik_KiLLeR
1160 / 442 / 22
Регистрация: 23.06.2009
Сообщений: 6,245
Завершенные тесты: 1
#1

Поиск с консоли - C++

30.09.2009, 21:42. Просмотров 7840. Ответов 42
Метки нет (Все метки)

вот решил прогу писать,которая ищет на компе все файлы с расширением doc,и все в них удаляет и добавляет звездочки...я только не знаю эту функцию поиска,помогите пожалуйста,надо найти все файлы,и записать их адреса в чар,чтобы потом пользовался с чаром как file_name, наверно понятно объяснилесли возможно то поболше комментарий,ведь с этой функцией в жизни не работалбуду благодарен
1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.09.2009, 21:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поиск с консоли (C++):

Поиск символа на консоли - C++
Всем привет. Допустим я поставил где-то на консоли символ при помощи функции SetConsoleCursorPosition(), потом в какой-то момент мне...

Клавиши F1-F12 в консоли, и работа с мышкой в консоли - C++
Я искал на сайте, но не нашел упоминания о том как обрабатывать и или узнавать где находится курсор мышки (и еще мне надо бы узнать нажатие...

считывание с консоли ( не с клавы, а именно с консоли) - C++
нужно написать функцию которая возвращает string в котором написано 500 символов которые были выведены в консоли от начала. среда :...

Поиск символа не могу переделать под поиск сочетания символов - C++
Есть код программы на поиск и замену по одному символу.Не могу понять, как сделать код на поиск сочетания символов. Чтобы найдя в введённой...

Реализовать поиск заданного файла в древе каталогов и поиск указанной информации в этом файле - C++
Имеется много папок в каждой папке есть файл proc.txt, как можно по всем этим папкам пройтись и из каждой папки в этом файле достать...

Поиск циклов в графе. Поиск центра взвешенного графа - C++
В интернете, к сожалению, по этим вопросам не так уж много нашел. Можете посоветовать статью/пособие, где было бы подробно об этом написано?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
09.11.2009, 12:36 #16
Проще будет скомпилить НЕПОСРЕДСТВЕННО Юрину программу. Ошибка в ней. А не в другой проге.
Ну, или дождаться Юру, я ему уже написал.
1
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
09.11.2009, 19:39 #17
МедведЪ, вот тебе ещё проще.
Вариант Юриной проги.
Ничего вводить не надо.
Забиваешь в исходник имя директории, расширение (обрати внимание на размер) и смотришь на вывод.
Хочешь, звпускай из командной строки и перенаправляй в файл. Открыть надо в кодировке OEM (Она же MS DOS)

В выводе увидишь исключительно имена файлов с полными путями. Всё! Ничего больше.
Делай с ними, что хочешь.


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
#include <windows.h>
#include <stdio.h>
 
void GetFileList(LPTSTR sPath, LPTSTR sExt);
 
int main(){
 
//Поскольку sPath и sExt одинаковы во всех вызовах GetFileList, их можно было бы сделать
//глобальными, но я так оставил. 
        char sPath[MAX_PATH]= "C:\\vso_moio";
        char sExt[4]= "exe";
        GetFileList(sPath, sExt);
  system ("PAUSE");
}
 
void GetFileList(LPTSTR sPath, LPTSTR sExt) {
 
 WIN32_FIND_DATA pFILEDATA;
 
 HANDLE hFile = FindFirstFile(strcat(sPath,"\\*.*"),&pFILEDATA);
 if (hFile!=INVALID_HANDLE_VALUE)    {
  char * chBuf;
  sPath[strlen(sPath) - strlen(strstr(sPath,"*.*"))] = '\0';
  do {
   //Пропускаем . и ..
   if (strlen(pFILEDATA.cFileName) == 1 &&  strchr(pFILEDATA.cFileName,'.') !=NULL)
    if (FindNextFile(hFile,&pFILEDATA) == 0)
      break;
   if (strlen(pFILEDATA.cFileName) == 2 && strstr(pFILEDATA.cFileName,"..") !=NULL)
    if(FindNextFile(hFile,&pFILEDATA) == 0)
      break;
     //Если нашли директорию, запускаем поиск в ней рекурсивный поиск
   if(pFILEDATA.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
     GetFileList(strcat(sPath,pFILEDATA.cFileName), sExt);
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!оБЯЗАТЕЛЬН востанавливать дллину пути................................     
     sPath[strlen(sPath) - strlen(pFILEDATA.cFileName)- 1] = '\0';
   }
   else {
    //Проверяем на соотвествие sExt расширения pFILEDATA.cFileName
    if((chBuf = strrchr(pFILEDATA.cFileName,'.'))) {
     if(strstr(chBuf + 1,sExt)) {
      //Если не будем использовать CharToOem() то на экране русский шрифт каракулями выйдет
      CharToOem(sPath,sPath);
      printf("\n\n%s",sPath);
      OemToChar(sPath,sPath);
      CharToOem(pFILEDATA.cFileName,pFILEDATA.cFileName);
      printf("%s\r\n",pFILEDATA.cFileName);
     }
    }
   }
  }
  while (FindNextFile(hFile,&pFILEDATA));
 }
}
2
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
11.11.2009, 07:38 #18
Друзья!
Если кто пользуется вышеприведёнными прогами быстренько взяли и поправили исходник.
Там ошибка есть, что у Юры, что у меня, я щас только нашёл.
Вот эту строку
C++
1
sPath[strlen(sPath) - strlen(strstr(sPath,"*.*"))] = '\0'
Надо выполнять не по условию, а НЕЗАВИСМО ВЫПОЛНЯЕТСЯ УСЛОВИЕ ИЛИ НЕТ!
Если пропишем после if (как делали до сего момента), то тогда, если вдруг натыкаемся на
системную директорию или файл, то FindFirstFile возвращает -1. Следовательно, всё,
что выполнняется по условию (hFile!=INVALID_HANDLE_VALUE) не выполнится и в частности,
не будет поставлен конец строки!
А это значит, что по выходу из рекурсивной функции GetFileList в том месте, где мы
восстанавливаем длину, она будет восстановлена неправильно.

Я наткнулся на директорию System Volume Information, не обработал её таким образом,
а потом , когда восстанавливал путь, он у меня восстанвился не как C:\ а как
C:\Sys!

Прибавились эти злополучные три байта, которые я не "отсёк" , не поставил ноль сюда
С:\System Volume Informationвот в это место надо ставить ноль!\*.*

Поэтому поправьте так:

C++
1
2
3
4
5
6
7
8
9
10
11
void GetFileList(LPTSTR sPath, LPTSTR sExt, LPTSTR sEXT) {
 WIN32_FIND_DATA pFILEDATA;
 HANDLE hFile = FindFirstFile(strcat(sPath,"\\*.*"),&pFILEDATA);
 
 //!!!!!!!!!!!!!!!!!!!!!!
 sPath[strlen(sPath) - strlen(strstr(sPath,"*.*"))] = '\0';
 //!!!!!!!!!!!!!!!!!!!!!!!
 
 if (hFile!=INVALID_HANDLE_VALUE)    {
  char * chBuf;
  do {
Вроде всё.
1
-=ЮрА=-
Заблокирован
Автор FAQ
11.11.2009, 10:10 #19
Медведъ, я не могу понять что именно тебе не надо выводить?Результатом поиска файлов являются их пути или хэндлы, куда тебе их выводить в файл, сделать символьный двухмерный массив???В моей проге пути на экран выводятся...
Что же касается поиска то цикл do while в программе и выполняет поиск...FindNextFile - это функция поиска файла для каталога в котором FindFirstFile вернула хэндл первого файла
Детально сформулируй задание, помогуЛучше даже нарисуй интерфейс и как образец сюда выставь, а я попробую его реализовать...

Добавлено через 9 минут
kravam , если у тебя файловая система NTFS то действительно прога на System Volume Information споткнётся, а вот на фате всё работает, ну а данную манипуляцию sPath[strlen(sPath) - strlen(strstr(sPath,"*.*"))] = '\0'; я делаю по следующей причине :
ИмяКаталога\ -> припаиваем к нему "*.*" -> Выходит ИмяКаталога\*.* если в данном каталоге есть файлы то заходим в цикл в котором функция FindNextFile(hFile,&pFILEDATA) постоянно переинициализирует структуру WIN32_FIND_DATA pFILEDATA, а теперь если я бы не убрал данные символы "*.*" из имени каталога то получал бы такие пути ИмяКаталога\*.*\pFILEDATA.cFileName
0
^Tecktonik_KiLLeR
1160 / 442 / 22
Регистрация: 23.06.2009
Сообщений: 6,245
Завершенные тесты: 1
11.11.2009, 10:10  [ТС] #20
-=ЮрА=-, Oo какой интерфейс...я же сказал,осущствить список по компу doc файлов(что уже есть) и изменить весь тет на "*"...этого то нет
0
-=ЮрА=-
Заблокирован
Автор FAQ
11.11.2009, 10:12 #21
Медведъ текст в doc файлах я тебе не заменю, не умею я с вордом работать(((
0
^Tecktonik_KiLLeR
1160 / 442 / 22
Регистрация: 23.06.2009
Сообщений: 6,245
Завершенные тесты: 1
11.11.2009, 10:16  [ТС] #22
-=ЮрА=-, почему именно с вордом?с файлом!...нельзя ли там создать указать на файл и вместо URL ввести рез-ты поиска?
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
11.11.2009, 11:12 #23
-=ЮрА=-, ты абсолютно правильно делаешь, что ставишь в нужном месте конец строки.Честно говоря, я недоумеваю, почему ты мне объясняешь- я ведь нигде не сомневался в том, что она нужна.
C++
1
sPath[strlen(sPath) - strlen(strstr(sPath,"*.*"))] = '\0';
Я правил твой исходник 2 по-моему раза и везде сохранял эту строку, да и по- другому быть не может.
Но в последнем разе я усомнился, а в том ли месте находится эта строка?
И просто вынес её за пределы условия.
Но ты разъяснил, что в файловой системе FAT сканает и твой вариант. Ну, пусть так, хотя мой всё же видится мне более универсальным.

Добавлено через 2 минуты
Прокомментируй пожалуйста 14-е сообщение. Там TanT сомневается.

Добавлено через 6 минут
Медведь, это несерьёзно в конце концов.
Ты что, за 2175 сообщений не научился символы за звёздочки заменять? Тебя конец файла научить находить? Пора уже самому дела делать.
0
^Tecktonik_KiLLeR
1160 / 442 / 22
Регистрация: 23.06.2009
Сообщений: 6,245
Завершенные тесты: 1
11.11.2009, 11:28  [ТС] #24
Цитата Сообщение от kravam Посмотреть сообщение
Ты что, за 2175 сообщений не научился символы за звёздочки заменять? Тебя конец файла научить находить? Пора уже самому дела делать.
а сообщения тут причем,не знал что народ судит п сообщениям какие у него знания,может я по ХТМЛ мастер.и вторе,заменять не проблема,и находит конец,я уже 649 раз пишу,НАДО РЕЗУЛЬТАТЫ ПОИСКА ЗАБИТЬ В fopen,теперь ясно??
0
^Tecktonik_KiLLeR
1160 / 442 / 22
Регистрация: 23.06.2009
Сообщений: 6,245
Завершенные тесты: 1
11.11.2009, 17:30  [ТС] #25
-=ЮрА=-, в твоем коде 16 ошибок
Error 3 error C2664: 'GetFileList' : cannot convert parameter 1 from 'char [260]' to 'LPTSTR' c:\documents and settings\ag\my documents\visual studio 2008\projects\proba\proba\code.cpp 18 proba
Error 4 error C2664: 'CharToOemW' : cannot convert parameter 2 from 'LPTSTR' to 'LPSTR' c:\documents and settings\ag\my documents\visual studio 2008\projects\proba\proba\code.cpp 28 proba
Error 5 error C2664: 'OemToCharW' : cannot convert parameter 1 from 'LPTSTR' to 'LPCSTR' c:\documents and settings\ag\my documents\visual studio 2008\projects\proba\proba\code.cpp 30 proba
Error 6 error C2664: 'strcat' : cannot convert parameter 1 from 'LPTSTR' to 'char *' c:\documents and settings\ag\my documents\visual studio 2008\projects\proba\proba\code.cpp 31 proba
Error 7 error C2664: 'strlen' : cannot convert parameter 1 from 'LPTSTR' to 'const char *' c:\documents and settings\ag\my documents\visual studio 2008\projects\proba\proba\code.cpp 34 proba
Error 8 error C2665: 'strstr' : none of the 2 overloads could convert all the argument types c:\documents and settings\ag\my documents\visual studio 2008\projects\proba\proba\code.cpp 34 proba
Error 9 error C2664: 'strlen' : cannot convert parameter 1 from 'WCHAR [260]' to 'const char *' c:\documents and settings\ag\my documents\visual studio 2008\projects\proba\proba\code.cpp 37 proba
Error 10 error C2665: 'strchr' : none of the 2 overloads could convert all the argument types c:\documents and settings\ag\my documents\visual studio 2008\projects\proba\proba\code.cpp 37 proba
Error 11 error C2664: 'strlen' : cannot convert parameter 1 from 'WCHAR [260]' to 'const char *' c:\documents and settings\ag\my documents\visual studio 2008\projects\proba\proba\code.cpp 40 proba
Error 12 error C2665: 'strstr' : none of the 2 overloads could convert all the argument types c:\documents and settings\ag\my documents\visual studio 2008\projects\proba\proba\code.cpp 40 proba
Error 13 error C2664: 'strcat' : cannot convert parameter 1 from 'LPTSTR' to 'char *' c:\documents and settings\ag\my documents\visual studio 2008\projects\proba\proba\code.cpp 45 proba
Error 14 error C2664: 'strlen' : cannot convert parameter 1 from 'LPTSTR' to 'const char *' c:\documents and settings\ag\my documents\visual studio 2008\projects\proba\proba\code.cpp 47 proba
Error 15 error C2664: 'strlen' : cannot convert parameter 1 from 'WCHAR [260]' to 'const char *' c:\documents and settings\ag\my documents\visual studio 2008\projects\proba\proba\code.cpp 47 proba
Error 16 error C2665: 'strrchr' : none of the 2 overloads could convert all the argument types c:\documents and settings\ag\my documents\visual studio 2008\projects\proba\proba\code.cpp 51 proba
Error 17 error C2665: 'strstr' : none of the 2 overloads could convert all the argument types c:\documents and settings\ag\my documents\visual studio 2008\projects\proba\proba\code.cpp 52 proba
Error 18 error C2664: 'CharToOemW' : cannot convert parameter 2 from 'WCHAR [260]' to 'LPSTR' c:\documents and settings\ag\my documents\visual studio 2008\projects\proba\proba\code.cpp 54 proba
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
11.11.2009, 19:23 #26
Цитата Сообщение от МедведЪ Посмотреть сообщение
НАДО РЕЗУЛЬТАТЫ ПОИСКА ЗАБИТЬ В fopen
Нет.
Я результаты поиска либо на консоль вывожу, либо в файл. Ты поспрашивай, может, знает кто, как результаты поиска забить в fopen.

Добавлено через 3 минуты
Далее.
Могу я узнать, что ты предпринимал, чтобы таких ошибок не совершалось? Твои действия.
1
easybudda
Модератор
Эксперт CЭксперт С++
9628 / 5576 / 947
Регистрация: 25.07.2009
Сообщений: 10,710
11.11.2009, 19:31 #27
Цитата Сообщение от МедведЪ Посмотреть сообщение
НАДО РЕЗУЛЬТАТЫ ПОИСКА ЗАБИТЬ В fopen
Результаты поиска можно "забить" в массив строк, а потом по очереди их в fopen подставлять...
0
^Tecktonik_KiLLeR
1160 / 442 / 22
Регистрация: 23.06.2009
Сообщений: 6,245
Завершенные тесты: 1
11.11.2009, 21:51  [ТС] #28
Цитата Сообщение от kravam Посмотреть сообщение
Могу я узнать, что ты предпринимал, чтобы таких ошибок не совершалось? Твои действия.
нет,я с такими вещями впервые столкнулся и в книжке нет
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
11.11.2009, 23:04 #29
Мда...
А перевести пытался на русский язык?

Я почему спрашиваю- это ОЧЕНЬ ЧАСТО ПОВТОРЯЮЩАЯСЯ ОШИБКА. И у меня и у многих.
Так что польза от перевода была бы большая. Раз перевёл- и ВСЕГДА будешь знать, что за ошибка.

Но даже если бы это была бы какая-нибудь редкая ошибка- всё равно надо переводить. Потому, что у тебя другого выхода нет.
Хотя да, можно ещё спросить на форуме.
Но вернёмся к нашим баранам.
Чё за ошибка-то?
0
^Tecktonik_KiLLeR
1160 / 442 / 22
Регистрация: 23.06.2009
Сообщений: 6,245
Завершенные тесты: 1
11.11.2009, 23:22  [ТС] #30
Ошибка 3 ошибка C2664: 'GetFileList': не может преобразовать параметр 1 от "Чар [260] 'на' LPTSTR 'C: \ Documents и Settings \ AG \ Мои документы \ Visual Studio 2008 \ Projects \ Проба \ Проба \ code.cpp 18 Проба
Ошибка 4 ошибка C2664: 'CharToOemW': не может преобразовать параметр 2 от "LPTSTR 'в' LPSTR 'C: \ Documents и Settings \ AG \ Мои документы \ Visual Studio 2008 \ Projects \ Проба \ Проба \ code.cpp 28 проба
Ошибка 5 ошибка C2664: 'OemToCharW': не может преобразовать параметр 1 от "LPTSTR 'в' LPCSTR 'C: \ Documents и Settings \ AG \ Мои документы \ Visual Studio 2008 \ Projects \ Проба \ Проба \ code.cpp 30 проба
Ошибка 6 ошибка C2664: 'StrCat': не может преобразовать параметра от 1 "до" Чар LPTSTR '*' C: \ Documents и Settings \ AG \ Мои документы \ Visual Studio 2008 \ Projects \ Проба \ Проба \ code.cpp 31 проба
7 ошибка ошибка C2664: 'StrLen': не может преобразовать параметра от 1 "до" LPTSTR 'сопзЬ Char *' C: \ Documents и Settings \ AG \ Мои документы \ Visual Studio 2008 \ Projects \ Проба \ Проба \ code.cpp 34 проба
8 ошибка ошибка C2665: 'strstr': никто из 2 перегрузок может конвертировать все аргументы типа C: \ Documents и Settings \ AG \ Мои документы \ Visual Studio 2008 \ Projects \ Проба \ Проба \ code.cpp 34 проба
Error 9 Ошибка C2664: 'StrLen': не может преобразовать параметр 1 от "WCHAR [260] 'на' сопзЬ Char * 'C: \ Documents и Settings \ AG \ Мои документы \ Visual Studio 2008 \ Projects \ Проба \ Проба \ код: \ Documents и Settings \ AG \ Мои документы \ Visual Studio 2008 \ Projects \ Проба \ Проба \ code.cpp 51 проба
Ошибка 17 ошибка C2665: 'strstr': никто из 2 перегрузок может конвертировать все аргументы типа C: \ Documents и Settings \ AG \ Мои документы \ Visual Studio 2008 \ Projects \ Проба \ Проба \ code.cpp 52 проба
Error 18 Ошибка C2664: 'CharToOemW': не может преобразовать параметр 2 от "WCHAR [260] 'на' LPSTR 'C: \ Documents и Settings \ AG \ Мои документы \ Visual Studio 2008 \ Projects \ Проба \ Проба \ code.cpp 54 Проба
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2009, 23:22
Привет! Вот еще темы с ответами:

Поиск числа в двумерном массиве (бинарный поиск) - C++
Произвожу поиск элемента в массиве двумя способами: линейным(последовательным) поиском и бинарным(двоичным). Первый работает на ура. Второй...

Фокус консоли - C++
Как мне реализовать условие: Если консоль потеряла фокус, установить его... Мне нужно чтобы пользователь не смог при включенной...

Атрибуты консоли в C++ - C++
С++ Win32 Console Application. Компилятор - Microsoft Visual Studio C++ 2005 Как при компилировании задать параметр для консоли,...

Хендел консоли - C++
Делаю вот такое: #include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; void main() { system(&quot;ipconfig&quot;); ...


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

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

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