0

我有一个代码可以扫描目录中的所有文件以查找目标单词,并将它们打印到一个新文件中。现在的问题是在while循环读取一个文件并将一个变量存储到字符串中(例如customer)之后,如果正在读取的下一个文件没有目标单词,它仍然显示存储在前一个字符串中的结果文件。如果当前文件没有目标词,我的目标是让它显示“N/A”。

我尝试了几种方法来清除 while 循环末尾或开头的字符串,但它们中的大多数都不起作用,它们中的大多数只会给我一个 coredump 错误。没有想法,任何帮助将不胜感激!

代码(为便于阅读而缩短):

int main(int argc, char** argv)
{   
    char           directory[100];
    char           buff[100];
    char           delims[] = " :=";
    char*          result = NULL;
    char*          customer;
    char*          device;
    char*          buffer;
    int            i = 0;
    DIR*           FD;
    struct dirent* in_file;
    int            c = 0;

    printf("Enter directory:");                                   
    scanf("%s",directory);

    FILE* ft = fopen("workorderlist.csv", "w");    /* Open file to write to*/
    if (ft == NULL)
    {
        puts("Cannot open target file");
        exit(1);
    }

    fprintf (ft, "Work Order,Customer,Device,Test_Prog,Software,DUT_board_id,Corl box\n");

    /* Open Directory */
    if (NULL == (FD = opendir(directory))) 
    {
        puts("Cannot open directory");

        return 1;
    }

    while ((in_file = readdir(FD))) 
    {
        if (!strcmp (in_file->d_name, "."))
        {
            continue;
        }

        if (!strcmp (in_file->d_name, ".."))    
        {
            continue;
        }

        /* Open files to read from  */  
        buffer = (char*)malloc(100);
        sprintf(buffer, "%s/%s", directory, in_file->d_name);

        size_t len = strlen(buffer);
        if (len >= 4 && memcmp(buffer + len - 4, ".wor", 4) == 0)   /* checks if file ends with .wor */
        {
            FILE* fs = fopen(buffer, "r");       /* open file to read */

            if (fs == NULL)
            {
                puts("Cannot open source file");

                return 1;
            }

            /* Scanning each file for targeted words: */
            while (fgets(buff, 100, fs) != NULL)      
            {   
                result = strtok( buff, delims );          
                while (result != NULL)
                {   
                    if ((strcmp(result, "Customer") == 0))
                    { 
                        result = strtok(NULL,delims);  
                        customer = (char*)malloc((strlen(result)+1)*sizeof(char));
                        strcpy(customer, result);
                        for (i = 0; i < strlen(customer) + 1; i++)
                        {
                            if (customer[i] == '\n')
                            {
                                break;
                            }
                        }

                        customer[i] = ' ';
                    }

                    if (strcmp(result, "device") == 0)
                    { 
                        result = strtok(NULL, delims);  
                        device = (char*)malloc((strlen(result) + 1) * sizeof(char));
                        strcpy(device, result);
                        for (i = 0; i < strlen(device) + 1; i++)
                        { 
                            if(device[i] == '\n')
                            {
                                break;
                            }
                        }

                        device[i] = ' ';
                    }

                    result = strtok(NULL,delims);
                }   
            }

            if (customer == '\0')
            {
                customer = "N/A";
            }

            if (device == '\0')
            {
                device = "N/A";
            }

            fprintf(ft, "%s,%s,%s,%s,%s,%s,%s\n", 
                    in_file->d_name, customer, device, testprog, 
                    software, dutboardid, corlbox);

             printf(in_file->d_name);
             printf("\n");
             fclose (fs) ;
             c++;
        }
    }

    printf("Total Workorders Found: %d (Info saved to workorderlist.csv)\n", c);
    fclose(ft);

    return 0;
}
4

1 回答 1

1

首先,客户/设备是字符串。你不应该为它做 == 比较。例如,您可以比较字符串的第一个字符:device[0] == '\0'; 您应该在循环开始之前进行字符串初始化。您可以通过使用带有已知值的 strcpy 或任何其他字符串操作函数来实现此目的。您在循环之前用于初始化字符串的值是您稍后将使用 strcmp 或类似方法测试的值。与 int 或任何其他 C 数据类型一样,但您需要操作函数。

顺便说一句,您还没有在此处的问题中发布您的读取文件循环吗?

希望这可以帮助。

于 2013-01-12T04:07:13.793 回答