如何在C语言中删除/修改文件

how to delete / modify a file in c

提问人:melodic_n 提问时间:9/16/2023 更新时间:9/16/2023 访问量:72

问:

在我的项目“学生管理系统”中,我有两个功能要求我创建一个临时文件,将原始文件的内容复制到其中,除了我要修改或删除的那一行,然后删除旧文件并将临时文件(.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");

}

我想确保每次我调用这些函数时一切正常,无论我使用多少次

C 函数

评论

2赞 Jean-François Fabre 9/16/2023
检查所有操作系统返回代码。更重要的是可以返回(你没有检查输出,当检查输入时,如果它不存在,你除了打印之外什么都不做),可以返回非零,所以可以。是的,您需要在重命名之前删除fopenNULLrenameremove
5赞 Clifford 9/16/2023
您需要发布出现问题的确切代码。这显然不是,因为调用被注释掉了。此外,如果你想让别人阅读你的代码,那么让它可读,并按惯例(而不是随机)缩进符合你的利益。remove()
1赞 Clifford 9/16/2023
作为一般原则,给定两个文件 A 和 T(临时),您可以考虑:将 A 重命名为 B,将 T 重命名为 A,删除 B。这样,在出现故障或停电的情况下,您就不会丢失数据,并且可以使用 B 进行恢复。当然,在下一个操作之前检查每个操作是否成功。
0赞 Clifford 9/16/2023
此代码不会删除旧文件,您已将其注释掉。如果这是您正在运行的实际代码(而不是您描述的代码),那么显然这就是为什么它仅适用于迭代 - studentDB.txt 尚不存在的迭代。您不能将文件重命名为现有名称!
0赞 Basile Starynkevitch 9/16/2023
在多处理系统(例如Linux)上,另一个进程可以(原则上)重命名或覆盖文件。

答:

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家族会喜欢再次帮助你,你一直很有礼貌.....