功能“;删除();在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,如果删除失败,清空文件是一种令人惊讶的行为,但如果没有关于如何观察到这种行为的详细信息,我会犹豫是否对其进行评论。@JohnBollingerfopen(“…”,“w”)
已截断文件,而不是试图删除它。fclose调用NULL而不执行任何操作难道不安全吗?@PaulStelian