2017-05-31 234 views
1

我有這樣的功能:功能「刪除()」中的C不刪除所選文件

void aggiornadatabase(void) { 
    FILE* fp; 
    int c=0; 
    char str[30]; 
    int m; 

    sprintf(str, "%s.csv", utenti[posizioneuser].id); 
    printf("%s\n", str); 
    fp = fopen(str, "w"); 
    if (fp == NULL) 
     printf("Database error\n"); 
    else 
     m = remove(str); 

    if (m == 0) 
     printf("Success\n"); 
    else 
     printf("Unable to delete the File\n"); 

    fclose(fp); 
} 

當該功能執行,它將刪除選定的.csv文件的一切,但它不會刪除文件本身(實際上它打印「無法刪除文件」)。

爲什麼會發生這種情況?

回答

5

該文件保持打開狀態,並且刪除打開的文件是實現定義的,因此,刪除可能成功也可能不成功。您最好在嘗試remove之前關閉文件

+0

嗯,我在刪除之前添加了fclose(fp),但仍然不能正常工作。除文件本身外,文件中的所有內容都將被刪除 – Pikappa

+0

@Pappappa,你怎麼知道這一點?你的意思是你仍然可以「打開」文件沒有任何錯誤? – ForceBru

+0

你有另一個刪除()鏈接,刪除文件中的所有內容?嘗試取消鏈接(),看看是否有效。 – ThingyWotsit

2

你的代碼很混亂,我認爲最後的fclose(fp)是什麼給你這種奇怪的行爲。首先,您應該始終初始化變量,在您的示例中,m在輸入第二個if語句時(應該在第一個else語句中)時會生成未定義的行爲。

此外,請確保打開文件閱讀不寫作。

//sprintf(...) 
fp = open(str, "r"); 
if(fp == NULL) printf("Database error\n"); 
else { 
    fp.close() 
    if(remove(str)) printf("Unable to delete the file\n"); 
    else printf("Delete successful\n"); 
} 

不要添加,當你到達該點自上次fclose(fp),它已經關閉,或者甚至沒有被排在首位開。

+0

是不是安全的調用NULL並不做任何事情? –

+0

@PaulStelian https://stackoverflow.com/questions/32674141/if-file-pointer-is-null-do-i-have-to-use-fclose-c – lpares12

0

而不是讓我們猜測爲什麼沒有被刪除的文件,使用自己的perror()功能得到可讀和可能理解錯誤消息:

if (remove(str) == 0) 
    printf("Success\n"); 
else 
    perror("Unable to delete the file"); 

還要注意的是你的邏輯是錯誤的:如果DB文件無法打開進行寫入,則會打印消息"Database error\n";和m將保持未設置,導致未定義的行爲!