readdir()和fgets

时间:2015-06-17 17:12:42

标签: c loops fgets readdir

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

所以,我的任务:打开目录>打开文件>比较字符串>打开下一个文件(重复) 直到我用完文件。

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

对不起,我是 C 的新手,所以我可能不清楚这些功能的实际运作方式。

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

while ((in_file = readdir(FD))!= NULL){

应该基本遍历一个目录并且"看看"每个文件的名称。 然后我做了一些非常低效的工作,你可能会嘲笑我,我设法得到目录中第一个文件的完整路径名。 然后我将该路径名指定给entry_file指针,由fgets()打开。 我相信fgets()应该单独读取每一行,直到它看到一个EOF字符

现在,在我添加目录内容之前,我已经开始使用此部分了,我只是使用fopen()打开一个文件并使用其完整路径名称,但我还没有触及它。所以我不认为我的问题在这里,但根本没有打印到fp1,所以我真的不知道。

然后我做一些简单的字符串比较并尝试将匹配打印到fp1 当它到达文件末尾时,它应该关闭文件,然后返回到readdir()并使用下一个文件重复该过程

非常感谢您的帮助。我可能听起来像个白痴,但我不知道是什么原因引起的。

是的,我意识到它非常混乱,我有许多未使用和无意义的变量。我已经试图解决这个问题好几天了,尝试了很多不同的方法。

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

1 个答案:

答案 0 :(得分:0)

由于pathstr2被声明为本地数组,因此您应该使用:

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搜索整行中的第二个字符串。如果字符串应该从行的开头开始,你应该写:

if (!strncmp(buffer, str1, strlen(str1))) {
    // line starts with str1
}