首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >readdir()和fget问题

readdir()和fget问题
EN

Stack Overflow用户
提问于 2015-06-17 17:12:41
回答 1查看 566关注 0票数 0

我正在编写一段代码,其中可以为我提供一个.txt文件目录,以及每个文件中出现的特定字符串,并进行一些简单的比较。代码块将在下面发布。

因此,我的任务是:打开directory>open file>compare strings>open下一个文件(重复),直到文件用完为止。

出了什么问题:我的代码目前无限地打印第一个文件名(完整路径名),直到它崩溃,没有任何东西被打印到fp1。它应该只打印一次文件名,但是它永远不会超过第一个文件,显然,我希望它能够遍历目录中的所有文件。

很抱歉,我对C相当陌生,所以我可能不清楚这些函数实际上是如何运行的。

如果我错了,请纠正我,我想看看我是否正确理解。

代码语言:javascript
复制
while ((in_file = readdir(FD))!= NULL){

基本上应该遍历一个目录并“查看”每个文件的名称。然后,我做了一些非常低效的工作,你可能会嘲笑我,我设法获得目录中第一个文件的完整路径名。然后,我将路径名称分配给entry_file指针,在那里它由fgets()打开。我认为fgets()应该单独阅读每一行,直到它看到EOF字符为止。

现在,在添加目录内容之前,我已经开始使用这个部分了,在这里,我使用fopen()的完整路径名打开了一个文件,但我没有碰过它。所以我不认为我的问题在这里,但是没有任何东西被打印到fp1,所以我真的不知道。

然后进行一些简单的字符串比较,然后尝试打印到fp1的匹配值,当它到达文件的末尾时,它应该关闭该文件,然后返回到readdir(),并在下一个文件中重复这个过程。

非常感谢你的帮助。我可能听起来像个白痴,但我只是不知道是什么导致了这一切。

是的,我意识到它非常混乱,而且我有许多未使用的、毫无意义的变量。我已经想了好几天了,尝试了很多不同的方法。

代码语言:javascript
复制
int main(void)
{

char str1[10000];
char str2[] = { "Measure L1 current Tank Heater ON: Passed" };
char str3[] = { "Measure L1 current Tank Heater ON: Failed" };
char str4[] = { "Measure L1 current Manifold Heater ON: Passed" };
char str5[] = { "Measure L1 current Manifold Heater ON: Failed" };
char str6[] = { "Measure L1 current (verify heaters off) Manifold: Passed" };
char str7[] = { "Measure L1 current (verify heaters off) Manifold: Failed" };
char sn[] = { "Serial Number:                1" };
DIR* FD;
struct dirent* in_file;
int lcount = 0;//line counter
char *ret;
int linenum = 0;//temp line count
char mes[500];//measurement
double val = 0;//value
char unit[500];//units
char pathstr1[38] = ("C:/Users/liam.king/Desktop/TestFiles/");
char pathstr2[200];


DWORD retval = 0;

char buffer[BUFSIZE] = ("");
char buf[BUFSIZE] = ("");
char** lppPart = {NULL};

FILE *fp, *fp1, *filewrite;
FILE *entry_file;
//fp = fopen("C:/Users/liam.king/Desktop/TestFiles/ProBlueUnit_UpgradeRev4_Report[1022230.SA15E14082][9 39 00 AM][5 19 2015].txt", "r");
fp1 = fopen("C:/Users/liam.king/Desktop/ProBlueTestWrite.txt", "a");
filewrite = fopen("C:/Users/liam.king/Desktop/FileWrite.txt", "w+");
if (fp1 == NULL){
    printf("Invalid file name");
    return 0;
}

if ((FD = opendir(LONG_DIR_NAME))==NULL)
{
    printf("Error: Failed to open directory\n");


    return 0;
}
else{
    printf("Directory opened successful\n");
}
while ((in_file = readdir(FD))!= NULL){

    if (strcmp(in_file->d_name, ".") == 0 || strcmp(in_file->d_name, "..") == 0)
        continue;


    fprintf(filewrite, "%s", pathstr1);
    fprintf(filewrite,"%s", in_file->d_name);
    fclose(filewrite);

    filewrite = fopen("C:/Users/liam.king/Desktop/FileWrite.txt", "r");



        fscanf(filewrite, "%[^\n]%*c", pathstr2);
        printf("%s\n", pathstr2);//check file name is correct

        entry_file = fopen(pathstr2, "r");
        fclose(filewrite);


        if (entry_file != NULL){
            //printf("SUCCESSFULL OPENING\n");
            //fprintf(fp1, "Does this work?\n");


        }
        else if (entry_file == NULL){
            printf("Error: Failed to open entry file\n");
            return 0;

        }

            while (fgets(buffer, 256, entry_file) != NULL){//string being stored in str1 from file *entry_file

lcount++;
                ret = strstr(str1, sn);
                if (ret != NULL){
                    fprintf(fp1, "%s\n", str1);
                }
                ret = strstr(str1, str2);
                if (ret != NULL){// compares str1 and 2
                    fprintf(fp1, "Found"" %s ""at line %d\n", str1, lcount);//if same, declare match and what line found at. 
                    linenum = lcount;
                }
//comparing more strings

            }
            fclose(entry_file);

    }

fclose(fp1);

return 0;
}
EN

回答 1

Stack Overflow用户

发布于 2015-06-17 17:36:48

由于pathstr2被声明为一个本地数组,所以您应该使用以下方法:

代码语言:javascript
复制
while ((in_file = readdir(FD)) != NULL) {
    if (!strcmp(in_file->d_name, ".") || !strcmp(in_file->d_name, ".."))
        continue;

    snprintf(pathstr2, sizeof(pathstr2), "%s%s", pathstr1, in_file->d_name);
    entry_file = fopen(pathstr2, "r");
    ...
    while (fgets(buffer, sizeof(buffer), entry_file) != NULL) {
        lcount++;
        if (strstr(buffer, sn)) {
            fprintf(fp1, "%s", buffer);
        }
        if (strstr(buffer, str1)) {
            fprintf(fp1, "Found \"%s\" at line %d\n", str1, lcount);
            linenum = lcount;
        }
        ...
    }
    fclose(entry_file);
}

在从strstr读取的行中使用entry_file执行的测试并不是不正确的。您应该指定buffer而不是str1作为第一个参数。

还请注意,strstr在整行中搜索第二个字符串。如果字符串应该从行的开头开始,则应该编写:

代码语言:javascript
复制
if (!strncmp(buffer, str1, strlen(str1))) {
    // line starts with str1
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30898133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档