#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char num[10]; char pwd[20]; } Denglu; typedef struct { char name[20]; int age; Denglu denglu; } Node; int main() { Node* p = (Node*)malloc(sizeof(Node)); Node* p1 = (Node*)malloc(sizeof(Node)); FILE* fp; FILE* fp1; 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"); free(p); free(p1); return 0; }
时间: 2024-01-17 10:05:04 浏览: 68
这段代码是一个从文件中删除指定用户的程序。程序的大致思路是,从文件中读取一个结构体,判断是否是要删除的用户,如果不是则将该结构体写入另一个文件中,最后删除原文件并将新文件重命名为原文件名。
不过在实现上存在一些问题。比如,在 while 循环中,每次读取的结构体是 p1,但是判断的却是 p。因此,需要将 p1 的内容赋值给 p,才能正确判断是否是要删除的用户。
另外,在写入新文件时,应该使用追加模式 "a+",而不是写模式 "w+"。因为写模式会先清空文件再写入,这样会导致文件中原有的数据全部丢失。
最后,需要注意的是,在写文件前需要将文件指针移到文件起始位置,否则会导致写入的数据覆盖文件中原有的数据。
以下是修改后的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char num[10];
char pwd[20];
} Denglu;
typedef struct {
char name[20];
int age;
Denglu denglu;
} Node;
int main() {
Node* p = (Node*)malloc(sizeof(Node));
Node* p1 = (Node*)malloc(sizeof(Node));
FILE* fp;
FILE* fp1;
fp = fopen("users.txt", "r+");
fp1 = fopen("linshi.txt", "a+");
while (fread(p1, sizeof(Node), 1, fp)) {
if (strcmp(p->denglu.num, p1->denglu.num) != 0) {
fwrite(p1, sizeof(Node), 1, fp1);
}
else {
printf("Delete user: %s\n", p1->denglu.num);
}
}
fseek(fp1, 0, SEEK_SET);
fseek(fp, 0, SEEK_SET);
while (fread(p1, sizeof(Node), 1, fp1)) {
fwrite(p1, sizeof(Node), 1, fp);
}
fclose(fp);
fclose(fp1);
remove("users.txt");
rename("linshi.txt", "users.txt");
free(p);
free(p1);
return 0;
}
```
阅读全文