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;
}
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?