2013-01-10 47 views
0

我正在嘗試編寫一個C代碼來掃描以.wor結尾的文件的整個目錄,打開每個文件並從中提取某些信息。
到目前爲止,我的代碼已成功打開該目錄中的所有文件,並掃描目標文字。有沒有辦法讓我修改代碼,以便只掃描以.wor結尾的文件?我嘗試了通配符「* .wor」,但它只是給了我一個錯誤,說明符號*和.wor無法識別。
非常感謝您的幫助!
(順便說一句,我不能得到計數器,我加在最後工作,即時嘗試使用整數「C」增加每次讀取文件,並顯示在最後讀取的文件總數。只是給我0現在)掃描以.wor結尾的目錄中的所有文件

這裏是我的代碼:

#include <stdio.h> 
    #include <string.h> 
    #include <stdlib.h> 
    #include <sys/types.h> 
    #include <dirent.h> 
    #include <unistd.h> 
    #include <errno.h> 

    int main(int argc, char **argv) { 

char file[100]; 
char buff[100]; 
char delims[] = " :="; 
char *result = NULL; 
char *customer; 
char *device; 
char *testprog; 
char *software; 
char *dutboardid; 
char *corlbox; 
int i=0; 
DIR * FD; 
struct dirent* in_file; 
int c = 0; 


    FILE * ft = fopen ("WorkOrderInfo.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 ("/home/iselabs/dwang/pinscale/workorder/practice"))) 
    { 
    fprintf(stderr, "Error : Failed to open input directory - %s\n"); 
    fclose(ft); 

    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 */ 


    FILE * fs = fopen(in_file->d_name, "r"); 
    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,"name")==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] = ' '; 
     } 


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

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

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

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

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

} 


fprintf (ft, "%s,%s,%s,%s,%s,%s,%s\n", file, customer, device, testprog, software, dutboardid, corlbox); 


fclose (fs) ; 
printf("hey\n"); 
c = c++;        /*Increments c by 1 every time a file is read */ 
} 

printf("total files scanned: %d \n", c); 
    fclose (ft) ; 
return 0; 

}

回答

2

可以手動檢查,如果每個文件名中.wor這樣結束:

size_t len = strlen(in_file->d_name); 
if (len >= 4 && memcmp(in_file->d_name + len - 4, ".wor", 4) == 0) 
{ 
    // The filename ends in ".wor" (case-sensitive). Note that this also 
    // accepts the file whose entire name is ".wor". 
} 

或者,您可以改用glob(3)函數來獲取匹配特定通配符的文件名列表:

// Error checking omitted for expository purposes 
glob_t globbuf; 
glob("/home/iselabs/dwang/pinscale/workorder/practice/*.wor", 0, NULL, &globbuf); 

for (size_t i = 0; i < globbuf.gl_pathc; i++) 
{ 
    char *filename = globbuf.gl_pathv[i]; 
    // Process filename... 
} 

globfree(&globbuf); 
+0

謝謝。它現在有效。你有沒有機會知道我的櫃檯不工作?它仍然顯示「掃描的總文件是0」。謝謝! –

+0

@DaveWang:語句'c = C++;'是*未定義的行爲,因爲您在一個表達式中修改了'c'兩次。你想把它寫成'C++;'或者'c = c + 1;'。 –

相關問題