提问人:melodic_n 提问时间:9/16/2023 更新时间:9/16/2023 访问量:72
如何在C语言中删除/修改文件
how to delete / modify a file in c
问:
在我的项目“学生管理系统”中,我有两个功能要求我创建一个临时文件,将原始文件的内容复制到其中,除了我要修改或删除的那一行,然后删除旧文件并将临时文件(.tmp)重命名为带有(.txt)的旧文件名, 当我第一次运行程序时,它工作的文件被更改重命名等,但是当我继续时,因为它是一个循环,第二次文件没有被删除并且临时文件没有更改名称,我如何确保它临时文件更改名称和删除旧文件?
void deletestudent(FILE *fp){
fflush(stdin);
system("cls");
fp=fopen("studentDB.txt","r");
if (fp == NULL)
printf("file not openned");
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 succesfull");
printf("\t\t\t\t");
printf("deleted successfully \n");
system("pause");
}
我想确保每次我调用这些函数时一切正常,无论我使用多少次
答:
2赞
greg spears
9/16/2023
#1
这是按照您的要求执行的一种方法,从现有代码中借用。
有几种方法可以做到这一点。虽然这可能不是最好的方法
总而言之,可以肯定的是,它至少是便携式的。注意:事实并非如此
万无一失:请注意,如果文件不可访问,fopen() 可能会失败 --
即使它存在。也就是说,这是编译和测试的代码。
使用风险自负:
#include <stdio.h>
#include <stdlib.h>
int file_exist(char *filename)
{
/* mode = "r": Opens for reading. If the file does not exist or cannot
** be found, the fopen call fails.*/
FILE *fp = fopen(filename,"r");
if (!fp)
return 0; /* NO: file does not exist/not found */
fclose(fp); /* Found file and opened -- so close it*/
return 1; /* YES: file exists, found */
}
void deletestudent(void)
{
FILE *fp, *ft;
fp=fopen("studentDB.txt","r");
if (fp == NULL)
{
printf("file studentDB.txt not opened/found\n");
return;
}
ft=fopen("database.tmp","w");
if (ft == NULL)
{
printf("file database.tmp not opened/created\n");
fclose(fp); /* Close studentDB.txt */
return;
}
/* ... perform copy ops, etc... (Code removed for brevity).*/
fclose(fp);
fclose(ft);
remove("studentDB.txt");
if(!file_exist("studentDB.txt"))
{
/*remove was successful, proceed with rename */
printf("Removal of old studentDB.txt was successful. Renaming\n");
rename("database.tmp","studentDB.txt");
if(!file_exist("database.tmp") && file_exist("studentDB.txt"))
{
printf("Rename of 'database.tmp' to 'studentDB.txt' was successful.\n");
}
else
{
printf("Rename of 'database.tmp' to 'studentDB.txt' FAILED!\n");
}
}
}
int main()
{
deletestudent();
return 0;
}
评论
1赞
melodic_n
9/17/2023
我已经将您的代码实现到我的代码中,它可以工作,但是它没有数据库.tmp没有chane名称,并确保我在末尾添加了printf(“文件未删除”),并在屏幕上显示idk为什么它不断发生
0赞
greg spears
9/17/2023
@melodic_n -- 请尝试在每一步暂停执行(即:system(“pause”) )...在 1.) 之后。打开“数据库.tmp”,(暂停)...和。。。2.) 删除(“学生DB.txt”) (暂停)....3.) 重命名() ...每一步。每次暂停时,请检查文件夹,并确保查看文件是否正在创建、删除、重命名等。在测试代码时,我必须做同样的事情,因为程序以相同的结果开始和结束:只有“studentDB.txt”存在。暂停是我确定程序正常工作的唯一方法......它是如此之快。最好的祝愿,请告诉我们......
0赞
greg spears
9/17/2023
@melodic_n -- 如果 system(pause) 命令不能帮助您找到痛点,那么也许是时候用您最新的代码提出一个新问题了。我相信stackoverflow家族会喜欢再次帮助你,你一直很有礼貌.....
评论
fopen
NULL
rename
remove
remove()