C.Primer.Plus(第六版)第17章 编程练习

//17_1
//main.cpp
#include <iostream>
using namespace std;

char temp;
int count = 0;
int main()
{
    cout<<"please enter some character:";
    cin>>temp;
    while(temp != '$')
    {
        count++;
        cin>>temp;
    }
    cout<<"the count value is: "<<count<<endl;
    return 0;
}
//17_2
//main.cpp
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
using namespace std;
int main(int argc,char* argv[])
{
    if(argc != 2)
    {
        cout<<"parameter don't match,error!";
        exit(EXIT_FAILURE);
    }
    string str;
    ofstream fout(argv[1]);
    while(getline(cin,str))
        fout<<str<<endl;
    fout.close();
    return 0;
}
//17_3
//main.cpp
#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>

int main(int argc,char* argv[])
{
    using namespace std;
    if(argc != 3)
    {
        cout<<"parameter don't match,ERROR!"<<endl;
        exit(EXIT_FAILURE);
    }
    ifstream fin(argv[1]);
    ofstream fout(argv[2]);
    string str;
    while(getline(cin,str))
        fout<<str<<endl;
    fin.close();
    fout.close();
    return 0;
}
//17_4
#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>

int main(int argc,char* argv[])
{
    using namespace std;
    if(argc != 4)
    {
        cout<<"parameter don't match,ERROR!";
        exit(EXIT_FAILURE);
    }
    ifstream fin_one(argv[1]);
    ifstream fin_two(argv[2]);
    ofstream fout(argv[3]);
    string str1,str2;
    while(!fin_one.eof() && !fin_two.eof() && getline(fin_one,str1) &&getline(fin_two,str2))
        fout<<str1<<" "<<str2<<endl;
    while(getline(fin_one,str1))
        fout<<str1<<endl;
    while(getline(fin_two,str2))
        fout<<str2<<endl;
    fin_one.close();
    fin_two.close();
    fout.close();
    return 0;
}
//17_5
#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>
#include <list>
#include <algorithm>
using namespace std;
const int COUNT = 30;
int main(int argc,char* argv[])
{

    if(argc !=  4)
    {
        cout<<"parameter don't match!";
        exit(EXIT_FAILURE);
    }
    ifstream fin_one(argv[1]);
    ifstream fin_two(argv[2]);
    ofstream fout(argv[3]);
    string str;
    list<string> listmat;
    list<string> listpat;
    list<string> listmerge(COUNT);
    while(getline(fin_one,str))
        listmat.push_back(str);
    while(getline(fin_two,str))
        listpat.push_back(str);
    listmat.sort();
    cout<<"Mat:\n";
    for each(string var in listmat)
        cout<<"\t"<<var<<endl;
    cout<<"\n";
    listpat.sort();
    cout<<"Pat:\n";
    for each(string var in listpat)
        cout<<"\t"<<var<<endl;
    cout<<"\n";

    merge(listmat.begin(),listmat.end(),listpat.begin(),listpat.end(),listmerge.begin());
    listmerge.unique();
    cout<<"Merge:\n";
    for each(string var in listmerge)
        fout<<"\t"<<var<<endl;
    fin_one.close();
    fin_two.close();
    fout.close();
    return 0;
}
//17_6
//main.cpp
#include "emp.h"

const char *FileName = "1.txt";  

