ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++primer 练习8.7和8.8

2022-02-01 19:35:50  阅读:201  来源: 互联网

标签:std si1 include 8.7 8.8 sale item istream primer


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有