提问人:melodic_n 提问时间:9/15/2023 最后编辑:chqrliemelodic_n 更新时间:9/15/2023 访问量:92
remove 函数不起作用,直到我添加带有 true 和 false 的 if 语句
remove function doesnt work until I add if statement with true and false
问:
我正在为学校做一个项目,一个学生管理系统,其中两个功能是删除学生和修改学生信息:在这两个文件中,我都创建了一个临时文件来存储新的更新版本,然后我删除了原始文件并将临时文件重命名为旧文件,但是该功能不起作用,直到我分配一个像这样的布尔变量,然后添加一个打印成功修改的语句/如果为 true,则删除,如果为 false,则不删除/修改,并且只有在我添加此语句并且我感到困惑时才有效。为什么会这样?remove
rt = remove("studentDB.txt");
if
void deletestudent(FILE *fp) {
system("cls");
fp = fopen("studentDB.txt", "r");
FILE *ft = fopen("database.tmp", "w");
bool rt;
int line, count;
char buffer[100];
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\t\t\t 2. Delete a Student \n");
printf("\t\t---------------------------------------------------------\t\t\t\t\t\t");
printf("\n");
printf("\t\t\t ");
printf("select student id \n");
printf("\t\t\t ");
scanf("%d", &line);
count = 0;
while ((fgets(buffer, 1000, fp)) != NULL)
{
count++;// so that the counting start at 1
/* If current line is line to replace */
if (count == line) {
fputs("", ft);
} else
fputs(buffer, ft);
}
fclose(fp);
fclose(ft);
rt = remove("studentDB.txt");
rename("database.tmp", "studentDB.txt");
if (rt == TRUE)
printf("not successfull");
printf("\t\t\t\t");
printf("deleted successfully \n");
system("pause");
}
我真的很困惑为什么它有效
答:
在复制循环期间,将行读入长度为 的数组中。如果输入文件中的任何一行超过 99 个字节,则表示行为未定义,这可能会导致不同的观察结果,具体取决于您添加的额外代码。fgets(buffer, 1000, fp)
buffer
100
使用不易出错的方法:
while ((fgets(buffer, sizeof buffer, fp)) != NULL)
另请注意以下备注:
检查故障并使用信息性消息报告它们非常重要。
fopen
fputs("", ft);
是无用的,没有效果。在符合 POSIX 标准的系统上,调用是不必要的,因为调用将删除目标文件并执行重命名,以确保名称为 studentDB.txt 的文件始终存在,并以原子方式替换为新文件。您似乎正在使用 Microsoft Windows 系统,其行为可能有所不同。
remove
rename("database.tmp", "studentDB.txt")
在所有情况下,最好测试并报告重命名新文件失败,并确保旧文件在失败时仍然存在。
评论
上一个:如何在C语言中删除/修改文件
下一个:Excel 匹配条件格式
评论
删除
及其真正返回的内容的更多信息。不能保证在失败时返回特定的非零值。TRUE
fgets(buffer, 1000, fp)
fgets(buffer, sizeof buffer, fp)