Lỗi ghi đọc file struct!
Em tạo ra một struct CT_HOADON
struct CT_HOADON
{
int MAVT;
int Solg;
float Dongia;
};
Và đây em tạo ra 1 danh sách liên kết đơn của Chi tiết hóa đơn :
struct CT_HD
{
CT_HOADON cthd;
struct CT_HD *next;
};
typedef struct CT_HD * list_CTHD;
Sau đó em tạo tiếp 1 danh sách tuyến tính hóa đơn , trong struct HOADON có chứa con trỏ list_CTHD giống như dưới đây :
struct HOADON
{
int SoHD;
date Ngay;
char Loai;
int MANV;
list_CTHD contro;
};
Danh sách tuyến tính của hóa đơn :
struct list_hd
{
int n;
HOADON hd[300];
};
typedef struct list_hd dshd;
Đây là phần ghi HÓA ĐƠN vào file txt ở dạng nhị phân:
void LuuDs_HD ( list_hd dshd, char *tenfile){
FILE *f;
f= fopen (tenfile, "wb");
if (f==NULL) { printf ("Loi mo file de ghi"); return ; }
for (int i=0; i < dshd.n ; i++)
{
LuuDs_CTHD(dshd.hd[i].contro);
fwrite ((char*)(&dshd.hd[i]), sizeof(HOADON),1,f);
}
fclose(f);
}
Đây là phần đọc HÓA ĐƠN từ file txt ở dạng nhị phân:
void LayDs_HD ( list_hd &dshd, char *tenfile)
{
FILE *f;
f= fopen (tenfile, "rb");
if (f==NULL) { cout<<"
Loi mo file de doc"; return ; }
int i=0;
while ( fread (&dshd.hd[i], sizeof(HOADON),1,f)!=0 ) i++;
fclose(f);
dshd.n=i;
}
Khi em ghi vào thi không báo lỗi nhưng khi đọc file thì , phần con trỏ (cụ thể là list_CTHD contro; trong HOADON ) nó không lấy được dữ liệu ở phần con trỏ trong HOADON , nhiều ngày nay em tìm cách sửa mà chưa được , mong được sự giúp đỡ từ các bạn và các anh chị khắc phục , góp ý giúp em , cảm ơn tất cả mọi người !
Bạn ghi trước rồi đọc phải không?
Bạn thử thêm reference xem sao, có thể nó bị hủy danh sách.
Bạn thử kiểm tra xem khi ra khỏi hàm ghi, con trỏ còn trỏ tới dữ liệu không?
Đúng rồi bạn mình ghi xong rồi mới đọc dữ liệu ra , nhưng khi đọc ra thì chỉ lấy được các giá trị là :
còn dữ liệu con trỏ list_CTHD contro; thì nó không đọc ra được, bị lỗi như hình dưới đây:
Bạn cho mình xem hàm này với
LuuDs_CTHD(dshd.hd[i].contro);
Hàm đó không liên quan đâu bạn ơi , mình dùng test để ghi con trỏ của HOADON ra 1 file khác thôi ,ghi con trỏ như dưới đây khi đọc ra thì không bị lỗi ,nhưng mình muốn ghi toàn bộ hóa đơn có chứa con trỏ xuống 1 file thôi , nếu ghi ra 2 file mình không lấy được chính xác chi tiết hóa đơn của 1 hóa đơn , nên bắt buộc mình phải ghi chung nó lại :
void LuuDs_CTHD (list_CTHD cthd)
{
FILE f;
f= fopen (“CTHOADON.txt”, “a”);
if (f==NULL) { printf (“Loi mo file de ghi”); return ; }
if(cthd != NULL)
{
fwrite ((char)(&cthd), sizeof(CT_HD),1,f);
}
fclose(f);
}