Вызов функции findnext() завершается ошибкой при втором вызове. Сбой программы

Функция _findnext() не работает при повторном вызове. Вот код.

int main() {
    struct _finddata_t ffblk;
    intptr_t done;

    chdir("tmp");
    printf("Directory changed to dir successfully\n");

    done=_findfirst("*.txt",&ffblk);
    printf("Call to findfirst successful\n");
    printf("%s\n",ffblk.name);
    do{
        done=_findnext(done,&ffblk);
        printf("%s\n",ffblk.name);
    } while(!done);
    printf("Exited the main loop\n");
    getch();
}

Программа вылетает, как только получает и печатает имена первых двух файлов в папке tmp. Первое печатаемое имя файла происходит из функции findfirst(). Следующее имя файла печатается findnext(). Я проверил через отладку.

Теперь, когда findnext() вызывается во второй раз в цикле, программа вылетает. Я использую gcc и пробовал большинство вещей с возвращаемым значением, но безуспешно. Любые идеи ?


person vish213    schedule 27.07.2012    source источник
comment
Что такое _findfirst, _findnext, _find*? Я не помню, чтобы это было в стандарте C.   -  person ArjunShankar    schedule 27.07.2012
comment
Вы использовали отладчик и проверили, в какой строке он падает?   -  person Thomas    schedule 27.07.2012
comment
Google говорит мне, что _find* является частью Microsoft Visual C++. Я бы предложил редактировать с соответствующими тегами.   -  person ArjunShankar    schedule 27.07.2012
comment
Проверьте документы, _findfirst очевидно возвращает intptr_t, _findnext и int   -  person fvu    schedule 27.07.2012
comment
findfirst находится в стандартной библиотеке C, используется для поиска файла с заданными спецификациями, но работает только с 16-битным компилятором. Я нашел в Google, что для использования этого материала в 32-битном компиляторе мне нужно использовать _findfirst и подобные функции.   -  person vish213    schedule 27.07.2012
comment
@Thomas: я не использую отладчик, но я использовал множество операторов printf и других способов убедиться, что эта строка: - done=_findnext(done,&ffblk); при вызове во второй раз вызывает сбой. Это подтверждение. Независимо от того, сколько текстовых файлов находится в папке tmp.   -  person vish213    schedule 27.07.2012
comment
@vish213 vish213 вы, должно быть, неправильно поняли, что я думаю - почему некоторые стандартные вызовы должны работать только с 16-битным компилятором (stoneage) ???   -  person fvu    schedule 27.07.2012
comment
@fvu: я тоже так пробовал, у меня не сработало. Но хорошо, я попробую еще раз, потому что раньше я сделал переменную done int, так что теперь я попробую с новой переменной. Хотя не думайте, что это изменит ситуацию.   -  person vish213    schedule 27.07.2012
comment
@ vish213, не могли бы вы также сказать нам, какую версию компилятора вы здесь используете?   -  person fvu    schedule 27.07.2012
comment
@fvu: может быть, я не смог правильно объяснить здесь. На самом деле эти функции использовали некоторую структуру ffblk, которая работает только с 16-битным компилятором. Я где-то читал (может быть, в самом stackoverflow), что мне нужно использовать struct _finddata_t.   -  person vish213    schedule 27.07.2012
comment
@ vish213 - Нет. Стандарт C не предписывает специальные функции для 16-битных компиляторов. Нигде в findfirst из _findfirst. ">Стандарт C.   -  person ArjunShankar    schedule 27.07.2012
comment
@vish213 - Прежде чем пытаться что-то еще, подумайте о том, чтобы прочитать этот вопрос   -  person ArjunShankar    schedule 27.07.2012
comment
@fvu: я не знаю, как это проверить. Но дата его выпуска — 26 апреля (как указано в названии файла). Должен ли я проверить это, погуглив, как проверить версию gcc?   -  person vish213    schedule 27.07.2012
comment
@vish213, какую операционную систему вы используете? Какой #include вы используете, чтобы иметь возможность использовать этот _find* материал? Версию GCC обычно можно получить, выполнив gcc --version (по крайней мере, так работает моя копия GCC в дистрибутиве GNU/Linux. Не знаю о Windows.)   -  person ArjunShankar    schedule 27.07.2012
comment
@ vish213, если вы используете GCC, нет причин не придерживаться стандартных функций библиотеки C opendir - readdir - closedir. У меня сложилось впечатление, что вы используете Visual C++.   -  person fvu    schedule 27.07.2012
comment
@ArjunShankar: Все работает хорошо, за исключением второго вызова _findnext(). У меня нет проблем, таких как некоторая библиотечная функция, не найденная при компиляции. Должен ли я еще копать глубже в ссылку, которую вы предоставили? Без обид, но только потому, что МНЕ кажется, что вы пытаетесь сказать, что могут быть некоторые проблемы с недоступными функциями, такими как _findfirst(), _findnext().   -  person vish213    schedule 27.07.2012
comment
@ArjunShankar: у меня Windows 7 --GCC версии 4.6.2 (спасибо). И эти функции из io.h   -  person vish213    schedule 27.07.2012
comment
@vish213 - Я не обижен :) Я просто пытаюсь выяснить, какую библиотеку ты используешь. Функции (очевидно) не в стандарте C. Если люди не знают, какую библиотеку вы используете, все догадки/комментарии спорны. Вы, вероятно, заметили, что кто-то уже отредактировал ваш вопрос и добавил к нему тег Microsoft Visual C Runtime. Вы говорите, что используете GCC. Я недостаточно разбираюсь в разработке для Windows, чтобы даже сказать, может ли GCC компилироваться против MSVCRT.   -  person ArjunShankar    schedule 27.07.2012
comment
@fvu Может быть, вы только что сказали лучший способ, но разве я не должен знать, что происходит не так? Есть кое-что, что я не мог переварить, потому что функция не работает в соответствии с определением библиотеки - предполагается, что findnext() будет предоставлять файлы с заданными критериями до тех пор, пока их больше не будет.   -  person vish213    schedule 27.07.2012


Ответы (1)


Ваша проблема в том, что вы не можете присвоить значение _findnext своему дескриптору, вам нужны две переменные:

intptr_t handle = 0;
int done = 0;

handle = _findfirst("*.txt",&ffblk);
while(handle && done != -1)
{
    printf("%s\n",ffblk.name);
    done = _findnext(handle,&ffblk);
}
person Dani    schedule 27.07.2012
comment
_findfirst() возвращает -1 в случае ошибки, а не 0. - person egrunin; 27.07.2012
comment
Подождите, это сработало! Спасибо. Я не исправил параметры _findnext. Большое спасибо. - person vish213; 27.07.2012