Ошибка в коде, только для продвинутых.
Только ошибка при выполнении!!!
Вот кусок кода: CStr это класс строки (работает нормально)
class KFileFind
{
public:
BOOL FindFile(LPCSTR f);
BOOL FindNext();
CStr GetFileName();
CStr GetFilePath();
void Close();
BOOL IsDir();
BOOL IsDots();
protected:
HANDLE m_hC;
WIN32_FIND_DATA FindFileData;
char NPath[266];
CStr Name;
private:
};
BOOL KFileFind::IsDots()
{
BOOL bResult = FALSE;
if (FindFileData.cFileName[0]=='.')
{
if (FindFileData.cFileName[1] == '\0' ||
(FindFileData.cFileName[1] == '.' &&
FindFileData.cFileName[2] == '\0'))
bResult=TRUE;
}
return bResult;
}
BOOL KFileFind::IsDir()
{
if (FindFileData.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY)
return TRUE;
else return FALSE;
}
CStr KFileFind::GetFileName()
{
Name=FindFileData.cFileName;
return Name;
}
CStr KFileFind::GetFilePath()
{
CStr f=NPath;
f+="\\";
f+=GetFileName();
return f;
}
void KFileFind::Close()
{
FindClose(m_hC);
}
BOOL KFileFind::FindFile(LPCSTR f)
{
m_hC = ::FindFirstFile(f, &FindFileData);
lstrcpy(NPath, f);
int o=0;
for (int i=0; NPath!='\0'; i++)
{
//NPath;
o+=1;
}
NPath[o-4]='\0';
return TRUE;
}
BOOL KFileFind::FindNext()
{
BOOL ff=::FindNextFile(m_hC, &FindFileData);
//Name=FindFileData.cFileName;
return ff;
}
И ф-я (взята из MSDN и переделана)
void Recurse(LPCSTR pstr)
{ KFileFind finder;
CStr strWildcard(pstr);
strWildcard += "\\*.*";
BOOL bWorking = finder.FindFile(strWildcard);
while (bWorking)
{
bWorking = finder.FindNext();
if (finder.IsDots())
continue;
if (finder.IsDir())
{
CStr str = finder.GetFilePath();
cout << i <<" "<<str << endl;
Recurse(str);
}
}
finder.Close();
}
Ошибка закличается в том что:
Пишем Recurse("f:\\0_watcom");
Выводит вот такую штуку:
f:\0_Watcom\out
f:\0_Watcom\LIB286
f:\0_Watcom\LIB286\DOS
f:\0_Watcom\BINB
f:\0_Watcom\H
f:\0_Watcom\H\SYS
f:\0_Watcom\H\util
f:\0_Watcom\H\util
f:\0_Watcom\LIB386
f:\0_Watcom\LIB386\DOS
f:\0_Watcom\0_source
f:\0_Watcom\0_source\k5
f:\0_Watcom\0_source\dos32
f:\0_Watcom\0_source\muxa
f:\0_Watcom\0_source
f:\0_Watcom\0_source\k5
f:\0_Watcom\0_source\dos32
f:\0_Watcom\0_source\muxa
Ошибка заключается в повторяющихся строках!!!
Заранее ОООООООГРОМНОЕ спасибо!!!!!!!!!!!!!!!!!:sad:
Помогите найти ошибку в коде!!!
Только ошибка при выполнении!!!
BOOL KFileFind::IsDir()
{
if(FindFileData.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY)
return TRUE;
else return FALSE;
}
Ошибка в проверке атрибута директории,
надо так:
BOOL KFileFind::IsDir()
{
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
return TRUE;
else return FALSE;
}
потому что это битовый флаг. Попробуй исправь.
Но мне кажется что повторы все равно будут.
У меня такая же беда была - не помню как исправил...
[FONT=courier new]
[COLOR=blue]inline bool[/COLOR] KFileFind::IsDir()
{
[COLOR=blue]return[/COLOR](FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
}[/FONT]
а можно короче:
[FONT=courier new]
[COLOR=blue]inline bool[/COLOR] KFileFind::IsDir()
{
[COLOR=blue]return[/COLOR](FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
}[/FONT]
Вроде исправил но всеравно такая фигня,
возможно еще гдето ошибка(и), а можешь вспомнить
что у тебя произошло что наподобее выдавало?
Please :-(
Ошибка находится в ф-ции Recurse()
Рассмотрим поподробнее главный цикл:
while (bWorking)
{
// ВНИМАНИЕ! если директория была последней,
// тогда следующий вызов FindNext
// вернет FALSE НО ЦИКЛ ПРОДОЛЖИТ РАБОТУ
// при этом IsDir() даст добро, так как последнее
// значение осталось и директорию обработает
// еще раз => повторяющиеся строки
bWorking = finder.FindNext();
// возможное решение:
if(!bWorking) break; // И все работает. Как по маслу :)
// при этом отпадает необходимость писать while(bWorking).
// Можно просто for(;;)
if (finder.IsDots())
continue;
if (finder.IsDir())
{
CStr str = finder.GetFilePath();
cout << i <<" "<<str << endl;
Recurse(str);
}
}
Всего хорошего! 8)
Вот и я пришел, решение всех Ваших проблем :)
Ошибка находится в ф-ции Recurse()
Рассмотрим поподробнее главный цикл:
while (bWorking)
{
// ВНИМАНИЕ! если директория была последней,
// тогда следующий вызов FindNext
// вернет FALSE НО ЦИКЛ ПРОДОЛЖИТ РАБОТУ
// при этом IsDir() даст добро, так как последнее
// значение осталось и директорию обработает
// еще раз => повторяющиеся строки
bWorking = finder.FindNext();
// возможное решение:
if(!bWorking) break; // И все работает. Как по маслу :)
// при этом отпадает необходимость писать while(bWorking).
// Можно просто for(;;)
if (finder.IsDots())
continue;
if (finder.IsDir())
{
CStr str = finder.GetFilePath();
cout << i <<" "<<str << endl;
Recurse(str);
}
}
Всего хорошего! 8)
ДА ты прав все работает...но при запуске выдает
"В программе обнаружена ошибка - ...будет закрыта"
Правельно я переписал ф-ю:
void Recurse(LPCSTR pstr)
{ KFileFind finder;
CStr strWildcard(pstr);
strWildcard += "\\*.*";
BOOL bWorking = finder.FindFile(strWildcard);
//while (bWorking)
while(1) // or for (;;)
{
bWorking = finder.FindNext();
if(!bWorking) break;
if (finder.IsDots())
continue;
if (finder.IsDir())
{
CStr str = finder.GetFilePath();
cout << i <<" "<<str << endl;
i+=1;
Recurse(str);
}
}
finder.Close();
}
:-?
ДА ты прав все работает...но при запуске выдает
"В программе обнаружена ошибка - ...будет закрыта"
Правельно я переписал ф-ю:
void Recurse(LPCSTR pstr)
{ KFileFind finder;
CStr strWildcard(pstr);
strWildcard += "\\*.*";
BOOL bWorking = finder.FindFile(strWildcard);
//while (bWorking)
while(1) // or for (;;)
{
bWorking = finder.FindNext();
if(!bWorking) break;
if (finder.IsDots())
continue;
if (finder.IsDir())
{
CStr str = finder.GetFilePath();
cout << i <<" "<<str << endl;
i+=1;
Recurse(str);
}
}
finder.Close();
}
:-?
ОЙ ОЙ ПРОСТИ ЛОХОНУЛСЯ Эта ошибка моя вина , уже исправил. :D
Да а ты учился?
Сам?
А какой литературой пользовался?
:D
ОЙ ОЙ ПРОСТИ ЛОХОНУЛСЯ Эта ошибка моя вина , уже исправил. :D
Да а ты учился?
Сам?
А какой литературой пользовался?
:D
Бъерн Страуструп, Дональд Кнут и еще пара книжек :)
А код твой просто дебаггером прогнал и выловил баг ;)
Бъерн Страуструп, Дональд Кнут и еще пара книжек :)
А код твой просто дебаггером прогнал и выловил баг ;)
Ты можешь описать как ты дабаггер применял,
и использовал визуаловский?
Please :D
Ты можешь описать как ты дабаггер применял,
и использовал визуаловский?
Please :D
Визуаловский. Просто в пошаговом режиме посмотрел и обнаружил :-}