最近在写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这个临时文件。
- 代码也比之前长了。