2017-05-31 77 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将保持未设置,导致未定义的行为!