Hỏi về phần phần đọc file bằng reinterpret_cast<char*>(this)

Bài làm đưới đây của em chạy được rồi nhưng nhiều lúc khi em đọc file từ file ds.txt hoặc em đổi đuôi ds.dat thì con trỏ để đọc file reinterpret_cast lại không biết đọc như nào nên bị sai ạ.
Anh( Chị ) có thể chỉ cách fix giúp em được không ạ?
Nhiều lúc em xóa file đi và cho tạo lại file rồi đọc thì khi được khi không ạ? Em cảm ơn ạ.
Nếu em thay đổi bằng cách đọc từng phần tử thì lại được ạ.
Bên dưới phần comment là đề bài này. Em để dưới đây không topic nó dài. các bạn ngại đọc.

#include<iostream>
#include<fstream>
#include<iomanip>
#include<vector>
#include<cstring>
#include<math.h>
using namespace std;
class Nguoi{
	protected:
		char ten[30], diachi[30], sdt[30];
};
class KhachHang:public Nguoi{
	friend class DanhSach;
	protected:
		int ID;
		static int id;
		char loaikh[30];
	public:
		void Nhap();
		void HienThi();
		void RaFile();
		void DocFile(ifstream &f);
};
int KhachHang::id=10000;
void KhachHang::Nhap(){
	ID=id++;
	fflush(stdin);
	cout<<"Nhap ten: "; cin.getline(ten,30);
	cout<<"Nhap dia chi: "; cin.getline(diachi,30);
	cout<<"Nhap so dien thoai: "; cin.getline(sdt,30);
	cout<<"Nhap loai khach hang: "; cin.getline(loaikh,30);
}
void KhachHang::HienThi(){
	cout<<left<<setw(20)<<ID<<setw(20)<<ten<<setw(20)<<diachi<<setw(20)<<sdt<<setw(20)<<loaikh<<endl;
}
void KhachHang::RaFile(){
	ofstream f("kh.txt",ios::app);
	f.write(reinterpret_cast<const char*>(this), sizeof(KhachHang));
	f.close();
}
void KhachHang::DocFile(ifstream &f){
	f.read(reinterpret_cast<char*>(this), sizeof(KhachHang));
}
class MatHang{
	friend class DanhSach;
	protected:
		int MA;
		static int ma;
		char tenhang[30], nhomhang[30];
		double giaban;
	public:
		void Nhap();
		void HienThi();
		void RaFile();
		void DocFile(ifstream &f);
};
int MatHang::ma=10000;
void MatHang::Nhap(){
	MA=ma++;
	fflush(stdin);
	cout<<"Nhap ten hang: "; cin.getline(tenhang,30);
	cout<<"Nhap nhom hang: "; cin.getline(nhomhang,30);
	cout<<"Nhap gia ban: "; cin>>giaban;
}
void MatHang::HienThi(){
	cout<<left<<setw(20)<<MA<<setw(20)<<tenhang<<setw(20)<<nhomhang<<setw(20)<<giaban<<endl;
}
void MatHang::RaFile(){
	ofstream f("mh.txt",ios::app);
	f.write(reinterpret_cast<const char*>(this), sizeof(MatHang));
	f.close();
}
void MatHang::DocFile(ifstream &f){
	f.read(reinterpret_cast<char*>(this), sizeof(MatHang));
}
class DanhSach{
	protected:
		KhachHang k;
		MatHang m[10];
		int sl,sohang[1000];
	public:
		void Nhap(KhachHang k, vector <MatHang> mathang);
		void HienThi();
		void RaFile();
		void DocFile(ifstream &f);
		char *getTen(){
			return k.ten;
		}
		void getTenmh(vector <DanhSach> ds){
			for(int i=0;i<ds.size();i++){
				for(int j=0;j<ds[i].sl;j++){
					for(int k=j+1;k<ds[i].sl;k++){
						if(strcmp(ds[i].m[j].tenhang, ds[j].m[k].tenhang)>0){
							swap(ds[i].m[j],ds[i].m[k]);
						}
					}
				}
			}
			cout<<left<<setw(20)<<"ten KH"<<setw(20)<<"Ten Hang"<<setw(20)<<"So Hang"<<setw(20)<<"Gia Ban"<<endl;
			for(int i=0; i<ds.size();i++){
				ds[i].HienThi();
			}
		
		}
		void HoaDon(){
			cout<<"=============Bang Gia============="<<endl;
			cout<<left<<setw(20)<<"ten KH"<<setw(20)<<"Ten Hang"<<setw(20)<<"So Hang"<<setw(20)<<"Gia Ban"<<endl;
			int hd=0;
			HienThi();
			for(int i=0;i<sl;i++){
				hd+=sohang[i]*m[i].giaban;
//				m[i].HienThi();
			}
			cout<<"Hoa Don: "<<hd<<endl;
			cout<<"++++++++++++++"<<endl;
		}
};
void DanhSach::Nhap(KhachHang kh, vector <MatHang> mathang){
	cout<<"Nhap cho khach hang "<<kh.ten<<" :"<<endl;
	k=kh;
	do{
		cout<<"Nhap so luong hang: "; cin>>sl;
	}while(sl>10 ||sl<0);
	for(int i=0;i<sl;i++){
//		MatHang m;
		int x, kt=1;
		do{
			cout<<"Nhap ma: "; cin>>x;
		for(int j=0;j<mathang.size();j++){
			if(x==mathang[j].MA){
				kt=0;
				m[i]=mathang[j];
			}
			for(int k=0;k<i;k++){
				if(x==m[k].MA){
					kt=1;
				}
			}
		}
		}while(kt);
		cout<<"Nhap so luong can mua: "; cin>>sohang[i];
	}
}
void DanhSach::HienThi(){
	cout<<left<<setw(20)<<k.ten<<endl;
	for(int i=0;i<sl;i++){
		cout<<left<<setw(20)<<" "<<setw(20)<<m[i].tenhang<<setw(20)<<sohang[i]<<setw(20)<<m[i].giaban<<endl;
	}
	cout<<"++++++++++++++++++++++++++++++++++";
}
void DanhSach::RaFile(){
	ofstream f("ds.txt",ios::app);
	f.write(reinterpret_cast<const char*>(this), sizeof(DanhSach));
	f.close();
}
void DanhSach::DocFile(ifstream &f){
	f.read(reinterpret_cast<char*>(this), sizeof(DanhSach));
}
void menu(){
	int lc;
	vector <KhachHang> kh;
	vector <MatHang> mh;
	vector <DanhSach> ds;
	do{
		cout << "++++++++++++++++++++MEMU+++++++++++++++++++++" << endl;
		cout << "1.Khach Hang" << endl;
		cout << "2.Mat Hang" << endl;
		cout << "3.QLBH" << endl;
		cout << "4.Sx theo ten" << endl;
		cout << "5.Sx theo mat hang " << endl;
		cout << "6.Hoa Don." << endl;
		cin >> lc;
		fflush(stdin);
		switch(lc){
			case 1:{
				int n;
				cout<<"Nhap so khach hang: "; cin>>n;
				while(n--){
					KhachHang k;
					k.Nhap();
					k.RaFile();
				}
				system("cls");
				cout << left << setw(20) << "ID" << setw(20) << "Ten" << setw(20) << "Diachi" << setw(20) << "SDT" << setw(20) << "LoaiKH" << endl;
				ifstream f("kh.txt");
				while(!f.eof()){
					KhachHang k;
					k.DocFile(f);
					
					if(!f.eof()){
						k.HienThi();
						kh.push_back(k);
					}
				}
				f.close();
				break;
			}
			case 2:{
				int n;
				do{
					cout<<"Nhap so luong mat hang: "; cin>>n;
				}while(n<0);
				while(n--){
					MatHang m;
					m.Nhap();
					m.RaFile();
				}
				system("cls");
				cout << left << setw(20) << "MA" << setw(20) << "TenMH" << setw(20) << "NhomHang" << setw(20) << "GiaBan" << endl;
				ifstream f("mh.txt");
				while(!f.eof()){
					MatHang m;
					m.DocFile(f);
					if(!f.eof()){
						m.HienThi();
						mh.push_back(m);
					}
				}
				f.close();
				break;
			}
			case 3:{
//				for(int i=0;i<kh.size();i++){
//					DanhSach d;
//					d.Nhap(kh[i],mh);
//					d.RaFile();
//				}
				
//				system("cls");
//				cout << left << setw(20) << "TenKH" << setw(20) << "Ten Hang" << setw(20) << "So hang" << setw(20) << "Gia ban" << endl;
//				ifstream f("ds.txt");
//				while(!f.eof()){
//					DanhSach d;
//					d.DocFile(f);
//					d.HienThi();
//					if(!f.eof()){
//						d.HienThi();
//						ds.push_back(d);
//					}
//				}
//				f.close();
				system("cls");
				cout << left << setw(20) << "TenKH" << setw(20) << "Ten Hang" << setw(20) << "So hang" << setw(20) << "Gia ban" << endl;
				ifstream f2("ds.txt");
				while(!f2.eof()){
					DanhSach d;
					d.DocFile(f2);
					d.HienThi();
					if(!f2.eof()){
						d.HienThi();
						ds.push_back(d);
						
					}
				}
				f2.close();
				break;
			}case 4:{
				system("cls");
				for(int i=0;i<ds.size()-1;i++){
					for(int j=i+1;j<ds.size();j++){
						if(strcmp(ds[i].getTen(),ds[j].getTen())>0){
							swap(ds[i],ds[j]);
						}
					}
				}
				cout << left << setw(20) << "TenKH" << setw(20) << "Ten Hang" << setw(20) << "So hang" << setw(20) << "Gia ban" << endl;
				for(int i=0;i<ds.size();i++){
					ds[i].HienThi();
				}
				break;
			}case 5:{
				system("cls");
				DanhSach d;
				d.getTenmh(ds);
				break;
			}
			case 6:{
				system("cls");
				for(int i=0;i<ds.size();i++){
					ds[i].HoaDon();
				}
				break;
			}
		}
	}while(lc!=0);
}
int main(){
	menu();
	return 0;
}

