2013-01-10 114 views
0

我的代碼在這裏假設要掃描所有.wor文件的目錄,並將每個文件的信息提取到新的.csv文件。
但是,它只適用於一個目錄(我正在編寫此C程序的目錄,其中有2個.wor文件和幾個文本文件)。當我嘗試進入一個不同的目錄,其中只有3個.wor文件時,它給了我一個錯誤消息,我指定它顯示文件== NULL時;從這一行:C程序目錄掃描器只能用於一個目錄

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

     return 1; 
    } 

如果if語句我刪除此一起,它會顯示一個「總線錯誤(核心轉儲)」的錯誤。

我不知道發生了什麼,有沒有什麼我不在這裏做?

這裏是我的完整代碼:

#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 directory[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; 

/*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 ("/home/iselabs/dwang/pinscale/workorder/practice"))) 
    { 

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



size_t len = strlen(in_file->d_name); 
if (len >= 4 && memcmp(in_file->d_name + len - 4, ".wor", 4) == 0) /* checks if file ends with .wor */ 
{ 

FILE * fs = fopen(in_file->d_name, "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,"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", 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 \n", c); 
    fclose (ft) ; 
return 0; 

}

+2

您可能沒有權限打開/讀取該目錄中的文件。 – g13n

+0

我應該,它是我在我自己的文件夾中創建的目錄,就像正在工作的其他目錄。有沒有辦法檢查這個? –

+0

哦,我之前編寫了一個程序單獨讀取這些文件,並且它適用於這兩個目錄。所以我很確定我有權打開/讀取這兩個目錄中的文件。 Yup; –

回答

2

您需要的目錄名稱與您正在試圖打開,或可能的文件名結合試圖打開文件之前調用chdir()

你可以malloc基於目錄名的組合長度,再加上文件名,加上路徑分隔符(/)和一個多爲空終止額外的字符緩衝區。

然後使用sprintf(buffer, "%s/%s", directory, filename);獲取文件的完整路徑,然後嘗試打開該文件。

printf添加到您的錯誤字符串中,並顯示您要打開的文件的名稱以幫助進行調試。

+0

你需要創建完整的路徑名。 [如何使用'readdir()'製作文件名數組?](http://stackoverflow.com/a/14191292/15168)中的代碼說明了這樣做的一種方法。 –

+0

Awsome。這確實是個問題。謝謝。 –