C语言_关于文件内容删除的两个方法总结

最近在写C语言的学生管理系统,遇到了关于怎么直接删除文件内容的问题

我找到了两种方法

  • 第一种是这样

    fp = fopen("users.txt", "r+");
    fp1 = fopen("linshi.txt", "w+");//读写新建一个临时文件
    while (fread(p1, sizeof(Node), 1, fp))//从原文件读一个结点
    {
        if (strcmp(p->denglu.num, p1->denglu.num) != 0)//不是要删除的内容
        {
            fwrite(p1, sizeof(Node), 1, fp1);
        }
    }
    fclose(fp);
    fclose(fp1);
    remove("users.txt");                
    rename("linshi.txt", "users.txt");
    
    • 先打开一个临时文件
    • 遇到需要删除的内容则跳过,否则就把内容从原文件读到临时文件内。
    • 直到文件尾,删除原文件,把临时文件改名为原文件

    优点

    • 我觉得这个的有点就是代码量很短。
    • 好理解

    缺点

    • remove();rename();这两个函数容易出错

    下面是错误代码error

    • EROFS 欲写入的文件为只读文件。
    • EFAULT 参数filename 指针超出可存取内存空间。
    • ENAMETOOLONG 参数filename 太长。
    • ENOMEM 核心内存不足。
    • ELOOP 参数filename 有过多符号连接问题。
    • EIO I/O 存取错误。
  • 第二种是在第一种的基础上改进的

    fp = fopen("uses.txt", "r+");
    fp1 = fopen("linshi.txt", "w+");//读写新建一个临时文件
    while (fread(p1, sizeof(Node), 1, fp))//从原文件读一个结点
    {
        if (strcmp(p->denglu.num, p1->denglu.num) != 0)//不是要删除的内容
        {
            fwrite(p1, sizeof(Node), 1, fp1);
        }
    }
    fclose(fp);
    fclose(fp1);
    
    fp1 = fopen("linshi.txt", "r");
    fp = fopen("users.txt", "w+");//刷新 用户 文件
    while (fread(p1, sizeof(Node), 1, fp1))
    {
        fwrite(p1, sizeof(Node), 1, fp);
    }
    fclose(fp);
    fclose(fp1);
    menu_manager();
    

    优点

    • 就是没有再使用remove();rename();这两个函数,成功率提高了。

    缺点

    • 后面没有删掉linshi.txt这个临时文件。
    • 代码也比之前长了。

猜你喜欢

转载自blog.csdn.net/fqq_5280/article/details/80557911
今日推荐