Использование ftw() правильно в c

У меня есть следующее в моем коде: (кодирование в с)

    ftw(argv[2], parseFile, 100)  

argv[2] - это путь к локальному каталогу. Например. argv[2] = "TestCases" и папка testcases находится в том же каталоге, что и мой.o файл.

Насколько я понимаю, это должно пройти через каталог TestCases и отправить каждый найденный файл в функцию parseFile.

Что на самом деле происходит, так это просто посылает мой аргумент в функцию parseFile, и это все. Что я делаю неправильно? Как я должен использовать это правильно?

РЕДАКТИРОВАТЬ: Это parseFile:

int parseFile(const char * ftw_filePath,const struct stat * ptr, int flags){
    FILE * file;
    TokenizerT * currFile;
    char fileString[1000], * currWord, * fileName;

    fileName = strdup(ftw_filePath);

    if( fileName == NULL || strlen(fileName) <= 0){
        free(fileName);
        return -1;
    }
    printf("\n%s\n",fileName);
    if(strcmp(fileName,"-h")== 0){
        printf("To run this program(wordstats) type './wordstat.c' followed by a space followed by the file's directory location. (e.g. Desktop/CS211/Assignment1/test.txt )");
        free(fileName);
        return 1;
    }
    else{
        file=fopen(fileName,"r");
    }

    if(!file){
        fprintf(stderr,"Error: File Does not Exist in designated location. Please restart the program and try again.\n");
        free(fileName);
        return 0;
    }
    memset(fileString, '\0', 1000);

    while(fscanf(file,"%s", fileString) != EOF){ /* traverses the file line by line*/
            stringToLower(fileString);
            currFile = TKCreate("alphanum",fileString);

            while((currWord = TKGetNextToken(currFile)) != NULL) {

                insert_List(currWord, words,fileName);

            }
            free(currFile->delimiters);
            free(currFile->copied_string);

            free(currFile);
        memset(fileString, '\0', 1000);
    }

    fclose(file);
    free(fileName);
    return 1;
}

Это будет работать, если я введу TestCases/big.txt для моего argv[2], но не если я поставлю TestCases

2 ответа

Решение

Как описано на странице руководства, ненулевое возвращаемое значение из функции, которую вызывает ftw, указывает ftw прекратить работу.

В вашем коде есть различные операторы возврата, но единственный, который возвращает 0 - это условие ошибки.

Правильно разработанный интерфейс обратного вызова C имеет аргумент void*, который можно использовать для передачи произвольных данных из окружающего кода в обратный вызов. [n] У ftw такого аргумента нет, так что вы вроде как ручей.

Если ваш компилятор поддерживает локальные переменные потока (спецификатор хранения __thread), вы можете использовать их вместо глобальных; это будет работать, но на самом деле не намного аккуратнее, чем глобальные.

Если в вашей библиотеке C есть семейство функций fts, используйте их. Они доступны в большинстве современных Unix-систем (включая Linux, OSX и последние *BSD)

Другие вопросы по тегам