Em có đoạn code về chương trình làm danh bạ trong C
Yêu cầu:
nhập file theo cấu trúc đã cho sẵn ( các bác đọc code là hiểu ngay) - danh sách lưu vào file list.txt. - mở lại chương trình vẫn có thể nhập thêm dữ liệu cho file
code đây ạ
#include <stdio.h>
#include <stdlib.h>
typedef struct danhba {
char name[20];
char telephone[20];
char mail[20];
} list;
FILE *f;
list a[100];
void nhapdanhsach(int* n) {
int i,t;
if((f = fopen("list.txt", "w")) == NULL) {
printf("Khong the mo file!\n");
exit(0);
}
printf(" nhap them so nguoi ban muon \n");
scanf("%d",&t);
printf("ok- ban se nhap them %d nguoi \n",t);
*n=*n+t;
__fpurge(stdin);
for(i = *n-t; i <*n; i++) {
printf("Nhap vao nguoi thu %d :\n ", i + 1);
__fpurge(stdin);
printf("Nhap vao ho ten: \n");
gets(a[i].name);
__fpurge(stdin);
printf("Nhap vao sdt: \n");
gets(a[i].telephone);
__fpurge(stdin);
printf("Nhap vao ho mail: \n ");
gets(a[i].mail);
__fpurge(stdin);
fwrite(&a[i], sizeof(list), 1, f);
}
};
void xemdanhsach(FILE *f,int *n) {
int i;
f = fopen("list.txt", "rb");
//doc so nhan vien
fseek(f,0,SEEK_END);
printf("n= %d \n",n);
for(i = 0; i <*n ; i++) {
fread(&a[i], sizeof(list), 1, f);
printf("%s %s %s\n", a[i].name, a[i].telephone,a[i].mail);
}
fclose(f);
};
int main() {
int n=0;
char c;
if(f = fopen("list.txt", "r")) {
fseek(f,0,2);
n=ftell(f)/sizeof(list);
printf("n=%d \n ",n);
rewind(f);
fread(a, sizeof(list), n, f);
fclose(f);
}
while(1) {
printf("------------------------------------------\n");
printf(" Da co %d nguoi trong danh ba\n",n);
printf(" 1.Nhap them danh ba\n");
printf(" 2.Xem danh ba\n");
printf(" 3.Thoat\n");
printf(" Moi ban nhap: \n");
__fpurge(stdin);
scanf("%c",&c);
__fpurge(stdin);
if(c=='1') nhapdanhsach(&n);
else if (c=='2') xemdanhsach(f,&n);
else if (c=='3') break;
else printf("ban da nhap sai-moi nhap lai\n");
}
return 0;
}
Vấn đề em gặp phải:
1.Tại sao em khai báo là
f = fopen("list.txt", "w")
nó vẫn không bị ghi đè mà nó vẫn ghi tiếp?
2.Chương trình phải thoát bằng cách nhấn phím 3 (vì nó sẽ đưa đến câu lệnh break để thoát chương trình) thì nó mới lưu dữ liệu vào file còn nếu thoát bằng cách dùng phím ( X ) trong terminal thì không lưu đc
3.Tại sao nó chạy đúng trong 2 lần mở- đóng chạy chương trình đầu tiên. Còn lại thì nó chỉ lưu 2 phần tử cuối cùng?
các bác xem ảnh là hiểu nhé : xem đến ảnh 3 là các bác hiểu
Ảnh 1
Ảnh 2
Ảnh 3 :vấn đề ở đây đây