原来的代码截图发在下面了,要求就是增加将信息(客户、书本信息)从文件中读取,最后结果(订单信息)再写入到文件中去。请问这一步要怎么操作。平台不给一次把所有代码全发出来,放在百度网盘了。
3条回答 默认 最新
- 技术专家团-小桥流水 2022-05-18 11:54关注
代码需要做一些修改,还需要定义一个订单结构体。
因为读文件需要跟写文件配合使用,否则格式不一致会导致读取失败,所以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; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥20 机器学习能否像多层线性模型一样处理嵌套数据
- ¥20 西门子S7-Graph,S7-300,梯形图
- ¥50 用易语言http 访问不了网页
- ¥50 safari浏览器fetch提交数据后数据丢失问题
- ¥15 matlab不知道怎么改,求解答!!
- ¥15 永磁直线电机的电流环pi调不出来
- ¥15 用stata实现聚类的代码
- ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
- ¥20 docker里部署springboot项目,访问不到扬声器
- ¥15 netty整合springboot之后自动重连失效