cin按ctrl+d结束流的输入后,程序自动退出的问题解决办法

 

今天写程序,主程序和ADDBOOK中都有cin的while循环,发现按ctrl+d或ctrl+z都会全部退出两个while循环!!

 

解决方法:

 

http://codingforums.com/showthread.php?t=167731

Yes you can flush the user input.

Code:


    cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());

 

就完美解决了,呵呵!!

 

证明还是不太清楚啊。。。。。

 

void main()
{   
    /*µÚÒ»²¿·Ö£¬Ó¦¸Ãд³öÒ»¸ö»¶Ó­½çÃæ*/
   
    FunctionWelcome();

    InitBookInfo();

    int funChoose =0;
    while(cin>>funChoose)
    {
        switch(funChoose)
        {
        case FUN_BORROW:
            //µ÷Óù¦ÄÜÄ£¿é1.ͼÊé½èÔÄ
            FunctionBorrow();
            system("cls");
            FunctionWelcome();
            break;

        case FUN_QUERY:
            //µ÷Óù¦ÄÜÄ£¿é2.ͼÊé²éѯ
            FunctionQuery();
            system("cls");
            FunctionWelcome();
            break;
           
        case FUN_ADDUSER:
            FunctionAddUser();
            system("cls");
            FunctionWelcome();
            break;

        case FUN_ADDBOOK:
            FunctionAddBook();
            //system("cls");
            FunctionWelcome();
            //funChoose=10;
            break;
        case FUN_EXIT:
            //µ÷Óù¦ÄÜÄ£¿é0.Í˳ö±¾ÏµÍ³
            exit(0);
            break;
        default:
            system("cls");
            cout<<"ÄúÊä´íÁ˰ɣ¿"<<endl;           
            FunctionWelcome();
            break;
        }
    }
}

 

int FunctionAddBook()
{    cout<<"¹¦ÄÜ"<<FUN_ADDBOOK<<".Ìí¼ÓͼÊé"<<endl;
    cout<<"coming soon!(2010-9-17)"<<endl;

    FunctionTestBookInfo("BookInfo.Dat");

    char fileName[30];

    ofstream outstuf;        //

    cout<<"Please input the name of BookInfo file(Default BookInfo.dat):/n";

    cin>>fileName;

    outstuf.open(fileName, ios::out);

    if(!outstuf)
    {
        cerr<<"File could not be open."<<endl;
        abort();
    }

    outstuf<<"This is a file of Books Information/n";

    cout<<"Input the BookId, BookName, and BookNum:(Enter Ctrl-Z to end input)/n?";

    int BookId;
    char BookName[40];
    int BookNum;     //ͼÊéĿǰ¿É½èÔÄÊýÁ¿

    cout<<"ÇëÊäÈ룺/tBookId/tBookName/tBookNum(ÒÔ¿Õ¸ñ¼ä¸ñ)"<<endl;
   
    int i=0;
   
    while(cin>>BookId >> BookName >> BookNum)
    {
        int exist=0;//ͼÊé´æÔÚ·ñ£¬Ä¬ÈÏΪ²»´æÔÚ
        for(i=0; i<=bookIdTotal; i++)
        {
            //Èç¹ûÊäÈëµÄͼÊéIDÊÇ´æÔڵģ¬ÄÇô£¬¾Í±íÃ÷Óû§ÊÇÏëÐ޸ĸÃͼÊéµÄÐÅÏ¢
            if(m_bookInfo[i].BookId==BookId)
            {
                exist=1;
                cout<<"BookId="<<m_bookInfo[i].BookId<<".["<<m_bookInfo[i].BookName<<"]"<<"µÄÐÅÏ¢½«ÒªÐ޸ģ¬È·¶¨Âð£¿"<<endl;
                char judge;//ÅжÏÊÇ·ñÒªÐÞ¸Ä
                cin>>judge;
                if('y'==judge || 'Y'== judge)
                {
                    strcpy(m_bookInfo[i].BookName,BookName);
                    m_bookInfo[i].BookNum=BookNum;
                    cout<<"Ð޸ijɹ¦!"<<endl;
                }
                else
                {
                    cout<<"ûÓÐÐÞ¸Ä!"<<endl;
                }
            }
        }
        //Èç¹ûÇ°ÃæÃ»ÓÐÈκÎÒ»±¾Í¼ÊéIDÏàͬ£¬Ôò×·¼ÓÒ»Ìõ¼Ç¼£¡
        if(!exist)
        {
            bookIdTotal++;
            cout<<"ûÓвéÕÒµ½¼º´æÔڵļǼ!Ìí¼Óµ½BookInfo.datÎļþµÄδβ!"<<endl;
            m_bookInfo[bookIdTotal].BookId=BookId;
            strcpy(m_bookInfo[bookIdTotal].BookName,BookName);
            m_bookInfo[bookIdTotal].BookNum=BookNum;
        }
    }

    /*
    int BookId;
    char BookName[40];
    int BookNum;     //ͼÊéĿǰ¿É½èÔÄÊýÁ¿
    */
    cout<<"ÊäÈë½áÊø£¬ÏÂÃæ°Ñm_bookInfo[100]ÖеÄÊý¾ÝдÈë:"<<fileName<<endl;
    for(i=0 ; i<=bookIdTotal; i++)
    {
        cout<<"дÈë:"<<m_bookInfo[i].BookId<<endl;
        cout<<m_bookInfo[i].BookId<<' '<<m_bookInfo[i].BookName
            <<' '<<m_bookInfo[i].BookNum<<'/n';
        outstuf<<m_bookInfo[i].BookId<<' '<<m_bookInfo[i].BookName
            <<' '<<m_bookInfo[i].BookNum<<'/n';
    }
   
    outstuf.close();
   
    cout<<"Ìí¼Ó½áÊø!ÏÖÔÚ¼ì²éÎļþÊäÈëÇé¿ö!"<<endl;
    FunctionTestBookInfo(fileName);
   
    cout<<"°´ÈÎÒâ¼ü£¬»Ø³µ£¬·µ»ØÖ÷³ÌÐò!"<<endl;

    //cin.clear();
    //cin.setstate()
    //cin.setstate(cin.good());
    //cin.setstate(ios::)
   
    cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());

    int wait;
    cin>>wait;
    cout<<wait<<endl;
    return 0 ;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值