int main()  
{  
    std::ifstream fin;  

    do  
    {  
        fin.clear();  
        fin.open(FileName);  
        if (fin.is_open())  
        {  
            std::cout << "当前文件" << FileName << "内容: \n";  
            int count = 0;  
            std::string str;  
            while (std::getline(fin, str))  
            {  
                abstr_emp *ptr = NULL;  
                if (str == "1")  
                {  
                    std::string fname, lname, job;  
                    std::getline(fin, fname);  
                    std::getline(fin, lname);  
                    std::getline(fin, job);  

                    ptr = new employee(fname, lname, job);  
                    ptr->ShowAll();  
                }  
                else if (str == "2")  
                {  
                    std::string fname, lname, job, inchargeof;  
                    std::getline(fin, fname);  
                    std::getline(fin, lname);  
                    std::getline(fin, job);  
                    std::getline(fin, inchargeof);  

                    ptr = new manager(fname, lname, job, atoi(inchargeof.c_str()));  
                    ptr->ShowAll();  
                }  
                else if (str == "3")  
                {  
                    std::string fname, lname, job, reportsto;  
                    std::getline(fin, fname);  
                    std::getline(fin, lname);  
                    std::getline(fin, job);  
                    std::getline(fin, reportsto);  

                    ptr = new fink(fname, lname, job, reportsto);  
                    ptr->ShowAll();  
                }  
                else  
                {  
                    std::string fname, lname, job, inchargeof, reportsto;  
                    std::getline(fin, fname);  
                    std::getline(fin, lname);  
                    std::getline(fin, job);  
                    std::getline(fin, inchargeof);  
                    std::getline(fin, reportsto);  

                    ptr = new highfink(fname, lname, job, reportsto, atoi(inchargeof.c_str()));  
                    ptr->ShowAll();  
                }  
                std::getline(fin, str);  
            }  
            fin.close();  
        }  

        std::ofstream fout(FileName, std::ios::out | std::ios::app);  
        if (!fout.is_open())  
        {  
            std::cerr << "Can't open " << FileName << " file for output.\n";  
            exit(EXIT_FAILURE);  
        }  

        abstr_emp *ptr = NULL;  
        std::cout << "选择要生成的类型:\n";  
        std::cout << "1、employee\t2、manager\n3、fink\t4、highfink\n";  
        int ans;  
        std::cin >> ans;  
        std::cin.get();  
        switch (ans)  
        {  
        case 1:  
            ptr = new employee;  
            break;  
        case 2:  
            ptr = new manager;  
            break;  
        case 3:  
            ptr = new fink;  
            break;  
        case 4:  
            ptr = new highfink;  
            break;  
        default:  
            break;  
        }  
        ptr->SetAll();  
        ptr->WriteAll(fout);  

        char ch;  
        std::cout << "继续?<y/n>: ";  
        std::cin >> ch;  
        std::cin.get();  
        if (ch == 'n')  
            break;  
    } while (true);  

    fin.close();  
    return 0;  
}  
//emp.cpp  
#include "emp.h"  

abstr_emp::abstr_emp() : fname("NULL"), lname("NULL"), job("NULL")  
{  
}  

abstr_emp::abstr_emp(const std::string & fn, const std::string & ln, const std::string & j) : fname(fn), lname(ln), job(j)  
{  
}  

abstr_emp::abstr_emp(const abstr_emp & e) : fname(e.fname), lname(e.lname), job(e.job)  
{  
}  

void abstr_emp::ShowAll() const  
{  
    std::cout << "fname: " << GetFname() << std::endl;  
    std::cout << "lname: " << GetLname() << std::endl;  
    std::cout << "job: " << GetJob() << std::endl;  
}  

void abstr_emp::SetAll()  
{  
    SetFname();  
    SetLname();  
    SetJob();  
}  
void abstr_emp::WriteAll(std::ofstream & of)
{
    of<<GetFname()<<std::endl<<GetLname()<<std::endl<<GetJob()<<std::endl<<std::endl;
}  
std::ostream &operator<<(std::ostream &os, const abstr_emp &e)  
{  
    os << e.fname << ", " << e.lname << ", " << e.job;  
    return os;  
}  

abstr_emp::~abstr_emp()  
{  
}  

employee::employee() : abstr_emp()  
{  
}  

employee::employee(const std::string & fn, const std::string & ln, const std::string & j) : abstr_emp(fn, ln, j)  
{  
}  

void employee::ShowAll() const  
{  
    abstr_emp::ShowAll();  
}  

void employee::SetAll()  
{  
    abstr_emp::SetAll();  
}  

void employee::WriteAll(std::ofstream & of)
{
    of<<"1"<<std::endl;
    of<<GetFname()<<std::endl<<GetLname()<<std::endl<<GetJob()<<std::endl<<std::endl;
}  
manager::manager() : abstr_emp()  
{  
    inchargeof = 0;  
}  

manager::manager(const std::string & fn, const std::string & ln, const std::string & j, int ico) : abstr_emp(fn, ln, j)  
{  
    inchargeof = ico;  
}  

manager::manager(const abstr_emp & e, int ico) : abstr_emp(e)  
{  
    inchargeof = ico;  
}  

manager::manager(const manager & m) : abstr_emp((const abstr_emp &)m)  
{  
    inchargeof = m.inchargeof;  
}  

