功能“;删除();在C中,不删除所选文件

功能“;删除();在C中,不删除所选文件,c,function,file,stream,C,Function,File,Stream,我有这个功能: 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

我有这个功能:

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文件中的所有内容,但不会删除文件本身(实际上,它会打印“无法删除文件”)


为什么会发生这种情况?

文件保持打开状态,并且删除打开的文件是由实现定义的,因此,删除可能会成功,也可能不会成功。您最好先关闭该文件,然后再尝试删除它

你的代码乱七八糟,我认为最后一个
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)
,因为当您到达该点时,它已经关闭,或者根本没有打开。

与其让我们猜测文件没有被删除的原因,不如自己使用函数来获取可读且可能可以理解的错误消息:

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

还要注意,您的逻辑是错误的:如果无法打开DB文件进行写入,则会打印消息
“Database error\n”
;而
m
将保持未设置状态,导致未定义的行为

在remove()中使用文件的路径/名称字符串而不是指向文件的指针应该可以工作

嗯,我在删除之前添加了一个fclose(fp),但仍然不能正常工作。除文件外,文件中的所有内容都将被删除himself@Pikappa你怎么知道的?你的意思是说你仍然可以
fopen
无错误地打开文件吗?你是否有另一个删除()链接来删除文件中的所有内容?请改为尝试取消链接(),看看是否有效。@Pikappa,如果删除失败,清空文件是一种令人惊讶的行为,但如果没有关于如何观察到这种行为的详细信息,我会犹豫是否对其进行评论。@JohnBollinger
fopen(“…”,“w”)
已截断文件,而不是试图删除它。fclose调用NULL而不执行任何操作难道不安全吗?@PaulStelian