30/09/2018, 17:52

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 !

Minh Hoàng viết 20:02 ngày 30/09/2018

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.

void LuuDs_HD ( list_hd &dshd, char *tenfile)

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?

Hau Trung viết 19:52 ngày 30/09/2018

Đú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à :

 int SoHD;
	date Ngay;
	char Loai;
	int MANV; 

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:

Minh Hoàng viết 20:02 ngày 30/09/2018

Bạn cho mình xem hàm này với LuuDs_CTHD(dshd.hd[i].contro);

Hau Trung viết 20:04 ngày 30/09/2018

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);
}

Bài liên quan
0