void manager::ShowAll() const  
{  
    abstr_emp::ShowAll();  
    std::cout << "inchargeof: " << InChargeOf() << std::endl;  
}  

void manager::SetAll()  
{  
    abstr_emp::SetAll();  
    SetInChargeOf();  
}  

void manager::WriteAll(std::ofstream & of)
{
    of<<"2"<<std::endl;
    of<<GetFname()<<std::endl<<GetLname()<<std::endl<<GetJob()<<std::endl<<inchargeof<<std::endl<<std::endl;
}  

fink::fink() : abstr_emp()  
{  
    reportsto = "NULL";  
}  

fink::fink(const std::string & fn, const std::string & ln, const std::string & j, const std::string & rpo) : abstr_emp(fn, ln, j)  
{  
    reportsto = rpo;  
}  

fink::fink(const abstr_emp & e, const std::string & rpo) : abstr_emp(e)  
{  
    reportsto = rpo;  
}  

fink::fink(const fink & e) : abstr_emp((const abstr_emp &)e)  
{  
    reportsto = e.reportsto;  
}  

void fink::ShowAll() const  
{  
    abstr_emp::ShowAll();  
    std::cout << "reportsto" << ReportsTo() <<  std::endl;  
}  

void fink::SetAll()  
{  
    abstr_emp::SetAll();  
    SetReportsto();  
}  

void fink::WriteAll(std::ofstream & of)
{
    of<<"3"<<std::endl;
    of<<GetFname()<<std::endl<<GetLname()<<std::endl<<GetJob()<<std::endl<<reportsto<<std::endl<<std::endl;
}  

highfink::highfink() : abstr_emp(), manager(), fink()  
{  
}  

highfink::highfink(const std::string & fn, const std::string & ln, const std::string & j, const std::string & rpo, int ico) : abstr_emp(fn, ln, j), manager(fn, ln, j, ico), fink(fn, ln, j, rpo)  
{  
}  

highfink::highfink(const abstr_emp & e, const std::string & rpo, int ico) : abstr_emp(e), manager(e, ico), fink(e, rpo)  
{  
}  

highfink::highfink(const fink & f, int ico) : abstr_emp((const abstr_emp &)f), manager((const abstr_emp &)f, ico), fink(f)  
{  
}  

highfink::highfink(const manager & m, const std::string & rpo) : abstr_emp((const abstr_emp &)m), manager(m), fink((const abstr_emp &)m, rpo)  
{  
}  

highfink::highfink(const highfink & h) : abstr_emp((const abstr_emp &)h), manager((const manager &)h), fink((const fink &)h)  
{  
}  

void highfink::ShowAll() const  
{  
    abstr_emp::ShowAll();  
    std::cout << "inchargeof: " << InChargeOf() << std::endl;  
    std::cout << "reportsto: " << ReportsTo() << std::endl;  
}  

void highfink::SetAll()  
{  
    abstr_emp::SetAll();  
    manager::SetInChargeOf();  
    fink::SetReportsto();  
}  

void highfink::WriteAll(std::ofstream & of)
{
    of<<"4"<<std::endl;
    of<<GetFname()<<std::endl<<GetLname()<<std::endl<<GetJob()<<std::endl<<InChargeOf()<<std::endl<<ReportsTo()<<std::endl<<std::endl;
}  
//emp.h  
#ifndef EMP_H_  
#define EMP_H_  

#include <iostream> 
#include <fstream>
#include <string>  

class abstr_emp  
{  
private:  
    std::string fname;  
    std::string lname;  
    std::string job;  
protected:  
    const std::string &GetFname() const{ return fname; }  
    const std::string &GetLname() const { return lname; }  
    const std::string &GetJob() const { return job; }  
    void SetFname() { std::cout << "Input Fname: "; std::getline(std::cin, fname); }  
    void SetLname() { std::cout << "Input Lname: "; std::getline(std::cin, lname); }  
    void SetJob() { std::cout << "Input Job: "; std::getline(std::cin, job); }  
public:  
    abstr_emp();  
    abstr_emp(const std::string &fn, const std::string &ln, const std::string &j);  
    abstr_emp(const abstr_emp &e);  
    virtual void ShowAll() const;  
    virtual void SetAll(); 
    virtual void WriteAll(std::ofstream & of);
    friend std::ostream &operator<<(std::ostream &os, const abstr_emp &e);  
    virtual ~abstr_emp() = 0;  
};  

