2014-02-09 62 views
2

我寫這是會讀dictionnary語法如下的程序:線的多個終端刪除

john 
    philips 
    dudule 
    henry 

因此,我寫了這個程序:

#define SIZEWORD 10 

int main (int argc, char **argv) 
{ 
    /*get dictionarry words*/ 
    FILE * pFile_dictionnary; 
    char dictionarry_name[SIZEWORD]; 
    int len; 
    pFile_dictionnary = fopen (argv[1] , "r"); 
    if (pFile_dictionnary == NULL) perror ("Error while opening the dictionnary"); 
    else 
    { 
     while (!feof (pFile_dictionnary)) 
     { 
     if (fgets (dictionarry_name , SIZEWORD , pFile_dictionnary) == NULL)  break; 
     printf("Before : dictionarry_name is = [%s] \n", dictionarry_name); 
     /*remove new line*/  
     char *tmp_LF = strrchr(dictionarry_name, '\n'); 
     if(tmp_LF != NULL)*tmp_LF = '\0'; 
     printf("After : dictionarry_name is = [%s] \n", dictionarry_name);  
     } 
    } 
    fclose (pFile_dictionnary); 

return 0; 
} 

有人能解釋對我來說爲什麼我有這個輸出?我試圖消除由與fgets函數添加了新的生產線,但它似乎沒有任何效果:

Before : dictionarry_name is = [john 
] 
After : dictionarry_name is = [john 
] 
Before : dictionarry_name is = [philips 
] 
After : dictionarry_name is = [philips 
] 
Before : dictionarry_name is = [dudule 
] 
After : dictionarry_name is = [dudule 
] 
Before : dictionarry_name is = [henry 
] 
After : dictionarry_name is = [henry 
] 

感謝您的幫助

PS:很抱歉的壞顯示器,但我努力去理解如何輕鬆地做到這一點

+0

你在Windows下運行嗎? – Jasper

+2

嘗試替換\ r以及 – thumbmunkeys

+0

是的,但與cygwin –

回答

0

一個更緊湊的方式來刪除行結束是用strtok()或strtok_r()。在這裏,我更改了代碼以使用strtok()來消除任何LF,CR或兩者。我也擺脫了EOF檢查。這將會循環直到fgets()不能再讀取。當然,在一個真正的程序中,你可能想在之後檢查errno以查看是否有任何問題。

while(fgets(dictionarry_name, SIZEWORD, pFile_dictionnary) != NULL) { 
    printf("Before : dictionarry_name is = [%s] \n", dictionarry_name); 
    while(strtok(dictionarry_name, "\r\n") != NULL); 
    printf("After : dictionarry_name is = [%s] \n", dictionarry_name);  
} 

我之所以提到strtok_r,是因爲strtok的是罰款單線程程序..而你的是單線程的。但是稍後,如果您使用多線程程序,則必須使用線程安全的strtok_r()。

希望這會有所幫助。

+0

注意:'strtok(dictionarry_name,「\ n \ r」);'如果'dictionarry_name'是'「\ n」'或'「\ r \ n」''不會刪除'\ n'' – chux

+0

Thanks @chux你很對,我已經修好了。 –