我有这个功能:
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文件中的所有内容,但它不会删除文件本身(实际上它会打印“无法删除文件”)。
为什么会这样?
答案 0 :(得分:5)
文件保持打开状态,删除打开的文件是实现定义的,因此删除可能成功也可能不成功。在尝试remove
之前,您最好关闭文件。
答案 1 :(得分:2)
您的代码很乱,我认为最后gem install rmagick
是给您这种奇怪行为的原因。首先,您应该始终初始化变量,在您的示例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");
}
,因为当您到达该点时,它已经关闭,或者它甚至没有首先打开。
答案 2 :(得分:0)
不要让我们猜测文件未被移除的原因,而是自己使用perror()
函数来获取可读以及可能可理解的错误消息:< / p>
if (remove(str) == 0)
printf("Success\n");
else
perror("Unable to delete the file");
另请注意,您的逻辑有问题:如果无法打开DB文件进行写入,则会打印消息"Database error\n"
;并且m
将保持未设置状态,导致未定义的行为!
答案 3 :(得分:0)
在remove()中使用文件的路径/名称字符串而不是指向文件的指针应该有效。