我正在编写一个程序,要求用户提供文件名,如果文件名不存在,则创建它。在程序末尾,我要检查创建的程序是否为空,如果为空,则将其删除。不删除它,然后使用相同的文件名运行该程序会弄乱检测输入的方式。
我尝试使用rewind()
返回到开头,然后检查feof()
来查看文件的开头是否是EOF字符,但这没用。
然后,我进行了一些在线搜索,找到了一种方法,该方法使用fseek()
转到文件的末尾,然后用ftell()
检查文件的末尾是否在位置0 ,但这仍然行不通。
我回过头去做了更多的探索,发现问题可能是因为我没有先使用fclose()
,所以我再次尝试了前两个尝试的解决方案,这次确保关闭了文件尝试删除它之前。仍然没有骰子。
我尝试检查errno
的设置,并得到了2: No such file or directory
。这显然是错误的,因为如果是这种情况,那意味着我已经实现了我的目标,并且当我检查工作目录时,文件仍然存在。
我完全不知道下一步该怎么做。谁能指出我正确的方向?
以下是我尝试删除文件的方式(fp
是文件指针,而file
是char指针,其名称为fp
指向的文件名):
尝试1:
rewind(fp);
if(feof(fp)){
remove(file);
}
尝试2:
fseek(fp, 1, SEEK_END);
long size = ftell(fp);
if(size == 0){
remove(file);
}
尝试3:
fseek(fp, 1, SEEK_END);
long size = ftell(fp);
fclose(fp);
if(size == 0){
remove(file);
}
尝试4:
rewind(fp);
int empty = 0;
if(feof(fp)){
empty = 1;
}
fclose(fp);
if(empty == 1){
remove(file);
}
更新:这是几个MCVE,每种方法一个。
#include <stdio.h>
#include <errno.h>
int main() {
FILE *fp;
char file[40];
scanf(" %[^\n]s", file);
fp = fopen(file, "r");
if(fp == NULL){
fp = fopen(file, "w");
int result;
rewind(fp);
int empty = 0;
if(feof(fp)){
empty = 1;
}
fclose(fp);
if(empty == 1){
result = remove(file);
}
printf("%d\n", result);
printf("%d\n", errno);
return 0;
}
版本2:
#include <stdio.h>
#include <errno.h>
int main() {
FILE *fp;
char file[40];
scanf(" %[^\n]s", file);
fp = fopen(file, "r");
if(fp == NULL){
fp = fopen(file, "w");
int result;
fseek(fp, 1, SEEK_END);
long size = ftell(fp);
fclose(fp);
if(size == 0){
result = remove(file);
}
printf("%d\n", result);
printf("%d\n", errno);
return 0;
}
更新2:
我刚刚意识到,当我制作MCVE时,当我运行它们时,result
返回了0
,这应该表示成功,但是文件仍在目录中。我不知所措。
答案 0 :(得分:0)
代码未到达remove
语句。