Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ошибка в коде, только для продвинутых.

452
08 октября 2002 года
quasar1983
38 / / 20.04.2000
Помогите найти ошибку в коде!!!
Только ошибка при выполнении!!!

Вот кусок кода: 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:
409
08 октября 2002 года
Ramzes
163 / / 20.09.2000
Цитата:
Originally posted by quasar1983
Помогите найти ошибку в коде!!!
Только ошибка при выполнении!!!

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;
}

потому что это битовый флаг. Попробуй исправь.
Но мне кажется что повторы все равно будут.
У меня такая же беда была - не помню как исправил...

409
08 октября 2002 года
Ramzes
163 / / 20.09.2000
а можно короче:

[FONT=courier new]
[COLOR=blue]inline bool[/COLOR] KFileFind::IsDir()
{
[COLOR=blue]return[/COLOR](FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
}[/FONT]
452
08 октября 2002 года
quasar1983
38 / / 20.04.2000
Цитата:
Originally posted by Ramzes
а можно короче:

[FONT=courier new]
[COLOR=blue]inline bool[/COLOR] KFileFind::IsDir()
{
[COLOR=blue]return[/COLOR](FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
}[/FONT]



Вроде исправил но всеравно такая фигня,
возможно еще гдето ошибка(и), а можешь вспомнить
что у тебя произошло что наподобее выдавало?
Please :-(

540
09 октября 2002 года
AL C++ Programmer
36 / / 20.01.2000
Вот и я пришел, решение всех Ваших проблем :)

Ошибка находится в ф-ции 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)
452
09 октября 2002 года
quasar1983
38 / / 20.04.2000
Цитата:
Originally posted by AL C++ Programmer
Вот и я пришел, решение всех Ваших проблем :)

Ошибка находится в ф-ции 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();
}
:-?

452
09 октября 2002 года
quasar1983
38 / / 20.04.2000
Цитата:
Originally posted by quasar1983


ДА ты прав все работает...но при запуске выдает
"В программе обнаружена ошибка - ...будет закрыта"
Правельно я переписал ф-ю:
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

540
09 октября 2002 года
AL C++ Programmer
36 / / 20.01.2000
Цитата:
Originally posted by quasar1983


ОЙ ОЙ ПРОСТИ ЛОХОНУЛСЯ Эта ошибка моя вина , уже исправил. :D
Да а ты учился?
Сам?
А какой литературой пользовался?
:D


Бъерн Страуструп, Дональд Кнут и еще пара книжек :)

А код твой просто дебаггером прогнал и выловил баг ;)

452
10 октября 2002 года
quasar1983
38 / / 20.04.2000
Цитата:
Originally posted by AL C++ Programmer

Бъерн Страуструп, Дональд Кнут и еще пара книжек :)

А код твой просто дебаггером прогнал и выловил баг ;)


Ты можешь описать как ты дабаггер применял,
и использовал визуаловский?
Please :D

540
10 октября 2002 года
AL C++ Programmer
36 / / 20.01.2000
Цитата:
Originally posted by quasar1983

Ты можешь описать как ты дабаггер применял,
и использовал визуаловский?
Please :D



Визуаловский. Просто в пошаговом режиме посмотрел и обнаружил :-}

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог