实现一个医院排版系统(小item)&& 对getline()函数的深入理解

(学习)用C++实现一个小型的排班系统
话不多说 直接上代码:




#include <iostream>
#include <stdlib.h>
#include <iomanip>              //设置流操作符
#include <fstream>      
#include<istream>   //getline函数会用到
#include<string>



//文件流操作
using namespace std;

class ABC {                        //类HIS
private:
    string name;                   //姓名
    string roster;                 //排班
    string department;             //科室
public:
   ABC();                          //构造函数
    char inter_face();             //首页
    void add_person();             //添加医生
    void del_person();             //删除医生
    void show_all();               //显示所有医生
    void alter();                  //修改信息
    void select();                 //查询医生
    void save_new();               //保存新增加的医生
};
ABC::ABC() {
    name = "\0";
    roster = "\0";
    department = "\0";
}



//首页
char ABC::inter_face() {            //实现首界面的函数
    system("cls");                 //清屏操作
    cout << endl;
    cout
        << "    ._________________________.    " << endl
        << "    | _______________________ |    " << endl
        << "    | I                     I |    " << endl
        << "    | I   ABC医院管理系统   I |    " << endl
        << "    | I_____________________I |    " << endl
        << "    !_________________________!    " << endl
        << "   (1) 添加医生          " << endl
        << "   (2) 删除医生            " << endl
        << "   (3) 显示医生            " << endl
        << "   (4) 修改信息            " << endl
        << "   (5) 查询医生            " << endl
        << "   (6) 关闭系统            " << endl
        << endl
        << "    选择 :";
    char choose;
    cin >> choose;
    return choose;
}





void ABC::add_person() {                       //类外定义添加医生函数

    cout << "请输入新医生信息" << endl;
    cout << "姓名 : ";
    cin >> name;
    cout << "科室 : ";
    cin >> department;
    cout << "排班 : ";
    cin >> roster;
    save_new();
    cout << "新信息已经保存!" << endl;
    system("pause");
}



void ABC::del_person() {                    //类外定义删除医生函数
    string sign, str1, str;                             //定义字符串
    bool flag = true;                                 //布尔型变量初始为真
    cout << "你要删除输入姓名或科室号 :" << endl;        //输入要查找的相关信息
    cin >> sign;
    ofstream outData("temp.txt", ios::out);    //磁盘文件的输出
    ifstream inData("pHIS.txt", ios::in);     //输入
    if (!outData || !inData) {                   //判断
        cout << "对不起,找不到文件!" << endl;
        system("pause");
    }
    while (inData >> name >> department) {                //将数组或字符输入indata
        getline(inData, str);                           //接收一个字符串
        if ((sign == name) || (sign == department)) {            //存在此医生
            cout << "你想删除的医生:" << endl;
            cout << str1 << endl;
            cout << setiosflags(ios::left) << setw(17) << name << " " << department << str << endl;        //左对齐
            flag = false;
            break;
        }
        outData << setiosflags(ios::left) << setw(17) << name << " " << department << str << endl;
    }

    if (flag) {
        cout << endl << "系统中不存在!" << endl << endl;
    }
    else {
        while (getline(inData, str)) {
            outData << str << endl;
        }
        outData.close();
        inData.close();
        ofstream out("pHIS.txt", ios::out);
        ifstream in("temp.txt", ios::in);
        if (!out || !in) {
            cout << endl << "对不起不能打开文件!" << endl << endl;
            system("pause");
            return;
        }
        while (getline(in, str)) {
            out << str << endl;
        }
        out.close();                //文件流关闭
        in.close();
        cout << endl << "信息已中删除!" << endl << endl;
    }
    system("pause");
}





void ABC::show_all() {       //显示所有医生
                            //类外定义显示所有医生函数
    ifstream inData("pHIS.txt", ios::in);
    if (!inData) {
        cout << endl << "对不起,没有找到文件!" << endl;
        system("pause");
        return;
    }
    bool flag = true;
    string record;
    while (getline(inData, record)) {
        if (flag) {
            cout << endl << "所有医生信息如下: \n" << endl;
        }
        cout << " 姓名\t\t" << "科室\t\t" << "排班\t\t" << endl;
        cout << record << endl;
        flag = false;
    }
    if (flag) {
        cout << endl << "你的HIS医院管理系统中没有医生!" << endl << endl;
    }
    else {
        cout << endl << "所有医生已经全部显示!" << endl << endl;
    }
    system("pause");
}




//修改信息
void ABC::alter() {              //类外定义显示信息函数
    ofstream outData("temp.txt", ios::out);
    ifstream inData("pHIS.txt", ios::in);
    if (!outData || !inData) {          //任意为假值运行
        cout << endl << "找不到文件!" << endl;
        system("pause");
        return;
    }
    string sign;
    cout << endl << "你要修改输入姓名或科室号 :";
    cin >> sign;
    bool flag = true;
    string str;
    while (inData >> name >> department) {
        getline(inData, str);
        if ((sign == name) || (sign == department)) {
            cout << endl << "你想修改的医生:" << endl << endl;
            cout << setiosflags(ios::left) << setw(17) << name << " " << department << str << endl;
            cout << endl << "请修改信息 : " << endl;
            cout << "姓名 :";
            cin >> name;
            cout << "科室 :";
            cin >> department;
            cout << "排班 :";
            cin >> roster;
            save_new();
            flag = false;
            break;
        }
        outData << setiosflags(ios::left) << setw(17) << name << " " << department << str << endl;
    }
    if (flag) {
        cout << endl << "医系统中不存在!" << endl;
    }
    else {
        while (getline(inData, str)) {
            outData << str << endl;
        }
        outData.close();
        inData.close();
        ofstream out("pHIS.txt", ios::out);
        ifstream in("temp.txt", ios::in);
        if (!out || !in) {
            cout << endl << "对不起不能打开文件!!!" << endl;
            system("pause");
            return;
        }
        while (getline(in, str)) {
            out << str << endl;
        }
        out.close();
        in.close();
        cout << "已修改!!!" << endl;
    }
    system("pause");
}



