原来的代码截图发在下面了,要求就是增加将信息(客户、书本信息)从文件中读取,最后结果(订单信息)再写入到文件中去。请问这一步要怎么操作。平台不给一次把所有代码全发出来,放在百度网盘了。
代码需要做一些修改,还需要定义一个订单结构体。
因为读文件需要跟写文件配合使用,否则格式不一致会导致读取失败,所以main函数的代码中先创建了用户和书籍实例后,先写入了文件,然后又从文件中读取的,注释写的很详细。
另外,main函数不能放在.h文件中,需要单独写一个cpp文件。
buy.h修改如下:
#ifndef _BUY_H_
#define _BUY_H_
#include <iostream>
#include <string>
using namespace std;
//定义客户类型
enum class eGuestType // 在高版本VS中,需要用enum class,在低版本的vs中,直接用enum也可以
{
e_member,
e_honour,
e_layfolk
};
class buyer
{
protected:
string name;
int buyerId;
string address;
double pay;
eGuestType type; //添加这个字段
public:
buyer();
buyer(string n, int b, string a,double p);
string getbuyname();
int getid();
string getaddress();
double getpay();
virtual void setpay(double p= 0) = 0;
eGuestType gettype();//添加这个函数
};
eGuestType buyer::gettype()
{
return type;
}
class member :public buyer
{
int leagure_grad;
public:
member(string n, int b, int l, string a, double p) :buyer(n, b, a, p)
{
leagure_grad = l;
type = eGuestType::e_member; //添加这个设置
}
void setleaguregrad(int l) { leagure_grad = l; }
int getleaguregrad() { return leagure_grad; }
void display();
void setpay(double p);
};
class honoured_guest :public buyer
{
double discount_rate;
public:
honoured_guest(string n, int b, double r, string a, double p) :buyer(n, b, a, p)
{
discount_rate = r;
type = eGuestType::e_honour;//添加这个设置
}
void setrate(double r) { discount_rate = r; }
double getrate() { return discount_rate; }
void display();
void setpay(double p);
};
class layfolk :public buyer
{
public:
layfolk(string n, int b, string a, double p) :buyer(n, b, a, p)
{
type = eGuestType::e_layfolk;
}
void display();
void setpay(double p);
};
buyer::buyer()
{
name = " ";
buyerId = 0;
address = " ";
pay = 0;
type = eGuestType::e_layfolk;//添加这个设置
}
buyer::buyer(string n, int b, string a, double p)
{
name = n;
buyerId = b;
address = a;
pay = p;
type = eGuestType::e_layfolk;//添加这个设置
}
double buyer::getpay()
{
return pay;
}
string buyer::getaddress()
{
return address;
}
string buyer::getbuyname()
{
return name;
}
int buyer::getid()
{
return buyerId;
}
void member::display()
{
cout << "购书人姓名:" << name << endl;
cout << "购书人编号:" << buyerId << endl;
cout << "购书人地址:" << address << endl;
cout << "购书人为会员,级别:" << leagure_grad << endl;
}
void member::setpay(double p)
{
if (leagure_grad == 1)
pay = 0.95 * p + pay;
else if (leagure_grad == 2)
pay = 0.9 * p + pay;
else if (leagure_grad == 3)
pay = 0.85 * p + pay;
else if (leagure_grad == 4)
pay = 0.8 * p + pay;
else if (leagure_grad == 5)
pay = 0.7 * p + pay;
else
cout << "级别错误!";
}
void honoured_guest::display()
{
cout << "购书人姓名:" << name << endl;
cout << "购书人编号:" << buyerId << endl;
cout << "购书人地址:" << address << endl;
cout << "购书人为贵宾!折扣率为:" << discount_rate << endl;
}
void honoured_guest::setpay(double p)
{
pay = pay + (1 - discount_rate) * p;
}
void layfolk::display()
{
cout << "购书人姓名:" << name << endl;
cout << "购书人编号:" << buyerId << endl;
cout << "购书人地址:" << address << endl;
cout << "购书人为普通人" << endl;
}
void layfolk::setpay(double p)
{
pay = pay + p;
}
#endif
book.h修改如下:
#ifndef _BOOK_H_
#define _BOOK_H_
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
class book
{
protected:
string book_ID;
string book_name;
string auther;
string publishing;
double price;
public:
book();
book(string b_id, string b_n, string au, string pu, double pr);
void display();
string getbook_ID();
string getbook_name();
string getauther();
string getpublishing();
double getprice();
};
book::book()
{
book_ID = " ";
book_name = " ";
auther = " ";
publishing = " ";
price = 0;
}
book::book(string b_id, string b_n, string au, string pu, double pr)
{
book_ID = b_id;
book_name = b_n;
auther = au;
publishing = pu;
price = pr;
}
string book::getbook_ID()
{
return book_ID;
}
string book::getbook_name()
{
return book_name;
}
string book::getauther()
{
return auther;
}
string book::getpublishing()
{
return publishing;
}
double book::getprice()
{
return price;
}
void book::display()
{
cout << "书号:" << book_ID << endl;
cout << "书名:" << book_name << endl;
cout << "作者:" << auther << endl;
cout << "出版社:" << publishing << endl;
cout << "定价:" << price << endl;
}
#endif
main.cpp文件:
#define _CRT_SECURE_NO_WARNINGS 1
#include "book.h"
#include "buy.h"
//定义订单类,这里规定用户ID和书籍ID都是唯一的,根据用户ID可以从用户信息数组中查找到完整的用户信息,书籍类似
struct Dingdan
{
int buyerid;//用户id
int count; //购买数量
string bookid[20]; //保存购买的书籍id
};
int main()
{
int i = 0, buyerid, flag;
book* bs[10]; //存储书籍
int nmb_bs = 0;//书籍数量
buyer* gu[10]; //存储用户
int nmb_gu = 0; //用户数量
//生成顾客实例对象
member* b1 = new member("张三",1001,1,"幸福家园1-101",33.3);
honoured_guest* b2 = new honoured_guest("李四", 1002, 0.8, "田园山庄2-301", 44.4);
layfolk* b3 = new layfolk("王五", 1003, "龙兴园3-303", 55.4);
//生成书籍对象
book* k1 = new book("isbn1001", "钢铁冶炼", "小刚", "浩方出版社", 55.5);
book* k2 = new book("isbn1002", "兴趣培养", "李有才", "清华出版社", 66.5);
//将用户信息写入文件
ofstream ofsb;
ofsb.open("guest.txt", ios::out);
//写入会员数据
ofsb << "1 " << b1->getid() << " " << b1->getbuyname() << " " << b1->getaddress() << " " << b1->getpay() <<" "<<b1->getleaguregrad() << endl;
//写入贵宾
ofsb << "2 " << b2->getid() << " " << b2->getbuyname() << " " << b2->getaddress() << " " << b2->getpay() << " " << b2->getrate() << endl;
//写入普通人
ofsb << "3 " << b3->getid() << " " << b3->getbuyname() << " " << b3->getaddress() << " " << b3->getpay() << endl;
ofsb.close();
//将书籍信息写入文件
ofstream ofsk;
ofsk.open("book.txt", ios::out);
ofsk << k1->getbook_ID() << " " << k1->getbook_name() << " " << k1->getauther() << " " << k1->getpublishing() << " " << k1->getprice() << endl;
ofsk << k2->getbook_ID() << " " << k2->getbook_name() << " " << k2->getauther() << " " << k2->getpublishing() << " " << k2->getprice() << endl;
ofsk.close();
//读取文件
//1.读取用户信息
ifstream ifsb;
ifsb.open("guest.txt", ios::in);
if (!ifsb.is_open())
{
cout << "用户文件打开失败" << endl;
return 0;
}
while (!ifsb.eof())
{
int t=0, level=0,id=0;
double rate=0,pay=0;
string name = "", ad = "";
ifsb >> t; //读取类型
if (t == 1) //读取会员书籍
{
ifsb >> id >> name >> ad >> pay >> level;
if (id > 0) //验证读取成功
{
gu[nmb_gu] = new member(name, id, level,ad,pay);
nmb_gu++;
}
}
else if (t == 2) //读取贵宾书籍
{
ifsb >> id >> name >> ad >> pay >> rate;
if (id > 0)
{
gu[nmb_gu] = new honoured_guest(name, id, rate, ad, pay);
nmb_gu++;
}
}
else if (t == 3)
{
ifsb >> id >> name >> ad >> pay;
if (id > 0)
{
gu[nmb_gu] = new layfolk(name, id, ad, pay);
nmb_gu++;
}
}
}
ifsb.close();
//显示读取的用户信息
for (int i = 0; i < nmb_gu; i++)
{
if (gu[i]->gettype() == eGuestType::e_member)
{
member* p = (member*)gu[i];
p->display();
}
else if (gu[i]->gettype() == eGuestType::e_honour)
{
honoured_guest* p = (honoured_guest*)gu[i];
p->display();
}
else if (gu[i]->gettype() == eGuestType::e_layfolk)
{
layfolk* p = (layfolk*)gu[i];
p->display();
}
}
//2.读取书籍信息
ifstream ifsk;
ifsk.open("book.txt", ios::in);
if (!ifsk.is_open())
{
cout << "用户文件打开失败" << endl;
return 0;
}
while (!ifsk.eof())
{
string id="", name="", au="", pub="";
double price=0;
ifsk >> id >> name >> au >> pub >> price;
if (!id.empty())
{
bs[nmb_bs] = new book(id, name, au, pub, price);
nmb_bs++;
}
}
ifsk.close();
//显示书籍信息
for (int i = 0; i < nmb_bs; i++)
bs[i]->display();
//处理订单
Dingdan dd[10];
//用户1买了1本书
dd[0].buyerid = b1->getid();
dd[0].count = 1;
dd[0].bookid[0] = k1->getbook_ID();
//用户2买了2本数
dd[1].buyerid = b2->getid();
dd[1].count = 2;
dd[1].bookid[0] = k1->getbook_ID();
dd[1].bookid[1] = k2->getbook_ID();
//订单写入文件
ofstream ofsdd;
ofsdd.open("dingdan.txt", ios::out);
for (int i = 0; i < 2; i++)
{
//写入用户id和书籍数量
ofsdd << dd[i].buyerid << " " << dd[i].count << " ";
//写入书籍id
for (int j = 0; j < dd[i].count; j++)
{
if (j < dd[i].count - 1)
ofsdd << dd[i].bookid[j] << " ";
else
ofsdd << dd[i].bookid[j] << endl;
}
}
ofsdd.close(); //写入完毕
return 0;
}
这个很简单啊,只需要读取word中的代码然后再创建时间的代码文件就行
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!