编程语言
首页 > 编程语言> > C++primer 练习8.7和8.8

C++primer 练习8.7和8.8

作者:互联网

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
        }
    }
}

终端运行命令

 

标签:std,si1,include,8.7,8.8,sale,item,istream,primer
来源: https://blog.csdn.net/m0_60974765/article/details/122765537