Tôi có 1 cấu trúc dữ liệu như sau:

#define MaxLength 200
//định nghĩa phần tử Sách
struct Sach {
char MaSach[10];//ma sach
char TenSach[50];//ten sach
char LoaiSach[30];//the loai sach
char TenTG[30];//ten tac gia
char NXB[30];//ten nha xuat ban
int NamXB;//nam xuat ban
unsigned Gia;//gia sach
int TTSach;//tinh trang cho muon sach
char NguoiMuon[30];//Ten Nguoi Muon
} SACH;
//định nghĩa phần tử quản lý danh sách Sách
struct Day {
int n;
Sach List[MaxLength];
} A;

Lần đầu ghi dữ liệu vào file f (giả sử) 5 cuốn SACH. Lần sau mở file f ra đọc dữ liệu gán vào dãy A để thực hiện các thao tác xoá, sửa... Nhưng làm sao để gán lại cho file đó?

 

" />
  • Thứ Sáu, 07/05/2010 09:25 (GMT+7)

    Thao tác cấu trúc dữ liệu dạng file

    Câu hỏi :

    Tôi có 1 cấu trúc dữ liệu như sau:

    #define MaxLength 200
    //định nghĩa phần tử Sách
    struct Sach {
    char MaSach[10];//ma sach
    char TenSach[50];//ten sach
    char LoaiSach[30];//the loai sach
    char TenTG[30];//ten tac gia
    char NXB[30];//ten nha xuat ban
    int NamXB;//nam xuat ban
    unsigned Gia;//gia sach
    int TTSach;//tinh trang cho muon sach
    char NguoiMuon[30];//Ten Nguoi Muon
    } SACH;
    //định nghĩa phần tử quản lý danh sách Sách
    struct Day {
    int n;
    Sach List[MaxLength];
    } A;

    Lần đầu ghi dữ liệu vào file f (giả sử) 5 cuốn SACH. Lần sau mở file f ra đọc dữ liệu gán vào dãy A để thực hiện các thao tác xoá, sửa... Nhưng làm sao để gán lại cho file đó?

     



    Trả lời :

    Nếu lập trình bằng C hay C++, bạn có thể dùng các hàm truy xuất file trong thư viện sẵn có "io.h" như open(), read(), write(), close()... để tạo/mở file, đọc/ghi dữ liệu, đóng file... Thí dụ sau đây là chương trình C++ demo việc tạo danh sách 4 Sach rồi lưu nội dung lên file để dùng lại sau:

     //khai báo các thư viện cần dùng
     #include <fcntl.h>
     #include <io.h>
     #include <stdio.h>
     #include <string.h>
     #include <stdlib.h>
     
     #define MaxLength 200
     
     //định nghĩa phần tử Sách
     struct Sach {
     char MaSach[10];//ma sach
     char TenSach[50];//ten sach
     char LoaiSach[30];//the loai sach
     char TenTG[30];//ten tac gia
     char NXB[30];//ten nha xuat ban
     int NamXB;//nam xuat ban
     unsigned Gia;//gia sach
     int TTSach;//tinh trang cho muon sach
     char NguoiMuon[30];//Ten Nguoi Muon
     } SACH;
     
     //định nghĩa phần tử quản lý danh sách Sách
     struct Day {
     int n;
     Sach List[MaxLength];
     } A;
     
     //chương trình demo việc tạo 4 sách và ghi lên file
     void main() {
     int i;
     char sbuf[256];
     int fout;
     //thiết lập số sách
     A.n = 4;
     //thiết lập nội dung từng sách
     for (i=0; i<A.n; i++) {
     //thiết lập nội dung field Masach
     sprintf(sbuf,"%d",i);
     strcpy(A.List[i].MaSach,sbuf);
     //thiết lập nội dung field Tensach
     sprintf(sbuf,"Sach %d",i);
     strcpy(A.List[i].TenSach,sbuf);
     //và các field khác nếu muốn
     }
     //tạo file để lưu thông tin
     if ((fout = open("c:\\mydata.bin",O_WRONLY|O_BINARY|O_CREAT))< 0) {
     printf("Không thể tạo file c:\\mydata.bin\n");
     exit(1);
     }
     //lưu số lượng
     write(fout,&A.n,sizeof(A.n));
     //lưu nội dung từng sách
     for (i=0; i<A.n; i++)
     write(fout,&A.List[i],sizeof(Sach));
     //đóng file lại
     close(fout);
     }
     
     Còn chương trình C++ sau đây sẽ demo việc mở lại file cũ, đọc nội dung vào bộ nhớ, hiệu chỉnh lại theo yêu cầu, ghi kết quả ra file tạm, xóa file cũ rồi rename file tạm thành file gốc ban đầu:
     //khai báo các thư viện cần dùng
     #include <fcntl.h>
     #include <io.h>
     #include <stdio.h>
     #include <string.h>
     #include <stdlib.h>
     
     #define MaxLength 200
     
     //định nghĩa phần tử Sách
     struct Sach {
     char MaSach[10];//ma sach
     char TenSach[50];//ten sach
     char LoaiSach[30];//the loai sach
     char TenTG[30];//ten tac gia
     char NXB[30];//ten nha xuat ban
     int NamXB;//nam xuat ban
     unsigned Gia;//gia sach
     int TTSach;//tinh trang cho muon sach
     char NguoiMuon[30];//Ten Nguoi Muon
     } SACH;
     
     //định nghĩa phần tử quản lý danh sách Sách
     struct Day {
     int n;
     Sach List[MaxLength];
     } A;
     
     //chương trình demo việc đọc file, hiệu chỉnh nội dung và ghi lại
     void main() {
     int i;
     char sbuf[256];
     int fin;
     //1. mở file để đọc lại thông tin
     if ((fin = open("c:\\mydata.bin",O_RDONLY|O_BINARY))< 0) {
     printf("Không thể mở file c:\\mydata.bin\n");
     exit(1);
     }
     //đọc lại số lượng
     read(fin,&A.n,sizeof(A.n));
     //đọc lại nội dung từng sách
     for (i=0; i<A.n; i++)
     read(fin,&A.List[i],sizeof(Sach));
     //đóng file lại
     close(fin);
     
     //2. hiệu chỉnh lại nội dung các sách
     Sach temp;
     //thí dụ hoán vị 2 phần tử 0 và 1
     temp = A.List[0];
     A.List[0] = A.List[1];
     A.List[1] = temp;
     
     //3. ghi nội dung hiệu chỉnh lên file tạm
     int fout;
     if ((fout = open("c:\\temp.bin",O_WRONLY|O_BINARY|O_CREAT))< 0) {
     printf("Không thể tạo file c:\\temp.bin\n");
     exit(1);
     }
     //lưu số lượng
     write(fout,&A.n,sizeof(A.n));
     //lưu nội dung từng sách
     for (i=0; i<A.n; i++)
     write(fout,&A.List[i],sizeof(Sach));
     //đóng file lại
     close(fout);
     //xóa file cũ
     remove("c:\\mydata.bin");
     //rename file tạm thành file gốc
     rename("
    c:\\temp.bin","c:\\mydata.bin");
     }
     

    Chuyên mục: Lập trình