class employee : public abstr_emp  
{  
public:  
    employee();  
    employee(const std::string &fn, const std::string &ln, const std::string &j);  
    ~employee() {}  
    virtual void ShowAll() const;  
    virtual void SetAll();  
    virtual void WriteAll(std::ofstream & of);
};  

class manager : virtual public abstr_emp  
{  
private:  
    int inchargeof;  
protected:  
    int InChargeOf() const { return inchargeof; }  
    int &InChargOf() { return inchargeof; }  
    void SetInChargeOf() { std::cout << "Input InChargeOf: "; std::cin >> inchargeof; std::cin.get(); }  
public:  
    manager();  
    manager(const std::string &fn, const std::string &ln, const std::string &j, int ico = 0);  
    manager(const abstr_emp &e, int ico);  
    manager(const manager &m);  
    ~manager() {}  
    virtual void ShowAll() const;  
    virtual void SetAll();  
    virtual void WriteAll(std::ofstream & of);
};  

class fink : virtual public abstr_emp  
{  
private:  
    std::string reportsto;  
protected:  
    const std::string ReportsTo() const { return reportsto; }  
    std::string &ReportsTo() { return reportsto; }  
    void SetReportsto() { std::cout << "Input reportsto: "; std::getline(std::cin, reportsto); }  
public:  
    fink();  
    fink(const std::string &fn, const std::string &ln, const std::string &j, const std::string &rpo);  
    fink(const abstr_emp &e, const std::string &rpo);  
    fink(const fink &e);  
    ~fink() {}  
    virtual void ShowAll() const;  
    virtual void SetAll(); 
    virtual void WriteAll(std::ofstream & of);
};  

class highfink : public manager, public fink  
{  
public:  
    highfink();  
    highfink(const std::string &fn, const std::string &ln, const std::string &j, const std::string &rpo, int ico);  
    highfink(const abstr_emp &e, const std::string &rpo, int ico);  
    highfink(const fink &f, int ico);  
    highfink(const manager &m, const std::string &rpo);  
    highfink(const highfink &h);  
    ~highfink() {}  
    virtual void ShowAll() const;  
    virtual void SetAll();  
    virtual void WriteAll(std::ofstream & of);
};  

#endif  
//17_7
#include <iostream>  
#include <fstream>  
#include <string>  
#include <vector>  
#include <algorithm>  
#include <cstdlib>

void ShowStr(const std::string & str)
{
    std::cout<<str<<std::endl;
}
class Store
{
    std::ofstream & of;
public:
    Store(std::ofstream &out):of(out) {}
    void operator()(const std::string &str)
    {
         size_t len = str.size();           
        of.write((char*)&len, sizeof(std::size_t));    
        of.write(str.data(), len);     
    }
};

void GetStrs(std::ifstream &is, std::vector<std::string> &vec)  
{  
   size_t len;     
    while (is.read((char *)&len, sizeof(size_t)))  
    {   循环次数为目标文件中需恢复的数据长度
        char *st = new char[len];  
        is.read(st, len);   
        st[len + 1] = '\0';    
        vec.push_back(st);  
    }  
}  
//该程序以二进制打开文件,并使用read()和write()来完成I/O.
int main()  
{  
    using namespace std;  
    vector<string> vostr;  
    string temp;  

    cout << "Enter strings (empty line to quit):\n";  
    while (getline(cin, temp) && temp[0] != '\0')  
        vostr.push_back(temp);  
    cout << "Here is your input.\n";  
    for_each(vostr.begin(), vostr.end(), ShowStr);  

    ofstream fout("strings.txt", ios_base::out | ios_base::binary);  
    for_each(vostr.begin(), vostr.end(), Store(fout));  
    fout.close();  

    vector<string> vistr;  
    ifstream fin("strings.txt", ios_base::in | ios_base::binary);  
    if (!fin.is_open())  
    {  
        cerr << "Could not open file for input.\n";  
        exit(EXIT_FAILURE);  
    }  
    GetStrs(fin, vistr);  
    cout << "\nHere are the strings read form the file:\n";  
    for_each(vistr.begin(), vistr.end(), ShowStr);  

    return 0;  
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值