sale_item.h
#ifndef sale_item_H_
#define sale_item_H_
#include<iostream>
#include<fstream>
#include<string>
class sale_item;
std::istream& read(std::istream& is , sale_item& si1 );
std::ostream& print(std::ostream& os, const sale_item& si1);
sale_item add(sale_item& lhs, sale_item& rhs);
class sale_item {
friend std::istream& read(std::istream& is, sale_item& si1);
friend std::ostream& print(std::ostream& os, const sale_item& si1);
friend sale_item add(sale_item& lhs, sale_item& rhs);
public:
//委任构造函数
sale_item() = default;
sale_item(const std::string& s1, const unsigned int i, double j) :bookNo(s1) , units_sold(i) , revence(i*j) {}
sale_item(const std::string& s1) :sale_item(s1, 0, 0) { ; }
sale_item(std::istream& is) :sale_item() { read(is , *this ); }
//成员函数
std::string& isbn() { return bookNo; }
sale_item& combin(sale_item&rhs) {
revence += rhs.revence;
units_sold += rhs.units_sold;
return *this;
};
private:
//数据成员
std::string bookNo;
unsigned int units_sold = 0;
double revence = 0.0;
};
inline std::istream& read(std::istream& is, sale_item& si1) {
if (is) {
double Rprice = 0;
is >> si1.bookNo >> si1.units_sold >> Rprice;
si1.revence = si1.units_sold * Rprice;
}
return is;
}
inline std::ostream& print(std::ostream& os, const sale_item& si1) {
if (os) {
os << si1.bookNo << si1.units_sold << si1.revence;
}
return os;
}
inline sale_item add(sale_item& lhs, sale_item& rhs) {
sale_item sum = lhs;
sum.combin(rhs);
return sum;
}
#endif // !sale_item_H_
8,7.cpp
//8.6 重写7.1.1节的书店程序,从一个文件中读取交易记录。将文件名作为一个参数传递给main。
//8.7 修改上一节的书店程序,将结果保存到一个文件中。将输出文件名作为第二个参数传递给main函数。
//8.8 修改上一题的程序,将结果追加到给定的文件末尾。
//对同一个输出文件,运行程序至少两次,检验数据是否得以保留。(担心最开始是空文件的情况)
#include <iostream>
#include <fstream>
#include <string>
#include "sale_item.h"
int main(int argc, char** argv)
{
//std::cout << argv[1] << std::endl;
//std::cout << argv[2] << std::endl;
int i = 0;
std::ifstream ifs(argv[1]);
std::ofstream ofs(argv[2],std::ofstream::app);//在这里对8.7节的程序进行了修改
//运行成功
sale_item total(ifs);
if (ifs && ofs) {
if (!total.isbn().empty())
{
sale_item trans;
while (read(ifs, trans))
{
if (total.isbn() == trans.isbn())
{
total.combin(trans);
}
else
{
print(ofs, total);
ofs << std::endl;
total = trans;
}
}
print(ofs, total);
std::cout << std::endl;
return 0;
}
else
{
std::cerr << "No data?!" << std::endl;
return -1; // indicate failure
}
}
}
终端运行命令
?
|