Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c中正确使用ftw()_C_Linux_Unix_Directory_File Traversal - Fatal编程技术网

在c中正确使用ftw()

在c中正确使用ftw(),c,linux,unix,directory,file-traversal,C,Linux,Unix,Directory,File Traversal,我的代码中有以下内容:(用c编码) argv[2]是本地目录路径。例如。argv[2]=“TestCases”,并且在与my.o文件相同的目录中有一个TestCases文件夹 我的理解是,这应该遍历TestCases目录,并将找到的每个文件发送到函数parseFile 实际上,它只是将我的参数发送到函数parseFile,仅此而已。我做错了什么?我该如何正确使用这个 编辑:这是解析文件: int parseFile(const char * ftw_filePath,const struct s

我的代码中有以下内容:(用c编码)

argv[2]是本地目录路径。例如。argv[2]=“TestCases”,并且在与my.o文件相同的目录中有一个TestCases文件夹

我的理解是,这应该遍历TestCases目录,并将找到的每个文件发送到函数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;
}
int-parseFile(常量字符*ftw_文件路径,常量结构stat*ptr,int标志){
文件*文件;
TokenizerT*curr文件;
char fileString[1000],*currWord,*fileName;
fileName=strdup(ftw_filePath);
if(fileName==NULL | | strlen(fileName)分隔符);
自由(当前文件->复制的\u字符串);
免费(文件);
memset(文件字符串'\0',1000);
}
fclose(文件);
免费(文件名);
返回1;
}

如果我为argv[2]输入TestCases/big.txt,它就会工作,但如果我放置TestCases,它就不会工作。一个设计合理的C回调接口有一个void*参数,您可以使用它将周围代码中的任意数据传递到回调中。[n] ftw没有这样的争论,所以你有点进退两难

如果编译器支持线程局部变量(线程存储说明符),则可以使用它们而不是全局变量;这将起作用,但实际上并没有比全局的更整洁

如果您的C库有fts系列函数,请改用这些函数。它们在大多数现代Unix(包括Linux、OSX和最新的*BSD)上可用。

如中所述,ftw调用的函数的非零返回值告诉ftw停止运行


您的代码有各种返回语句,但唯一返回0的语句是错误条件。

刚刚添加了它,基本上,当我输入文件名时,它可以工作,例如TestCases/big.txt,但不是testcase。您可以给我一个如何在我的案例中使用fts的示例。我也不确定这与我的问题有何关系
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;
}