Đề SỐ 3: QUẢN LÝ BÁN HÀNG TRONG SIÊU THị

Khai báo lớp Người (Họ tên, Địa chỉ, Số ĐT)

Khai báo lớp Khách hàng kế thừa từ lớp Người và có thêm (mã KH, loại KH), mã KH là một số nguyên có 5 chữ số, tự động tăng. Loại KH có thể là: Mua lẻ hoặc Mua buôn.

Khai báo lớp Mặt hàng gồm các thuộc tính (mã hàng, Tên hàng, Nhóm hàng, Giá bán) – trong đó Nhóm hàng có thể là: Hàng thời trang, Hàng tiêu dùng, Hàng điện máy, Hàng gia dụng. Mã hàng là một số nguyên có 4 chữ số, tự động tăng.

Khai báo lớp Bảng Danh sách mua hàng là bҥn của lớp Khách hàng và lớp Mặt hàng trong đó với mỗi khách hàng, nhập danh sách các mặt hàng và số lѭợng mà khách hàng đó mua. Giả sử mỗi khách hàng không mua quá 10 loại mặt hàng một lần.

Viết chương trình trong ngôn ngữ C++ thực hiện các yêu cầu sau:

  1. Nhập thêm mặt hàng mới vào file MH.DAT. In ra danh sách các mặt hàng đư có trong file.

  2. Nhập thêm khách hàng vào file KH.DAT. In ra danh sách khách hàng đư có trong file.

  3. Lập Bảng danh sách mua hàng cho từng khách hàng, lѭu vào file QLBH.DAT và in danh sách ra màn hình (chú ý: cùng một khách hàng với một mặt hàng thì không thể xuất hiện 2 lần trong bảng này).

  4. Sắp xếp danh sách Bảng danh sách mua hàng đư lѭu trong QLBH.DAT
    a. Theo tên khách hàng
    b. Theo tên mặt hàng

  5. Lập hóa đơn cho mỗi khách hàng.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?