//查询医生
void ABC::select() {        //类外定义查询医生函数
    ifstream inData("pHIS.txt", ios::in);
    if (!inData) {
        cout << endl << "文件找不到!" << endl;
        system("pause");
        return;
    }
    string sign;
    cout << endl << "输入你想查找的医生的姓名或科室: ";
    cin >> sign;
    bool flag = true;
    string str;
    while (inData >> name >> department) {
        getline(inData, str);
        if ((name == sign) || (department == sign)) {
            cout << endl << "你要查找的医生是: " << endl << endl;
            cout << setiosflags(ios::left) << setw(17) << name << department << str << endl;
            flag = false;
            //system("pause");
        }
    }
}



void ABC::save_new() {                       //类外定义保存医生函数
    ofstream outData("pHIS.txt", ios::app);
    if (!outData) {
        cout << "对不起,打开文件失败!" << endl;
        system("pause");
        return;
    }
    outData << setiosflags(ios::left) << setw(17) << name << " " << setw(16) << department << " " << setw(20) << roster << endl;
    outData.close();
}
enum power { a1 = '1', a2 = '2', a3 = '3', a4 = '4', a5 = '5', a6 = '6' };

int main() {
    char choose;
    HIS song;
    while (choose = song.inter_face()) {
        switch (choose) {
        case a1:
            song.add_person();//添加医生
            break;
        case a2:
            song.del_person();//删除医生
            break;
        case a3:
            song.show_all();//显示所有医生
            break;
        case a4:
            song.alter();//修改信息
            break;
        case a5:
            song.select();//查询医生
            break;
        case a6:
            cout << endl << "谢谢使用!" << endl << endl;
            exit(0);
            break;
        default:
            break;
        }
    }
    return 0;
}
在这里插入代码片

补充关于 getline() 和 get() 函数

为了能读取一行字符串输入,cin 提供了一些面向行的类成员函数:getline() 和 get()。这两个函数都读取一行输入,直到到达换行符。然而,随后 getline() 会丢弃换行符,而 get() 将换行符保留在输入序列中。下面详细介绍它们,首先介绍 getline()。


*面向行的输入:istream& getline(char p, int n, char c)

getline() 函数读取整行,它使用通过回车键输入的换行符来确定输入结尾。要调用这种方法,可以使用 cin.getline()
该函数有两个参数。第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数量。
如果参数是 20,那么最多可以读取 19 个字符,余下的空间用于存储自动在结尾处添加的空字符。如果在读取 n-1 个字符之前遇到终止字符(第三个参数不写,默认为 ‘\n’ ),则提前结束。getline() 成员函数在读取指定数目的字符或遇到换行符时停止读取。

getline(cin, inputLine),其中 cin 是正在读取的输入流,而 inputLine 是接收输入字符串的 string 变量的名称。需要注意的是,它不是类方法。


*面向行的输入:istream & get(char p, int n, char c)

另一个名为 get() 的成员函数,该函数有几种变体。其中一种变体的工作方式和 getline() 类似,它们接受的参数相同,解释参数的方式也相同,并且都读取到行尾。
情况1:当输入的字符数小于 n 时遇到终结符,get() 并不再读取并丢弃终结符,而是将其留在输入队列中。而 getline 函数将读取这个字符但是不存进 p 所指的数组中,而是将其丢弃。当然,两者都会在读取的字符串后面自动加上 ‘\0’。假设我们连续两次调用 get():

cin.get(name, Asize);
cin.get(dessert, Asize);    //dessert没有内容
在这里插入代码片

由于第一次调用后,换行符将留在输入队列中,因此第二次调用时看到第一个字符便是换行符。因此 get() 认为已到达行尾,而没有发现任何可读取的内容。如果不借助于帮助,get() 将不能跨过该换行符。这时可以使用 get() 的另一种变体。使用不带任何参数的 cin.get() 调用可读取下一个字符(即使是换行符)。

cin.get(name, Asize);
cin.get();
cin.get(dessert, Asize);
在这里插入代码片

另一种使用get()函数的方法是将两个类成员函数拼接起来:

cin.get(name, Asize).get();
在这里插入代码片

之所以可以这样做,是由于 cin.get(name, Asize) 返回一个 cin 对象,该对象随后将被用来调用 get() 函数。同样,下面的语句将输入中连续的两行分别读入到数组 name1 和数组 name2 中,其效果与两次调用 cin.getline() 相同:

cin.getline(name1, Asize).getline(name2, Asize);
在这里插入代码片
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.liang呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值