0

ディレクトリ内のすべてのファイルをスキャンして対象の単語を探し、それらを新しいファイルに出力するコードがあります。現在の問題は、while ループがファイルを読み取り、変数を文字列 (例: customer) に格納した後です。次に読み取られるファイルに対象の単語がない場合、前のファイルから文字列に格納された結果が表示されます。ファイル。私の目標は、現在のファイルに対象の単語がない場合に「N/A」と表示することです。

while ループの最後または最初にある文字列をクリアする方法をいくつか試しましたが、どれもうまくいきません。ほとんどの場合、コアダンプ エラーが発生するだけです。アイデアが不足していますが、どんな助けでも大歓迎です!

コード (読みやすいように短縮):

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 に答える